【问题标题】:Accessing the entire Ansible Inventory from group playbook从组 playbook 访问整个 Ansible Inventory
【发布时间】:2017-01-25 16:03:38
【问题描述】:

我正在尝试从仅在单个组中运行的剧本中获取清单文件中所有主机的 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

问题:

我怎样才能从这个剧本中访问整个库存?在剧本中将主机更改为 all 是可行的,但随后 dosomething 剧本也在所有主机上运行,​​这不是我想要的。我只想要 dbservers 上的列表。

【问题讨论】:

    标签: ansible ansible-inventory


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 这行得通,但只给了我主机名列表,而不是他们的事实。结果我必须首先创建一个包含“所有”主机的任务,然后它们都将在 hostvars 组中可用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 2020-03-18
      • 2018-02-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多