【问题标题】:Force Ansible to gather facts from group强制 Ansible 从组中收集事实
【发布时间】:2016-05-10 15:56:26
【问题描述】:

我想强制 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 主机,并获得来自其他主机的网络数据(不做所有其他配置工作?)。

【问题讨论】:

  • 您是否尝试过不同的方法,例如标记您的 postgres 任务并指定 --tags postgres?这样,您就不会受到库存组的限制,而是按特定任务来限制
  • 是的,我想我会使用标签。对于“配置单个主机”的情况(就像它经常使用的那样),它仍然无济于事。
  • 为解决这个问题做了一个任务,我把它放在roles/postgres/tasks/main.yml 文件中,但我敢打赌,如果你从剧本中运行它,这个位置就无关紧要了。在底部查看我的答案。

标签: postgresql ansible ansible-playbook ansible-facts


【解决方案1】:

请试试这个!

- hosts: postgres

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

  roles:
    - postgres

【讨论】:

  • delegate_to 的想法非常棒,它可以与预期的“with_items”一起使用(好技巧!)。不幸的是,当“设置”被委派时,它会填充“postgres”主机的事实,而不是 postgress_access 组中的那些。
  • 哦,如果可能,请分享输出! :)
【解决方案2】:

您可以为postgres_access 组中的主机运行setup 作为任务并使用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

【讨论】:

  • Delegate 似乎也是根据this 从剧本中执行此操作的方法,但是人们错过了delegate_facts: True 设置,这可能是这对您不起作用的原因。
  • 我试过delegate 无济于事。我相信这很大程度上是因为委托将在他们被委托的主机中运行任务,但是,您在不同的地方构建模板并且hostvars 没有按预期反映。有几个与此行为相关的错误,我相信您只是遇到了另一个错误。
【解决方案3】:

试试这个:

- hosts: postgres
  pre_tasks:
  - setup:
     delegate_to: postgres_access
  roles:
    - postgres

【讨论】:

  • 很遗憾,不能将任务委派给组。
【解决方案4】:

使用与 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-12
    • 2017-01-03
    • 1970-01-01
    • 2015-07-13
    • 1970-01-01
    • 2018-01-16
    • 2022-01-12
    • 2023-04-02
    相关资源
    最近更新 更多