从group playbook访问整个Ansible库存

从group playbook访问整个Ansible库存,ansible,ansible-inventory,Ansible,Ansible Inventory,我试图从一个只在一个组中运行的剧本中获取清单文件中所有主机的IP列表 假设以下库存文件: [dbservers] db1.example.com db2.example.com [webservers] www1.example.com www2.example.com 还有剧本: --- - hosts: dbservers roles: - dosomething 以及剂量测定作用: - name: print all host ips template: src=hos

我试图从一个只在一个组中运行的剧本中获取清单文件中所有主机的IP列表

假设以下库存文件:

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

[webservers]
www1.example.com
www2.example.com
还有剧本:

---

- hosts: dbservers
  roles:
  - 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

问题:


如何从本手册中访问整个库存?在playbook中将主机更改为all,但是dosomething playbook也会在所有主机上运行,这不是我想要的。我只想要数据库服务器上的列表。

特殊变量
groups
可能就是您想要做的,在您的情况下
groups
的值将是:

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

您可以在jinja模板中循环使用它。

为了访问hostvars中的所有主机,您首先必须为所有主机创建一个任务。我创建了一个简单的角色,它可以在所有主机上进行简单的回显。然后,此角色强制收集所有主机上的事实,并将每个主机添加到hostvars组

请注意,如果运行带有标记限制的playbook,hostvars组将再次生效


我在这里得到了提示:

这是可行的,但只给了我主机名的列表,而没有他们的事实。事实证明,我必须首先创建一个包含“所有”主机的任务,然后它们都可以在hostvars组中使用。