【问题标题】:ansible-playbook command line pass ip address for a host groupansible-playbook 命令行传递主机组的 IP 地址
【发布时间】:2016-09-27 07:49:27
【问题描述】:

我正在为我的项目设置 Ansible 动态清单配置。当发生 AWS 自动缩放事件时,会向 Jenkins(通过 Ansible 管理构建过程)发出请求以触发在新添加的服务器上的构建。

由于动态清单使用基于标签的方法,自动缩放事件会添加新服务器并触发构建。但是,在所有服务器上都会触发新构建,因为旧服务器和新添加的服务器中都存在相同的标签。

我正在采取的解决方法是在参数化构建过程中将公共 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 地址。

有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

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

    但是,如果您不能轻松地使您的 Ansible 角色具有幂等性,并且只想在创建新实例时定位它们,那么 Ansible 已经公开了此功能,可以使用 --limit argument 限制您定位的实例。

    所以你最好把你的脚本改成这样:

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

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

    【讨论】:

      猜你喜欢
      • 2022-06-28
      • 2021-01-18
      • 1970-01-01
      • 2020-04-22
      • 1970-01-01
      • 1970-01-01
      • 2013-12-09
      • 2019-11-08
      • 2015-08-20
      相关资源
      最近更新 更多