Search code examples
ansibleansible-inventory

Create a "global" list variable in ansible


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?


Solution

  • 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