简体   繁体   中英

Force Ansible to gather facts from group

I want to force Ansible to gather facts about hosts inside playbook (to use those data inside role) regardless --limit, but don't know how.

I have playbook like this:

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

- hosts: postgres
  roles:
    - postgres

Inside 'postgres' role I have template which iterates over default IPs:

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

This works like magic, but only if I run my playbook without --limit. If I use --limit it breaks, because some hosts in hostgroup have no gathered facts.

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

failed: [pgtest] (item=pg_hba.conf) => {"failed": true, "item": "pg_hba.conf", "msg": "AnsibleUndefinedVariable: 'dict object' has no attribute 'ansible_default_ipv4'"}

How can I have --limit to reconfigure only postgres host, and have network data from other hosts (without doing all other configuration stuff?).

Try this please !

- hosts: postgres

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

  roles:
    - postgres

You can run setup for the hosts in the postgres_access group as a task and save the facts using 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]

Just keep in mind that the template needs to change how you are referencing the hosts ipv4 address, I tried with something like this:

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

For printing just the IP of each host in the group

Try this:

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

Use the same role which you have defined as it is with ignore_errors: true . So that for hosts which do not have gathered data will not fail.

And if you want data to be gathered for all the hosts in both groups postgres_access and postgres, then add gather_facts: true to get facts for postgres group and for postgres_access you already have a task written.

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

- hosts: postgres
  gather_facts: true
  roles:
    - postgres
  ignore_errors: true

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM