我想强迫Ansible收集关于playbook内部主机的事实(在角色中使用这些数据),不管是限制,但不知道如何。
我有这样的剧本:
- 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就会中断,因为hostgroup中的某些主机没有收集到的事实。
ansible-playbook -i testing db.yml --limit postgres
失败:[pgtest](item = pg_hba.conf)=> {"失败":true," item":" pg_hba.conf"," msg":" AnsibleUndefinedVariable:&#39 ; dict对象'没有属性' ansible_default_ipv4'"}
我如何才能 - 仅限制重新配置postgres主机,并从其他主机获取网络数据(不进行所有其他配置工作?)。
答案 0 :(得分:1)
请试试这个!
- hosts: postgres
pre_tasks:
- setup:
delegate_to: "{{item}}"
with_items: "{{groups['postgres_access']}}"
roles:
- postgres
答案 1 :(得分:1)
您可以将setup
组中的主机postgres_access
作为任务运行,并使用register
保存事实:
- name: setup hosts action: "setup {{ item }} filter=ansible_default_ipv4" with_items: groups.postgres_access register: ip_v4
- name: create template template: src=[your template] dest=[your dest file]
请记住,模板需要更改引用主机ipv4地址的方式,我试过这样的事情:
{% for item in ip_v4.results %}
host all all {{ item.ansible_facts.ansible_default_ipv4.address }}/32 md5
{% endfor %}
仅打印组中每个主机的IP
答案 2 :(得分:0)
试试这个:
- hosts: postgres
pre_tasks:
- setup:
delegate_to: postgres_access
roles:
- postgres
答案 3 :(得分: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