3

我正在尝试从仅在单个组中运行的剧本中获取清单文件中所有主机的 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 也在所有主机上运行,​​这不是我想要的。我只想要 dbservers 上的列表。

4

2 回答 2

2

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

请注意,如果您随后运行带有标签限制的 playbook,则会再次影响 hostvars 组。

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

于 2014-08-25T07:55:43.810 回答
1

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

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

你可以在你的神社模板中循环。

于 2014-08-20T19:46:38.323 回答