Search code examples
ansibleansible-inventory

Ansible loop from dictionary


I'm looking for a clever way to loop through a dictionary. My Dict:

certmgmt_keys_on_srv:
  aap.tstglobal.tst.loc:
    srv:
      - t28419.tst.loc
      - t28420.tst.loc
      - t28421.tst.loc
    mykey:  /etc/tower/tower.key
    mycert: /etc/tower/tower.cert
    notify: activate_aap_cert
  aap2.tstglobal.tst.loc:
    srv:
      - t38419.tst.loc
      - t38420.tst.loc
      - t38421.tst.loc
    mykey:  /etc/tower/tower3.key
    mycert: /etc/tower/tower2.cert
    notify: activate_aap_cert

My idea is that I do a query on the dictonary and get the values ​​in a loop like:

item.key = aap.tstglobal.tst.loc
item.value.srv = t28419.tst.loc
item.value.mykey = /etc/tower/tower.key
item.value.mycert = /etc/tower/tower.cert

but only if my current hostname (t28419.tst.loc) is present in srv. In the further course I load the files from the certificate to the current server ...

I've tried the following, but I can't really get any further. Can someone please help me :-)

  - name: Display my cert_names and file_names to renew
    ansible.builtin.debug:
      msg: "Cert_Name: {{ item }}"
    with_subelements:
      - "{{ certmgmt_keys_on_srv | community.general.json_query('*') }}"
      - srv
      - skip_missing: yes

And get:

TASK [Display my cert_names and file_names to renew] ************************************************************************************************************************************
ok: [t28419.tst.loc] => (item=[{'key': '/etc/tower/tower.key', 'cert': '/etc/tower/tower.cert', 'notify': 'activate_aap_cert'}, 't28419.tst.loc']) => {
    "msg": "Cert_Name: [{'key': '/etc/tower/tower.key', 'cert': '/etc/tower/tower.cert', 'notify': 'activate_aap_cert'}, 't28419.tst.loc']"
}
ok: [t28419.tst.loc] => (item=[{'key': '/etc/tower/tower.key', 'cert': '/etc/tower/tower.cert', 'notify': 'activate_aap_cert'}, 't28420.tst.loc']) => {
    "msg": "Cert_Name: [{'key': '/etc/tower/tower.key', 'cert': '/etc/tower/tower.cert', 'notify': 'activate_aap_cert'}, 't28420.tst.loc']"
}
ok: [t28419.tst.loc] => (item=[{'key': '/etc/tower/tower.key', 'cert': '/etc/tower/tower.cert', 'notify': 'activate_aap_cert'}, 't28421.tst.loc']) => {
    "msg": "Cert_Name: [{'key': '/etc/tower/tower.key', 'cert': '/etc/tower/tower.cert', 'notify': 'activate_aap_cert'}, 't28421.tst.loc']"
}

Thanks for help!!!!


Solution

  • I think you're looking for something like this:

    - hosts: all
      gather_facts: false
      vars:
        certmgmt_keys_on_srv:
          aap.tstglobal.tst.loc:
            srv:
              - t28419.tst.loc
              - t28420.tst.loc
              - t28421.tst.loc
            mykey: /etc/tower/tower.key
            mycert: /etc/tower/tower.cert
            notify: activate_aap_cert
          aap2.tstglobal.tst.loc:
            srv:
              - t38419.tst.loc
              - t38420.tst.loc
              - t38421.tst.loc
            mykey: /etc/tower/tower3.key
            mycert: /etc/tower/tower2.cert
            notify: activate_aap_cert
    
      tasks:
        - debug:
            msg:
              key: "{{ item[0] }}"
              srv: "{{ inventory_hostname }}"
              mykey: "{{ item[1].mykey }}"
              mycert: "{{ item[1].mycert }}"
          when: inventory_hostname in item[1].srv
          loop: "{{ certmgmt_keys_on_srv.items() }}"
    

    Assuming that we have an inventory that defines hosts t38419.tst.loc andt28421.tst.loc, running the above playbook produces:

    PLAY [all] *********************************************************************
    
    TASK [debug] *******************************************************************
    skipping: [t38419.tst.loc] => (item=['aap.tstglobal.tst.loc', {'srv': ['t28419.tst.loc', 't28420.tst.loc', 't28421.tst.loc'], 'mykey': '/etc/tower/tower.key', 'mycert': '/etc/tower/tower.cert', 'notify': 'activate_aap_cert'}]) 
    ok: [t38419.tst.loc] => (item=['aap2.tstglobal.tst.loc', {'srv': ['t38419.tst.loc', 't38420.tst.loc', 't38421.tst.loc'], 'mykey': '/etc/tower/tower3.key', 'mycert': '/etc/tower/tower2.cert', 'notify': 'activate_aap_cert'}]) => {
        "msg": {
            "key": "aap2.tstglobal.tst.loc",
            "mycert": "/etc/tower/tower2.cert",
            "mykey": "/etc/tower/tower3.key",
            "srv": "t38419.tst.loc"
        }
    }
    ok: [t28421.tst.loc] => (item=['aap.tstglobal.tst.loc', {'srv': ['t28419.tst.loc', 't28420.tst.loc', 't28421.tst.loc'], 'mykey': '/etc/tower/tower.key', 'mycert': '/etc/tower/tower.cert', 'notify': 'activate_aap_cert'}]) => {
        "msg": {
            "key": "aap.tstglobal.tst.loc",
            "mycert": "/etc/tower/tower.cert",
            "mykey": "/etc/tower/tower.key",
            "srv": "t28421.tst.loc"
        }
    }
    skipping: [t28421.tst.loc] => (item=['aap2.tstglobal.tst.loc', {'srv': ['t38419.tst.loc', 't38420.tst.loc', 't38421.tst.loc'], 'mykey': '/etc/tower/tower3.key', 'mycert': '/etc/tower/tower2.cert', 'notify': 'activate_aap_cert'}]) 
    
    PLAY RECAP *********************************************************************
    t28421.tst.loc             : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   
    t38419.tst.loc             : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0