问题描述
我正在写一个有趣的剧本,通过调用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