如何使用ansible业务流程配置/ etc/hosts

Yug*_*hou 5 ansible ansible-playbook

该应用程序需要以下主机:

[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 
Run Code Online (Sandbox Code Playgroud)

我需要在foo服务器和bar服务器上配置主机,因为他们需要访问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 %}
Run Code Online (Sandbox Code Playgroud)

问题是我跑的时候

ansible-playbook foo.yml 
Run Code Online (Sandbox Code Playgroud)

目标上的/ etc/hosts仅包含当前主机的ip和主机名,在这种情况下为foo-server.

我的问题是:

当我只针对其中一个运行playbook时,如何获取清单中的所有主机?

或者你可以提出一些替代方案,因为我在第一时间就得到了错误的想法.

我想到的替代方案是:

使主机配置成为针对所有主机的单独的剧本

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

  roles:
    - hosts
Run Code Online (Sandbox Code Playgroud)

缺点是我需要在其他人之前运行这个剧本,这似乎不是使用角色的正确方法.

leu*_*cos 7

确实这很奇怪,因为即使是文件也说:

如果,在这一点上,你还没有在剧本或剧集的任何游戏中与该主持人交谈,你可以得到变量,但你将无法看到事实.

我从中理解,如果主机尚未被"查询",您可能无法获得收集的事实,但您仍应该看到库存(和组/主机变量)中定义的变量.也许你应该把它推到邮件列表.

与此同时,您可以使用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 %}
Run Code Online (Sandbox Code Playgroud)