Я начал изучать и использовать ansible для настройки своих промежуточных и производственных серверов. Одна вещь, которую я хотел бы сделать, это настроить / etc / hosts через файл инвентаризации.
Кажется, что это возможно. Вот одно из таких применений: https://gist.github.com/rothgar/8793800
Однако я немного неравнодушен к Ansible и не понимаю. Может кто-нибудь объяснить на простом английском, как я заставляю его работать на практике?
Например, если мой инвентарный файл содержит.
[compute]
1.2.3.4
5.6.7.8
[db]
2.3.4.5
6.7.8.9
10.11.12.13
[all]
compute
db
[all:vars]
...
Я хотел бы со всей определенностью сказать, что мой файл hosts после запуска playbook содержал
2.3.4.5 db1
6.7.8.9 db2
10.11.12.13 db3
1.2.3.4 compute1
5.6.7.8 compute2
Это возможно?
Вы можете генерировать записи о хостах из шаблона. Прокрутите список групп, отбросьте группы вроде all
и ungrouped
, а затем перебрать список хостов в каждой группе:
{# this loops over the list of groups. inside the loop #}
{# "group" will be the group name and "hosts" will be the #}
{# list of hosts in that group. #}
{% for group,hosts in groups.items() %}
{# skip the "all" and "ungrouped" groups, which presumably #}
{# you don't want in your hosts file #}
{% if group not in ["ungrouped", "all"] %}
{# generate a hosts entry for each host, using the "loop.index" #}
{# variable and the group name to generate a unique hostname. #}
{% for host in hosts %}
{{host}} {{group}}{{loop.index}}
{% endfor %}
{% endif %}
{% endfor %}
Вышеуказанное использует {{host}}
для IP-адреса, потому что это позволяет мне протестировать его в моей системе, но вы, вероятно, предпочтете {{hostvars[host]['ansible_default_ipv4']['address']}}
в реальной среде, если вы не уверены, что вы всегда используете IP-адреса в своем инвентаре.
В файле инвентаря:
[myhosts]
192.168.29.2 host_name=host1
192.168.29.3 host_name=host2
В playbook.yaml
- name: Update /etc/hosts from inventory
lineinfile: dest=/etc/hosts regexp='.*{{item}}$' line='{{hostvars[item]['ansible_eth1']['ipv4']['address'] }} {{hostvars[item]['host_name']}} ' state=present
with_items: '{{groups.myhosts}}'