Назад | Перейти на главную страницу

Доступ к переменным хостов для группы хостов в 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 {{ }}.

Есть идеи, как это сделать?

ХОРОШО. Я пробовал это раньше, но на самом деле это не сработало. Так что я, должно быть, там что-то сделал не так.

Это работает:

- 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» в конце. Наконец, все преобразуется в список.