使用值的 Ansible 嵌套循环从一个循环到另一个循环

Ansible nested loops using value form one loop to another

我在 ansible 中编写嵌套循环时遇到问题,在下面的迭代中我遇到了错误 我正在使用的 ansible 角色如下所示

条件检查 'item[0]['value']['from'] == COMPONENT_NAME' 失败。错误是:评估条件时出错(项目[0]['value']['from'] == COMPONENT_NAME):'item' 未定义

角色

- name: create config file 
  template:
    src: "{{template_source}}/{{COMPONENT_NAME}}/sessions/{{ item[0]['value']['protocol']}}/{{item[0]['value']['from_template']}}"
    dest: "{{dest_folder}}/{{app}}/{{instance_name}}/{{COMPONENT_NAME}}/{{VENUE}}/Config/Repo/session/{{item[0]['value']['protocol']}}/{{item[1]}}.json"
    mode: 0755
  vars:
    dest_file_name: "{{instance_name}}_{{COMPONENT_NAME}}_{{VENUE}}_{{item[0]['key']}}"
    mbFlag: "{{item[0]['value']['broker'] |  default('False')}}"
  when: item[0]['value']['from'] == COMPONENT_NAME
  with_nested:
    - "{{ connections | dict2items }}"
    - "{{myFileList['from_' + COMPONENT_NAME +'_'+ VENUE +'_'+ item[0]['value']['to']].split(',') }}"

yml 文件具有以下变量,我正在对其进行迭代。


myFileList: 
   {
    from_et_AG_zp: DevOpsTest_et_zp_AG_zp, 
    from_et_AG_sSP: 'DevOpsTest_et_sSP_AG_US,DevOpsTest_et_sSP_AG_BA,DevOpsTest_et_sSP_AG_chex',
    from_et_AG_esb: DevOpsTest_et_esb_AG_ABC, 
    from_et_BA_Y_zp: DevOpsTest_et_zp_BA_Y_zp,
    from_et_BA_Y_sSP: 'DevOpsTest_et_sSP_BA_Y_US,DevOpsTest_et_sSP_BA_Y_BA,DevOpsTest_et_sSP_BA_Y_chex',
    from_et_BA_Y_esb: DevOpsTest_et_esb_BA_Y_ABC, 
    from_et_BA_zp: DevOpsTest_et_zp_BA_zp,
    from_et_BA_sSP: 'DevOpsTest_et_sSP_BA_US,DevOpsTest_et_sSP_BA_BA,DevOpsTest_et_sSP_BA_chex',
    from_et_BA_esb: DevOpsTest_et_esb_BA_ABC, 
    from_zp_zp_esb: DevOpsTest_zp_esb_zp_ABC,
    from_SP_SP_esb: DevOpsTest_SP_esb_SP_ABC, 
    from_SSS_SSS_esb: DevOpsTest_SSS_esb_SSS_ABC,
    
    to_zp_zp_es: DevOpsTest_et_zp_zp_es, 
    to_sSP_BA_es: DevOpsTest_et_sSP_BA_es,
    to_sSP_chex_es: DevOpsTest_et_sSP_chex_es, 
    to_sSP_US_es: DevOpsTest_et_sSP_US_es,
    to_esb_ABC_es: DevOpsTest_et_esb_ABC_es, 
    to_esb_ABC_zp: DevOpsTest_zp_esb_ABC_zp,
    to_esb_ABC_SP: DevOpsTest_SP_esb_ABC_SP, 
    to_esb_ABC_SSS: DevOpsTest_SSS_esb_ABC_SSS
    
    }



connections:
  et_etb:
    from: et
    to: etb
    from_template: et_etb.json
    to_template: etb_et.json
    protocol: ZERO

经过太多的排列组合,我意识到我们不能将外循环变量值从外循环传递到内循环,所以作为解决方法,我在第一个角色中编写第一个循环,在另一个角色中编写第二个循环并调用第二个通过遍历第一个完全填满我的目标的循环,从第一个角色开始

---
- name: create config file
  include_role:
    name: patch_template
  vars:
    file_key: "{{ 'from_' + COMPONENT_NAME +'_'+ VENUE +'_'+ role_item.value.to }}"
    myprotocol: "{{role_item.value.protocol}}"
    myTemplate: "{{role_item.value.from_template}}"
    subComponent: "{{VENUE}}"
   

  when: role_item.value.from == COMPONENT_NAME
  with_items: "{{ connections | dict2items }}"

  loop_control:
    loop_var: role_item

patch_template角色文件

- name: patch template
  template:
    src: "{{template_source}}/{{COMPONENT_NAME}}/sessions/{{myprotocol}}/{{myTemplate}}"
    dest: "{{dest_folder}}/{{app}}/{{instance_name}}/{{COMPONENT_NAME}}/{{subComponent}}/Config/Repo/session/{{myprotocol}}/{{item}}.json"
    mode: 0755
  vars:
    dest_file_name: "{{item}}"
  with_items:
     - "{{ myFileList[file_key].split(',') }}"