首页 文章

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

提问于
浏览
2

我正在为我的项目设置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 回答

  • 0

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

    但是,如果您无法轻松地使您的Ansible角色具有幂等性,并且只想在创建新实例时将其作为目标,则Ansible已经公开了此功能,以使用--limit argument限制您定位的实例 .

    因此,您最好将脚本更改为以下内容:

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

    如果设置了 ${public_ip} ,那么它将仅将其限制为该单个IP地址,从而仅限该实例 . 如果未设置,则空白 --limit 等同于运行整个库存 .

相关问题