该应用程序需要以下主机:
[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服务器上配置主机,因为他们需要访问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
缺点是我需要在其他人之前运行此剧本,这似乎不是使用角色的正确方法。
答案 0 :(得分: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 %}
答案 1 :(得分:0)
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
{% for host in groups['all'] %}
{{ hostvars[host].ansible_default_ipv4.address }} {{ host }} {{ hostvars[host].ansible_fqdn }}
{% endfor %}
答案 2 :(得分:0)
我遇到了同样的问题,这是我对有兴趣的人的解决方案。
[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
---
- 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 %}
注意: