从组剧本访问整个Ansible Inventory

时间:2014-08-20 16:35:03

标签: ansible ansible-inventory

我正在尝试从仅在一个组中运行的剧本中获取我的库存文件中所有主机的IP列表。

假设以下库存文件:

[dbservers]
db1.example.com
db2.example.com

[webservers]
www1.example.com
www2.example.com

剧本:

---

- hosts: dbservers
  roles:
  - dosomething

和dosomething角色:

- name: print all host ips
  template: src=hosts.j2 dest=/tmp/hosts.txt

还有hosts.j2模板:

{% for host in hostvars %}

{{ hostvars[host].ansible_eth0.ipv4.address }}

{% endfor %}

问题:

运行此时,我只会列出dbserver ip,而不是所有ip

问题:

如何从此剧本中获取对整个广告资源的访问权限?将主机更改为剧本中的 所有 ,但是dosomething playbook也可以在所有主机上运行,​​这不是我想要的。我只想要dbservers上的列表。

2 个答案:

答案 0 :(得分:2)

要获得对hostvars中所有主机的访问权限,首先必须为所有主机创建任务。我创建了一个简单的角色,可以简单地回应所有主机上的内容。然后,此角色强制在所有主机上收集事实,并将每个主机添加到hostvars组。

请注意,如果您随后使用标签限制运行Playbook,则会再次影响hostvars组。

我在这里得到了提示:https://groups.google.com/forum/#!msg/Ansible-project/f90Y4T4SJfQ/L1YomumcPEQJ

答案 1 :(得分:1)

特殊变量groups可能就是您要执行的操作,在您的情况下,groups的值将为:

"groups" : {
    "dbservers": [
        "db1.example.com",
        "db2.example.com"
    ],
    "webservers": [
        "www1.example.com",
        "www2.example.com"
    ]
}

你可以在你的jinja模板中循环。