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!!!!
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