我正在为我的项目设置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包含在这个组中 . 如果涉及更多主机,我应该能够在同一命令中传递多个组及其相应的IP地址 .
有任何想法吗?
1 回答
理想情况下,您的剧本应该是完全幂等的,以便每次启动新实例时对整个主机组运行不仅是非破坏性的,而且是可取的,因为它可以防止这些实例的配置漂移(来自人们手动更改盒子上的东西) ) .
但是,如果您无法轻松地使您的Ansible角色具有幂等性,并且只想在创建新实例时将其作为目标,则Ansible已经公开了此功能,以使用--limit argument限制您定位的实例 .
因此,您最好将脚本更改为以下内容:
如果设置了
${public_ip}
,那么它将仅将其限制为该单个IP地址,从而仅限该实例 . 如果未设置,则空白--limit
等同于运行整个库存 .