我正在寻找一种聪明的方法来遍历字典。 我的词典:
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
我的想法是,我对字典进行查询并在循环中获取值,例如:
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
但前提是我当前的主机名 (t28419.tst.loc) 存在于 srv 中。 在进一步的课程中,我将文件从证书加载到当前服务器......
我已经尝试了以下方法,但我真的无法再进一步了。 有人可以帮我 :-)
- 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
得到:
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']"
}
感谢帮助!!!!
我想你正在寻找这样的东西:
- 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() }}"
假设我们有一个定义主机
t38419.tst.loc
和 t28421.tst.loc
的清单,运行上面的剧本会产生:
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