Доступ к hostvars для группы узлов в Ansible
Я пытаюсь использовать 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 {{ }}
,
Есть идеи, как это сделать?
4 ответа
ХОРОШО. Я пробовал это раньше, и это не сработало. Так что я, должно быть, сделал что-то не так там.
Это работает:
- 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'] }}"
Возникла та же проблема, я хотел просмотреть список хостов в одной группе, а затем добавить правила брандмауэра с их ips. Посмотрел немного, как устроен 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
Если вам нужно добавить префикс и суффикс, а также сделать все списком, взгляните на следующее:
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" в конце. Наконец, все превращается в список.
Ваш синтаксис только слегка отключен. Попробуйте использовать 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