我试图在Ansible中编写一个“ set_fact”语句,该语句基本上试图将一个列表值与对应的整数映射到同一项目输出变量中。我在引用附加和求值表达式以将列表值与相应值(另一个值)绑定时遇到语法错误
我已经尝试如代码片段中所示,使用带有lambda的map来映射值。基本上,“结果”采用的格式。
results = [{_ ansible_item_label = [0,item1],status = int1},{_ansible_item_label = [0,item2],status = int2},{_ansible_item_label = [0,item3],status = int3}] >
- name: Matching item to values
set_fact:
append: "{{ append|default([]) + map(lambda x, y: x+ ':' +y, item._ansible_item_label, item.status) }}"
with_items: "{{results|list}}"
loop_control:
label: "{{ item._ansible_item_label}}"
register: append
预期数据类型:字典 预期结果:{“ item1”:“ int1”,“ item2”:“ int2”,“ item3”:“ int3”}并且,如果没有地位价值,我们将如何有效地处理它。
答案 0 :(得分:0)
首先,我认为您不能在Jinja中使用带有地图的Lambda(但我会很高兴地证明是错误的)。无论如何,没有必要。如下所示,您可以使用简单的ansible表达式来实现结果。
然后,您会遇到一个实现错误:将set_fact
的结果注册到您已经设置的相同var中,将覆盖内容并运行set_fact(即成功+所有其他信息)。
要处理没有状态的元素,只需使用default
。
这是我制作的测试剧本:
---
- name: Create dictionary from other
hosts: localhost
vars:
result:
- _ansible_item_label:
- 0
- item1
status: int1
- _ansible_item_label:
- 0
- item2
status: int2
- _ansible_item_label:
- 0
- item3
tasks:
- name: Create other dict
set_fact:
append: >-
{{
append
| default([])
| combine({item._ansible_item_label.1: item.status|default('no status')})
}}
loop: "{{ result }}"
- name: Show result
debug:
var: append
结果
PLAY [Create dictionary from other] *********************************************************
TASK [Gathering Facts] **********************************************************************
ok: [localhost]
TASK [Create other dict] ********************************************************************
ok: [localhost] => (item={'_ansible_item_label': [0, 'item1'], 'status': 'int1'})
ok: [localhost] => (item={'_ansible_item_label': [0, 'item2'], 'status': 'int2'})
ok: [localhost] => (item={'_ansible_item_label': [0, 'item3']})
TASK [Show result] **************************************************************************
ok: [localhost] => {
"append": {
"item1": "int1",
"item2": "int2",
"item3": "no status"
}
}
PLAY RECAP **********************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0