来自字典的 Ansible 循环

问题描述 投票:0回答:1

我正在寻找一种聪明的方法来遍历字典。 我的词典:

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']"
}

感谢帮助!!!!

ansible ansible-inventory
1个回答
0
投票

我想你正在寻找这样的东西:

- 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   

© www.soinside.com 2019 - 2024. All rights reserved.