ansible-playbook命令行传递主机组的{IP}地址

时间:2016-05-29 11:36:50

标签: amazon-web-services amazon-ec2 ansible ansible-playbook autoscaling

我正在为我的项目设置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地址。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

理想情况下,您的剧本应该是完全幂等的,以便每次启动新实例时对整个主机组运行不仅具有非破坏性,而且是可取的,因为它可以防止这些实例的配置漂移(来自人们手动更改的东西)在盒子上)。

但是,如果您不能轻易地使您的Ansible角色具有幂等性,并且只是想在创建新实例时将其定位,那么Ansible已经公开了使用--limit argument限制您定位的实例的能力。 / p>

因此,您可能最好将脚本更改为类似的内容:

ansible-playbook -i inventories/demo --limit=${public_ip} api.yml

如果设置了${public_ip},那么它将仅限于该单个IP地址,因此仅限于该实例。如果未设置,则空白--limit相当于运行整个广告资源。