强制 Ansible 从组中收集事实

Posted

技术标签:

【中文标题】强制 Ansible 从组中收集事实【英文标题】:Force Ansible to gather facts from group 【发布时间】: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 文件中,但我敢打赌,如果你从剧本中运行它,这个位置就无关紧要了。在底部查看我的答案。 【参考方案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

【讨论】:

以上是关于强制 Ansible 从组中收集事实的主要内容,如果未能解决你的问题,请参考以下文章

Ansible play 在一组主机上运行,​​但取决于其他人的事实

如何将ansible与两因素身份验证一起使用?

Ansible 中变量及加密

ansible-playbook 在设置时挂起

conda 没有使用 ansible playbook 进行初始化

json_query查询到的Ansible事实如何除法?