1

I need to use a list variable in other task with other hosts:

---
- name: open_firewall - IP servers list
  hosts: servers
  gather_facts: yes
  tasks:
    - name: Create servers list
      set_fact:
        servers_ip: "{{hostvars[inventory_hostname]['ansible_default_ipv4']['address']}}"

    - name: Se imprime
      debug:
        var: servers_ip

- name: open_firewall - Open the firewall of wazuh servers
  hosts: wazuh-servers
  tasks:
    - name: Allow port range 1514-1515
      ufw:
        rule: allow
        port: 1514:1515
        proto: tcp
        src: "{{ item }}"
      loop:  
        "{{ servers_ip }}"  

but I have this error:

TASK [Allow port range 1514-1515] ***************************************************************************************************************************************************************************************************
fatal: [wazuh.server.com]: FAILED! => {"msg": "'servers_ip' is undefined"}

Can I create a "global" list variable or that is impossible? Is there another way to do it?

  • Does this help https://stackoverflow.com/questions/33896847/how-do-i-set-register-a-variable-to-persist-between-plays-in-ansible – Chris Doyle Oct 24 '22 at 19:47

1 Answers1

1

For example, given the inventory

shell> cat hosts
[servers]
test_11
test_12
test_13

[wazuh_servers]
test_21
test_22
test_23

Get the server's facts

- hosts: servers
  tasks:
    - debug:
        var: ansible_all_ipv4_addresses.0

gives (abridged)

TASK [debug] **********************************************************************************
ok: [test_11] => 
  ansible_all_ipv4_addresses.0: 10.1.0.61
ok: [test_12] => 
  ansible_all_ipv4_addresses.0: 10.1.0.62
ok: [test_13] => 
  ansible_all_ipv4_addresses.0: 10.1.0.63

To create the list of the IPs put the below declaration into the vars

  servers_ip: "{{ groups.servers|
                  map('extract', hostvars, 'ansible_all_ipv4_addresses')|
                  map('first')|list }}"

gives

  servers_ip:
  - 10.1.0.61
  - 10.1.0.62
  - 10.1.0.63

Example of a complete playbook for testing

- hosts: servers
  tasks:
    - debug:
        var: ansible_all_ipv4_addresses.0

- hosts: wazuh_servers
  gather_facts: false
  vars:
    servers_ip: "{{ groups.servers|
                    map('extract', hostvars, 'ansible_all_ipv4_addresses')|
                    map('first')|list }}"
  tasks:
    - debug:
        var: servers_ip
PLAY [servers] ********************************************************************************

TASK [Gathering Facts] ************************************************************************
ok: [test_11]
ok: [test_12]
ok: [test_13]

TASK [debug] **********************************************************************************
ok: [test_11] => 
  ansible_all_ipv4_addresses.0: 10.1.0.61
ok: [test_12] => 
  ansible_all_ipv4_addresses.0: 10.1.0.62
ok: [test_13] => 
  ansible_all_ipv4_addresses.0: 10.1.0.63

PLAY [wazuh_servers] **************************************************************************

TASK [debug] **********************************************************************************
ok: [test_21] => 
  servers_ip:
  - 10.1.0.61
  - 10.1.0.62
  - 10.1.0.63
ok: [test_22] => 
  servers_ip:
  - 10.1.0.61
  - 10.1.0.62
  - 10.1.0.63
ok: [test_23] => 
  servers_ip:
  - 10.1.0.61
  - 10.1.0.62
  - 10.1.0.63
Vladimir Botka
  • 58,131
  • 4
  • 32
  • 63