0

我想强制 Ansible 收集有关 playbook 中主机的事实(以使用角色内部的这些数据),而不考虑 --limit,但不知道如何。

我有这样的剧本:

- hosts: postgres_access
  tasks:
  - name: Gathering info
    action: setup

- hosts: postgres
  roles:
    - postgres

在“postgres”角色中,我有一个模板可以遍历默认 IP:

{% for host in groups['postgres_access'] %}
host all all {{hostvars[host].ansible_default_ipv4.address}}/32 md5
{% endfor %}

这就像魔术一样,但前提是我在没有 --limit 的情况下运行我的剧本。如果我使用 --limit 它会中断,因为主机组中的某些主机没有收集到的事实。

ansible-playbook -i testing db.yml --limit postgres

失败:[pgtest] (item=pg_hba.conf) => {"failed": true, "item": "pg_hba.conf", "msg": "AnsibleUndefinedVariable: 'dict object' 没有属性 'ansible_default_ipv4'"}

我怎样才能让 --limit 只重新配置 postgres 主机,并从其他主机获得网络数据(不做所有其他配置工作?)。

4

4 回答 4

2

请试试这个!

- hosts: postgres

  pre_tasks:
  - setup:
    delegate_to: "{{item}}"
    with_items: "{{groups['postgres_access']}}"

  roles:
    - postgres
于 2016-05-11T08:21:09.330 回答
1

您可以将组setup中的主机postgres_access作为任务运行并使用以下命令保存事实register

  - 名称:设置主机
  行动:“设置{{项目}}过滤器=ansible_default_ipv4”
  with_items:groups.postgres_access
  注册:ip_v4
- 名称:创建模板 模板:src=[你的模板] dest=[你的目标文件]

请记住,模板需要更改您引用主机 ipv4 地址的方式,我尝试过这样的事情:

{% for item in ip_v4.results %}
    host all all {{ item.ansible_facts.ansible_default_ipv4.address }}/32 md5
{% endfor %}

仅打印组中每个主机的 IP

于 2016-05-11T18:09:36.903 回答
0

使用您定义的相同角色ignore_errors: true。这样对于没有收集数据的主机就不会失败。

如果您希望为 postgres_access 和 postgres 组中的所有主机收集数据,则添加gather_facts: true以获取 postgres 组和 postgres_access 的事实,您已经编写了一个任务。

- hosts: postgres_access
  tasks:
  - name: Gathering info
    action: setup

- hosts: postgres
  gather_facts: true
  roles:
    - postgres
  ignore_errors: true
于 2016-05-12T17:26:16.107 回答
0

尝试这个:

- hosts: postgres
  pre_tasks:
  - setup:
     delegate_to: postgres_access
  roles:
    - postgres
于 2016-05-11T02:35:56.687 回答