遍历Ansible中的两个列表

问题描述

我正在写一个有趣的剧本,通过调用API来在内部系统中创建用户,其中请求主体包含json格式的所有用户信息。

现在,我的剧本将所有这些变量保存在这样的词典列表中:

userInfoDict: "{{[ {'FirstName': 'John','LastName': 'Lennon','Number': '','email': 'john@example.com'},{'FirstName': 'Paul','LastName': 'McCartney','email': 'paul@example.com'} ]}}" 

“数字”字段为空白时,我正在播放一个事件,以从内部数据库中获取可用的电话号码,并且该数字列表保存在名为numberList的变量中。

我想做的是遍历UserInfoDict,然后将Number字段设置为我的数字列表中的下一个值,但是我无法做到这一点。

有什么办法可以做这样的事情吗?您在哪里访问列表索引的对象?

 - set_fact:
      finalUserInfo: "{{userInfoDict[i].Number : item}}"
   loop: "{{numberList}}

类似这样的^

解决方法

您可以使用zip filter将两个列表组合在一起。这意味着您在numberList中为userInfoDict中的每个元素都有一个条目(旁注:这是一个具有误导性的IMO名称,因为它是一个列表)。根据您对问题的了解,我在下面创建了这样的列表。

您可以直接在压缩列表上循环并访问它们的相关值。

如果您绝对需要使用合并的信息来创建新的词典列表,则可以通过多种方法进行。我在下面的演示中使用了json_query filter作为演示(这需要控制器上的pip install jmespath)。

(注意:在下面的剧本中,需要克服相当丑陋的... to_json | from_json ...才能解决jmespath ansible通信中的错误,该通信中压缩列表的每个元素都被解释为字符串。)

---
- name: Zip demo
  hosts: localhost
  gather_facts: false

  vars:
    userInfoDict: [{'FirstName':'John','LastName':'Lennon','Number':'','email':'john@example.com'},{'FirstName':'Paul','LastName':'McCartney','email':'paul@example.com'}]
    numberList: ["+33123456789","+33612345678"]

  tasks:
    - name: Looping over zipped lists directly
      vars:
        fancy_message: |-
          User first name is: {{ item.0.FirstName }}
          User last name is: {{ item.0.LastName }}
          User number is: {{ item.1 }}
          User email is: {{ item.0.email }}
      debug:
        msg: "{{ fancy_message.split('\n') }}"
      loop: "{{ userInfoDict | zip(numberList) | list }}"
      loop_control:
        label: "{{ item.0.FirstName }} {{ item.0.LastName }}"

    - name: Creating a new list of dicts with json_query
      vars:
        new_dict_query: >-
          [*].{
            "FirstName": [0].FirstName,"LastName": [0].LastName,"Number": [1],"email": [0].email
          }
        new_dict_list: >-
          {{
             userInfoDict
             | zip(numberList)
             | list
             | to_json
             | from_json
             | json_query(new_dict_query)
           }}
      debug:
        var: new_dict_list

给出:

PLAY [Zip demo] *****************************************************************************************************************************************************************************************************************************

TASK [Looping over zipped lists directly] ***************************************************************************************************************************************************************************************************
ok: [localhost] => (item=John Lennon) => {
    "msg": [
        "User first name is: John","User last name is: Lennon","User number is: +33123456789","User email is: john@example.com"
    ]
}
ok: [localhost] => (item=Paul McCartney) => {
    "msg": [
        "User first name is: Paul","User last name is: McCartney","User number is: +33612345678","User email is: paul@example.com"
    ]
}

TASK [Creating a new list of dicts with json_query] *****************************************************************************************************************************************************************************************
ok: [localhost] => {
    "new_dict_list": [
        {
            "FirstName": "John","LastName": "Lennon","Number": "+33123456789","email": "john@example.com"
        },{
            "FirstName": "Paul","LastName": "McCartney","Number": "+33612345678","email": "paul@example.com"
        }
    ]
}

PLAY RECAP **********************************************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...