强制 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
保存事实:
请记住,模板需要更改您引用主机 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 在一组主机上运行,但取决于其他人的事实