Я пытаюсь использовать Ansible для добавления записей в файл хостов сервера. У меня есть группа серверов, с которыми мне нужно общаться друг с другом по частной локальной сети.
Мой файл инвентаря:
[server_list]
server1
server2
Задача, над которой я пытаюсь работать:
- lineinfile: dest=/etc/hosts line="{{ hostvars[" {{ item }} "]['ansible_eth1']['ipv4']['address'] }} {{ hostvars[" {{ item }} "]['ansible_hostname'] }}"
with_items: groups['server_list']
Это не трюк, я понял:
fatal: [server1] => host not found: {{item}}
fatal: [server2] => host not found: {{item}}
Это в основном то же самое, что и этот, но в новом формате доступа к переменным Ansible {{ }}
.
Есть идеи, как это сделать?
ХОРОШО. Я пробовал это раньше, но на самом деле это не сработало. Так что я, должно быть, там что-то сделал не так.
Это работает:
- lineinfile: dest=/etc/hosts line="{{ hostvars[item]['ansible_eth1']['ipv4']['address'] }} {{ hostvars[item]['ansible_hostname'] }}"
with_items: groups['server_list']
или для 1.9 или новее:
- lineinfile: dest=/etc/hosts line="{{ hostvars[item]['ansible_eth1']['ipv4']['address'] }} {{ hostvars[item]['ansible_hostname'] }}"
with_items: "{{ groups['server_list'] }}"
Была та же проблема, я хотел просмотреть список хостов в одной группе, а затем добавить правила брандмауэра с их IP-адресами. Немного посмотрел на структуру hostvars [item] и использовал другое имя для доступа к этому значению. Это сработало для меня:
- name: Setting up firewall so web_servers can access MySQL on port {{ mysql_port }}
ufw: rule=allow proto=tcp to_port={{ mysql_port }} src="{{ hostvars[item]['ansible_default_ipv4']['address'] }}"
with_items: "{{ groups.web_servers }}"
Ваш синтаксис лишь немного сбился. Попробуйте использовать groups.server_list
как твой with_items list
.
Я не использую host_vars так, как вы, поэтому дайте мне знать, если вы получите ошибку парсера при работе с этой частью вашей playbook.
Но следующее должно содержать имя хоста вместо {{item}}.
- lineinfile: dest=/etc/hosts line="{{ hostvars[" {{ item }} "]['ansible_eth1']['ipv4']['address'] }} {{ hostvars[" {{ item }} "]['ansible_hostname'] }}"
with_items: groups.server_list
Если вам нужно добавить и префикс, и суффикс, а также сделать все списком, взгляните на следующее:
set_fact:
extended_etcd_endpoints_list: "{{ groups['etcd'] | map('extract', hostvars, ['ansible_default_ipv4','address']) | map('regex_replace', '^(.*)$','https://\\1:2379') | list }}"
он берет список всех машин в группе etcd, извлекает ipv4, добавляет «https: //» впереди и «: 2379» в конце. Наконец, все преобразуется в список.