Доступ к 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
Другие вопросы по тегам