说我在yml中定义了以下字典
st1:
d1:
f1: fv1
f2: fv2
d:
df1: dfv1
df2: dfv2
d2:
f1: fv3
f2: fv4
d:
df1: dfv3
df2: dfv4
我可以使用with_subelements遍历上面的内容。像这样
with_subelements:
- st1
- d
但是运行剧本时出现以下错误。
失败! => {“ msg”:“键d应该指向列表,得到'{u'df1': u'dfv1',u'df2':u'dfv2'}'“}
我正在使用ansible 2.4版
我怎样才能只将dict d的值放入列表中以成功获得上述剧本。
dictsort或dict2items对我不起作用
答案 0 :(得分:0)
好的-我不确定您要输出什么,但是......
我首先重组了yaml文件:
---
st1:
- name: d1
f1: fv1
f2: fv2
d:
- df1: dfv1
- df2: dfv2
- name: d2
f1: fv3
f2: fv4
d:
- df1: dfv3
- df2: dfv4
然后,这出戏看起来像这样:
- debug:
var: item.1
with_subelements:
- "{{ st1 }}"
- d
输出如下:
TASK [debug] **********************************************************************************************************************************
ok: [localhost] => (item=None) => {
"item.1": {
"df1": "dfv1"
}
}
ok: [localhost] => (item=None) => {
"item.1": {
"df2": "dfv2"
}
}
ok: [localhost] => (item=None) => {
"item.1": {
"df1": "dfv3"
}
}
ok: [localhost] => (item=None) => {
"item.1": {
"df2": "dfv4"
}
}
答案 1 :(得分:0)
如果您给我们一些预期的输出,这将有所帮助。但是,您需要使用with_subelements
的列表。如果您无法更改数据文件,则必须更改剧本。如果您想查看所有df1
值,则可以这样做:
- debug:
msg: "{{ item.key }}: {{ item.value.d.df1 }}"
with_dict: "{{ st1 }}"
使用您的字典文件,我得到了:
TASK [debug] **********************************************************************************************************************************
ok: [localhost] => (item=None) => {
"msg": "d2: dfv3"
}
ok: [localhost] => (item=None) => {
"msg": "d1: dfv1"
}
答案 2 :(得分:0)
不幸的是,您被困在一个糟糕的设计中。错误的设计会导致错误的代码。所以这是一些错误的代码:
---
- hosts: localhost
become: no
connection: local
tasks:
- set_fact:
st1_json: "{{ st1 | to_json }}"
- shell: echo '{{ st1_json }}' | jq '.[].d' | grep ':' | cut -d'"' -f4 | tr '\n' ',' | sed -e 's/^/[/' -e 's/,$/]/' -e 's/,/, /g'
register: output
- debug:
msg: "{{ output.stdout }}"
非常可怕。但是它得到了期望的输出:
TASK [debug] ************************************************************************************************************************
ok: [localhost] => {
"msg": "[dfv3, dfv4, dfv1, dfv2]"
}
享受。