Ansible Dynamic Inventory
Ansible 在使用的过程中,如果机器数量比较固定,且变更不多的情况下,可在 /etc/ansible/hosts 文件里面配置固定的组合机器IP, 并给他起组的别名,执行 Ansible 脚本便可以通过别名找到相应的机器。
1 | [webservers] |
假如你有很多台机器,且机器经常变更导致IP时常变换,你还想把IP逐个写入 /etc/ansible/hosts 就不现实了。你也许会问,若不把 IP 写进 /etc/ansible/hosts,那不是没法用 Ansible 指挥这些机器?
感谢 Ansible Dynamic Inventory, 如果我们能通过编程等手段获取变更机器的IP,我们还是有办法实现的。
Dynamic Inventory 的原理
- 通过编程的方式,也就是动态获取机器的 json 信息;
- Ansible 通过解析这串 json 字符串;
1 | ansible -i yourprogram.py -m raw -a 'cd /home' |
Ansible Dynamic Inventory 对程序返回的 json 的转义是这样的:
1 | {"devtest-asg": {"hosts": ["172.31.21.164"], "vars": {"ansible_ssh_port": 12306}}} |
翻译一下就是 /etc/ansible/hosts 中的:
1 | [devtest-asg] |
一个实战的例子
官方文档对 Inventory 仅作概念性描述,阅读完后仍是一头雾水,不知如何下手。 让我们用一个例子来豁然开朗吧。 我们使用 AWS 的 AutoScaling Group,以下简称 ASG,ASG 会在某种自定义的条件下会自动开启和关闭机器,这给我们在辨别IP,定位机器的时候造成困扰。因此我们需要 Ansible Dynamic Inventory
我们使用 AWS 的 boto 库来获取 ASG 的实例信息.以下程序(get_host.py)中要实现的方法就是列出返回机器信息的 json 串。
1 | #!/usr/bin/env python |
执行以下命令就可以愉快地使用 Ansible 了,其中 devtest-asg 是 ASG 的别名:
1 | ansible -i get_host.py devtest-asg -m raw -a 'ls /' |