如何将变量变成字典项
How to turn a variable into a dictionary item
我正在努力完成我认为最简单的任务。我想取一个变量 v
并将其转换为字典,其中
v: ValueofV
最终目标是将该字典写入包含变量列表的 JSON 文件,key: value
其中键名始终是变量名,因此对于变量 a
, b
, c
, ...我应该以:
{
"a": "a_val",
"b": "v_val",
"c": "c_val"
}
我试过构建列表 with_items,例如
- name: Var3
set_fact:
node_state4: "{{ node_state4 | default({}) | combine({ item : item })}}"
with_items:
- requested_node_count
- added_node_count
但是,这使得该值成为字符串名称。如果我制作第二个项目 {{ item }}
它会失败。
为了通过名称的字符串表示形式访问变量值,您需要使用 vars
lookup.
所以你的任务应该是:
- set_fact:
node_state4: >-
{{
node_state4
| default({})
| combine({ item: lookup('vars', item) })
}}
loop:
- requested_node_count
- added_node_count
鉴于这两个任务:
- set_fact:
node_state4: >-
{{
node_state4
| default({})
| combine({ item: lookup('vars', item) })
}}
loop:
- requested_node_count
- added_node_count
vars:
requested_node_count: foo
added_node_count: bar
- debug:
var: node_state4
这产生:
TASK [set_fact] **********************************************************
ok: [localhost] => (item=requested_node_count)
ok: [localhost] => (item=added_node_count)
TASK [debug] *************************************************************
ok: [localhost] => {
"node_state4": {
"added_node_count": "bar",
"requested_node_count": "foo"
}
}
使用过滤器 community.general.dict_kv 例如
_dict: "{{ v|community.general.dict_kv('v') }}"
给予
_dict:
v: ValueofV
给定变量列表
rnodes: [a, b, c]
a: a_val
b: b_val
c: c_val
迭代列表并创建字典,例如
- set_fact:
_dict: "{{ _dict|d({})|
combine(lookup('vars', item)|
community.general.dict_kv(item)) }}"
loop: "{{ rnodes }}"
给予
_dict:
a: a_val
b: b_val
c: c_val
下一个选项是提取变量并使用过滤器dict and zip,例如下面的任务给出了相同的结果
- set_fact:
_dict: "{{ dict(rnodes|zip(_vals)) }}"
vars:
_vals: "{{ rnodes|map('extract', vars) }}"
我正在努力完成我认为最简单的任务。我想取一个变量 v
并将其转换为字典,其中
v: ValueofV
最终目标是将该字典写入包含变量列表的 JSON 文件,key: value
其中键名始终是变量名,因此对于变量 a
, b
, c
, ...我应该以:
{
"a": "a_val",
"b": "v_val",
"c": "c_val"
}
我试过构建列表 with_items,例如
- name: Var3
set_fact:
node_state4: "{{ node_state4 | default({}) | combine({ item : item })}}"
with_items:
- requested_node_count
- added_node_count
但是,这使得该值成为字符串名称。如果我制作第二个项目 {{ item }}
它会失败。
为了通过名称的字符串表示形式访问变量值,您需要使用 vars
lookup.
所以你的任务应该是:
- set_fact:
node_state4: >-
{{
node_state4
| default({})
| combine({ item: lookup('vars', item) })
}}
loop:
- requested_node_count
- added_node_count
鉴于这两个任务:
- set_fact:
node_state4: >-
{{
node_state4
| default({})
| combine({ item: lookup('vars', item) })
}}
loop:
- requested_node_count
- added_node_count
vars:
requested_node_count: foo
added_node_count: bar
- debug:
var: node_state4
这产生:
TASK [set_fact] **********************************************************
ok: [localhost] => (item=requested_node_count)
ok: [localhost] => (item=added_node_count)
TASK [debug] *************************************************************
ok: [localhost] => {
"node_state4": {
"added_node_count": "bar",
"requested_node_count": "foo"
}
}
使用过滤器 community.general.dict_kv 例如
_dict: "{{ v|community.general.dict_kv('v') }}"
给予
_dict:
v: ValueofV
给定变量列表
rnodes: [a, b, c]
a: a_val
b: b_val
c: c_val
迭代列表并创建字典,例如
- set_fact:
_dict: "{{ _dict|d({})|
combine(lookup('vars', item)|
community.general.dict_kv(item)) }}"
loop: "{{ rnodes }}"
给予
_dict:
a: a_val
b: b_val
c: c_val
下一个选项是提取变量并使用过滤器dict and zip,例如下面的任务给出了相同的结果
- set_fact:
_dict: "{{ dict(rnodes|zip(_vals)) }}"
vars:
_vals: "{{ rnodes|map('extract', vars) }}"