我正在为我的项目设置Ansible动态库存配置。发生AWS自动调节事件时,会向Jenkins发送请求(通过Ansible管理构建过程)以触发新添加的服务器上的构建。
由于动态库存使用基于标记的方法,因此自动调节事件会添加新服务器并触发构建。但是,所有服务器都会触发全新构建,因为新旧服务器中都存在相同的标记。
我要解决的方法是在参数化构建过程中将public ip参数传递给Jenkins。然后,可以使用此公共IP来决定两个Ansible命令之一:
if ["x$public_ip" == "x"] then
ansible-playbook -i inventories/demo api.yml
else
ansible-playbook -i $public_ip, api.yml
第一个命令将主要指示Ansible在带有标记的所有服务器上运行构建过程。
从第二个命令我想告诉ansible它应该只在新添加的服务器上运行构建。我的api.yml文件看起来像
---
- hosts: apiservers
sudo: yes
roles:
- common
现在我应该能够告诉主持人' apiservers'是指,或者基本上是该组中包含的所有IP。如果涉及更多主机,我应该能够通过shell传递多个组及其相应IP地址。
有什么想法吗?
答案 0 :(得分:0)
理想情况下,您的剧本应该是完全幂等的,以便每次启动新实例时对整个主机组运行不仅具有非破坏性,而且是可取的,因为它可以防止这些实例的配置漂移(来自人们手动更改的东西)在盒子上)。
但是,如果您不能轻易地使您的Ansible角色具有幂等性,并且只是想在创建新实例时将其定位,那么Ansible已经公开了使用--limit
argument限制您定位的实例的能力。 / p>
因此,您可能最好将脚本更改为类似的内容:
ansible-playbook -i inventories/demo --limit=${public_ip} api.yml
如果设置了${public_ip}
,那么它将仅限于该单个IP地址,因此仅限于该实例。如果未设置,则空白--limit
相当于运行整个广告资源。