具有静态清单的 Ansible EC2

Ansible EC2 with a static inventory

我正在使用 ansible 在 EC2 上配置服务器,使用动态清单和 exact_count。这让我可以在需要时扩展 up/down,这很好。

现在,我需要在配置服务器时向每台服务器上的环境添加一个唯一变量。我想到的一种方法是使用这样的清单文件:

[ec2-servers]
host1 myvar=abc
host2 myvar=def
...

其中 host1(2) 通过 tag_SomeName_host1 或类似方式以某种方式引用相关的 EC2 实例。

但这与我当前配置服务器的方式无关。 exact_count 的动态清单为我提供了一组相同的克隆服务器。

有没有一种方法可以在我的清单文件中定义服务器,如果它不存在,可以在 ec2 中提供它,如果服务器存在于 ec2 但清单中不存在,则将其删除?

例如

我运行我的剧本第一次带盘点:

[ec2-servers]
host1 myvar=1

然后我需要扩大规模,所以编辑库存:

[ec2-servers]
host1 myvar=1
host2 myvar=2

ansible 忽略 host1,因为它已经存在,然后为 host2 提供一个实例。

然后我不再需要额外的服务器所以修改库存:

[ec2-servers]
host1 myvar=1

ansible 从 ec2 中删除 host2。

没有。 Ansible 不 [关心]:

  • 维护库存文件的修订历史
  • 每有变化就比较
  • 根据检测到的变化有条件地执行playbooks/plays/tasks。

您需要自己在剧本中构建逻辑。

类似 my_playbook.yml:

- hosts: to_be_provisioned
  tasks:
  - include: provision_ec2_host.yml

- hosts: to_be_unprovisioned
  tasks:
  - include: unprovision_ec2_host.yml

unprovision_ec2_host.ymlprovision_ec2_host.yml 当然应该是幂等的。

现在您需要确保您的清单在主机组 to_be_provisioned & to_be_unprovisioned 和 运行 my_playbook.yml.[=19= 下具有正确的主机集]

$ cat inventory.ini
[to_be_provisioned]
host1 myvar=1

[to_be_unprovisioned]
host2 myvar=2

$ ansible-playbook -i inventory.ini my_playbook.yml
$ # modify inventory
$ cat inventory.ini
[to_be_provisioned]
host1 myvar=1
host2 myvar=2

# [to_be_unprovisioned] -- no hosts

$ ansible-playbook -i inventory.ini my_playbook.yml
$ # modify inventory
$ cat inventory.ini
[to_be_provisioned]
host1 myvar=1

[to_be_unprovisioned]
host2 myvar=2

$ ansible-playbook -i inventory.ini my_playbook.yml

最后,要自动完成这一切,您可以使用 dynamic inventory。我建议只复制现有的 ec2.py 并对其进行修改,以便 returns 您想要的组。