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

时间:2014-11-14 03:02:14

标签: 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 

我需要在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

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

3 个答案:

答案 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)

我遇到了同样的问题,这是我对有兴趣的人的解决方案。

hosts / 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

tasks / 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 ansible 2.9.0
  • 我决定使用blockinfile而不是使用模板,因为hostvars上下文未在模板内更新。另外我很着急:-)。