Как я могу настроить / etc / hosts с возможностью оркестровки

Приложению требуются следующие хосты:

[foo-servers]
foo-server ansible_ssh_host=192.168.50.2 

[bar-servers]
bar-server ansible_ssh_host=192.168.50.3 

[mysql-servers]
mysql-server ansible_ssh_host=192.168.50.4 

[mongodb-servers]
mongodb-server ansible_ssh_host=192.168.50.5 

Мне нужно настроить хосты на сервере foo и bar server, поскольку им нужен доступ к mysql и mongodb. Для этого я ввел роль с именем hosts:

# roles/hosts/tasks/main.yml
---
- name: change hosts
template: src=hosts.j2 dest=/etc/hosts

# roles/hosts/templates/hosts.j2
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

{% for item in hostvars %}
{{ hostvars[item]['ansible_ssh_host'] }} {{ item }}
{% endfor %}

Проблема в том, когда я бегу

ansible-playbook foo.yml 

/ Etc / hosts на целевом сервере содержит только ip и имя хоста текущего хоста, в данном случае foo-server.

У меня вопрос:

Как я могу получить все хосты в инвентаре, если я запускаю playbook только против одного из них?

Или вы могли бы предложить какие-то альтернативы, поскольку я изначально неправильно понимаю.

Мне приходят в голову альтернативы:

Сделайте конфигурацию хостов индивидуальной программой для всех хостов, например

---
- name: Configuring hosts
  hosts: all
  user: root

  roles:
    - hosts

Недостаток в том, что мне нужно запускать эту пьесу раньше других, и это кажется неправильным способом использования ролей.


person Yugang Zhou    schedule 14.11.2014    source источник


Ответы (2)


Действительно, это странно, поскольку даже в документах говорится:

Если на этом этапе вы еще не разговаривали с этим хостом ни в одной игре из playbook или набора playbook, вы можете получить доступ к переменным, но не сможете увидеть факты.

Я понимаю из этого, что вы можете не получить собранных фактов, если хост еще не был «запрошен», но вы все равно должны видеть переменные, определенные в инвентаре (и переменные группы / хоста). Может быть, вам стоит отправить это в список рассылки.

А пока вы можете решить свою проблему, используя вместо этого groups['all'] для обхода ваших хостов:

127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

{% for item in groups['all'] %}
{{ hostvars[item]['ansible_ssh_host'] }} {{ item }}
{% endfor %}
person leucos    schedule 14.11.2014

У меня была такая же проблема, и вот мое решение для всех, кому это интересно.

хосты / dev.ini

[controller]
controller1 ansible_ssh_host=10.11.11.10
controller2 ansible_ssh_host=10.11.11.11
controller3 ansible_ssh_host=10.11.11.12

[compute]
compute1 ansible_ssh_host=10.11.11.13
compute2 ansible_ssh_host=10.11.11.14
compute3 ansible_ssh_host=10.11.11.15

[block]
block1 ansible_ssh_host=10.11.11.16
block2 ansible_ssh_host=10.11.11.17

[haproxy]
haproxy1 ansible_ssh_host=10.11.11.18

[nginx]
nginx1 ansible_ssh_host=10.11.11.19

[deployment]
deployment ansible_ssh_host=10.11.11.20

[all:vars]
ansible_python_interpreter=/usr/bin/python3

задачи / main.yml

---
- name: Update /etc/hosts
  become: true
  blockinfile:
      path: /etc/hosts
      create: yes
      block: |
        127.0.0.1 localhost

        # The following lines are desirable for IPv6 capable hosts
        ::1 ip6-localhost ip6-loopback
        fe00::0 ip6-localnet
        ff00::0 ip6-mcastprefix
        ff02::1 ip6-allnodes
        ff02::2 ip6-allrouters
        ff02::3 ip6-allhosts

        {% for item in ansible_play_batch %}
        {{ hostvars[item].ansible_ssh_host }}   {{ item }}    
        {% endfor %}

Примечания:

  • Python 3.7.5 доступный 2.9.0
  • Я решил использовать blockinfile вместо использования шаблонов, потому что контекст hostvars не обновлялся внутри шаблона. Плюс я очень торопился :-).
person Vipul HK    schedule 14.11.2019