具有静态清单的 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.yml
和 provision_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 您想要的组。
我正在使用 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.yml
和 provision_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 您想要的组。