我被困住了。用网络搜索地狱,无法找到答案。
我多年来一直在使用Ansible,但总是使用静态库存。为了区分不同的环境(如分段和生产),我分别使用了不同的静态清单文件staging
和production
。当我需要配置登台服务器时,我会这样做:
ansible-playbook site.yml -i staging
当我想为制作做同样的事情时,我会这样做:
ansible-playbook site.yml -i production
分段和制作都需要具有不同值的变量,因此我有group_vars/staging
和group_vars/production
。一切都很好,并根据最佳实践。
现在,我需要在AWS中配置EC2实例。我正在使用this AWS guide。我有一个有两个剧本的剧本。第一个是针对localhost
运行,在AWS中创建/查找所需的EC2实例,并使用add_host
填充组。第二个游戏使用该组来对抗在第一个游戏中发现的EC2实例。全部根据该指南。
除了一件事,这一切都很有效。我不知道如何指定要配置的环境,因此未从group_vars/(staging|production)
加载所需的变量。基本上,我想要的是与-i (staging|production)
类似的东西,这些年我用静态库存,但似乎现在使用-i
没有意义,因为库存是动态的。我想要一种能够根据我运行时传递给group_vars/staging
的参数从group_vars/production
或ansible-playbook
加载变量的方法。
我该怎么做?什么是最佳做法?
答案 0 :(得分:4)
虽然我不确定如何使用ansible EC2 moduel,因为我们不使用它来从ansible级别构建盒子,但有一种简单的方法可以通过ec2 external inventory script和简单的设置来获得你想要的东西你的inventories/main
。您需要做的是在ec2.py
内设置ec2.ini
和inventories
,以便将其用作实例来源。请务必取消注释group_by_tag_keys = True
内的ec2.ini
。
下一步是区分哪个实例去哪里。虽然ec2.py
中有许多选择方法,但我更倾向于相应地标记每个实例。所以我的所有实例都有一个名为environment
的标签,它被相应地填充(在你的情况下,它将是分段或生产)。然后剩下的就是在inventories/main
内处理它,这里有一个小例子如何做。
首先,您必须为要使用的标签定义空组:
[tag_environment_staging]
[tag_environment_production]
所以我们以后可以参考它们。之后剩下要做的就是将这些组指定为适当阶段的子组。所以在那之后我们的最小文件将是这样的:
[tag_environment_staging]
[tag_environment_production]
[staging:children]
tag_environment_staging
[production:children]
tag_environment_production
你去吧。从现在开始,通过环境标记附带的动态库存脚本从ec2中提取的每个实例都将与group_vars
中的相应配置相匹配。所有你必须记住,在处理动态库存时,你希望-i
点在inventories
目录而不是特定文件,以使其正常工作。
答案 1 :(得分:2)
我对动态库存有类似的问题,但对于Openstack。到目前为止我提出的解决方案是使用环境变量来指定我是否要定位登台或生产环境。它也适用于您的情况。在我们的设置中,$OS_PROJECT_NAME
是stage
或prod
。在ansible.cfg
设置
inventory = ./inventories/${OS_PROJECT_NAME}/openstack.py
然后我们在
下面有特定于环境的组变量inventories/(stage|prod)/group_vars/
缺点是您必须将库存脚本放在两个位置或使其符号链接。请注意,相对于playbook目录找到的group_vars仍会覆盖库存group_vars。