我希望设置一个事实,其成分为字典,但在下面的代码my_dict_var
正在渲染为string
,尽管我希望它是字典。
- set_fact:
my_fact: "{{ my_fact | default({}) | combine( my_dcit_var ) }}"
vars:
my_dcit_var: { "{{ item }}" : ['some string value'] }
with_items:
- 1
- 2
- 3
我希望最终结果应该是。
{1: ['some string value'], 2: ['some string value'], 3: ['some string value']}
有人可以指出我的错误。
答案 0 :(得分:3)
部分getServerSideProps
使用与文本字符串相同的键{ "{{ item }}" : ['some string value'] }
创建一个字典,而不是循环中每个项目的变量。因此,每次都会用最新的对覆盖dict "{{ item }}"
对。这是解决方法,
key:value
或者简单地
- set_fact:
my_fact: "{{ my_fact | default({}) | combine( my_dict_var ) }}"
vars:
my_dict_var: "{{ { item : ['some string value'] } }}"
with_items:
- 1
- 2
- 3
Ansible还建议尽可能使用- set_fact:
my_fact: "{{ my_fact | default({}) | combine( { item: ['some string value'] } ) }}"
with_items:
- 1
- 2
- 3
而不是loop
查找。这是一个使用循环和指定的key:value对的示例。
with_
答案 1 :(得分:0)
过滤器dict的作用是根据键值对列表创建字典。让我们使用过滤器product创建列表。例如
- set_fact:
my_fact: "{{ dict(list1|product(list2)) }}"
vars:
list1:
- 1
- 2
- 3
list2:
- ['some string value']
- debug:
var: my_fact
- debug:
msg: "{{ my_fact|to_json }}"
给出预期的结果
my_fact:
1:
- some string value
2:
- some string value
3:
- some string value
msg: '{"1": ["some string value"], "2": ["some string value"], "3": ["some string value"]}'
以下是如何使用过滤器zip从两个列表创建字典的示例。例如
- set_fact:
my_fact: "{{ dict(list1|zip(list2)) }}"
vars:
list1:
- 1
- 2
- 3
list2:
- [value-1a, value-1b, value-1c]
- [value-2a, value-2b, value-2c]
- [value-3a, value-3b, value-3c]
- debug:
var: my_fact
给予
my_fact:
1:
- value-1a
- value-1b
- value-1c
2:
- value-2a
- value-2b
- value-2c
3:
- value-3a
- value-3b
- value-3c