我正在移植一些使用静态库存的自动化脚本来使用dynamic库存(每个环境都有一个AWS Cloudformation堆栈,每次我们重新创build一个堆栈时,更新静态文件似乎很愚蠢)。
每个堆栈和一堆工作节点都有一个主节点。 为了区分剧本中的主人或工作人员,我使用自定义标记(例如tag_node_type_master或tag_node_type_worker )作为主机组(并使用--limit tag_env_XXX限制为一个特定的环境)。
问题出现在我需要让工作节点知道哪个是主节点的时候。 目前有一个模板引用静态定义的variables与主节点的私有DNS名称,这不是一个可以接受的选项了。
我正在尝试在master_node: {{tag_node_type_master[0]}}的variables部分做一些事情master_node: {{tag_node_type_master[0]}} (select该主机组的第一个,也是唯一的元素),但是这不起作用(它说variables是未定义的,这是有道理的,因为它不是一个variables,而是一个主机组)。
我不是Ansible的专家,但我对AWS和其他configurationpipe理系统非常熟悉。 我会build议这样做:
1)您可以通过CloudFormation模板( http://is.gd/6cmsRt )中的实例UserData属性将主节点私有IP地址或DNS名称传递给EC2实例。 如果你想使它更通用,我会把一个私有的ELB放在你的主节点的前面,这样当实例被重新启动时,你不必处理IP地址或DNS名称的改变。 CloudFormation有可用的内在函数Fn::GetAtt ,您可以使用它获取这些参数( http://is.gd/slXkIE )。
2)我将通过UserData保存这样的参数作为Ansible本地事实(Ansible> = 1.3, http ://is.gd/QdZrUm)。 UserData的片段:
FACTS=/etc/ansible/facts.d/preferences.fact echo [MasterNode] > $FACTS echo Elb={ "Fn::GetAtt" : [ "MasterELB", "DNSName" ]} >> $FACTS echo Dns={ "Fn::GetAtt" : [ "MasterInstance", "PrivateDnsName" ]} >> $FACTS echo Ip={ "Fn::GetAtt" : [ "MasterInstance", "PrivateIp" ]} >> $FACTS
3)我会在你的手册中使用这种自定义的本地事实
{{ ansible_local.preferences.MasterNode.Elb }} {{ ansible_local.preferences.MasterNode.Dns }} {{ ansible_local.preferences.MasterNode.Ip }}
这不是一个完整的解决scheme。 你仍然需要一个程序来引导EC2实例,创build事实目录等。我使用了与SaltStack类似的过程,它运行良好。 任何意见都欢迎。