我使用Ansible从防火墙获取一些信息,防火墙将输出作为JSON返回。如果防火墙安装了多个包,它将返回一个字典列表。如果只有一个包,它返回一个字典。假设只安装了一个包,那么它返回一个字典——我如何将这个字典作为一个项添加到一个新列表中?因此,新列表将只包含一个元素。
简而言之,如何将字典作为项添加到新列表中?
当安装单个包时,可以在这里访问字典。
(output.stdout | from_json).result.system.packages.entry
多个包
"packages": {
"entry": [
{
"name": "package-1",
"version": "1.1.0",
"info": "installed"
},
{
"name": "package-2",
"version": "1.0.0",
"info": "installed"
}
]
}
<<p>单包/em>"packages": {
"entry": {
"name": "package-1",
"version": "1.1.0",
"info": "installed"
}
}
编辑
- name: "Set fact"
set_fact:
result: "{{ (output.stdout | from_json).result.system.packages.entry }}"
- name: "debug"
debug:
msg:
- "{{ result | type_debug }}"
- "{{ result }}"
!! RESULT !!
"msg": [
"dict",
{
"name": "package-1",
"version": "1.1.0",
"installed": "yes"
}
]
- name: "Set fact"
set_fact:
result: []
- name: append dict to list
set_fact:
result = "{{ [(output.stdout | from_json).result.system.packages.entry] }}"
- name: "debug"
debug:
msg:
- "{{ result | type_debug }}"
- "{{ result }}"
!! RESULT !!
"msg": [
"list",
[]
] ```
您可以使用YAML中的流序列定义一个空列表:
packages: []
要将元素添加到列表中,只需在列表定义中输入此元素:
package: foo
packages: "{{ [package] }}"
如果不止一个,加逗号:
package1: foo
package2: foo
packages: "{{ [package1, package2] }}"
那么,在你的例子中:
packages: "{{ [(output.stdout | from_json).result.system.packages.entry] }}"
这就是说,正如@Zeitounator所指出的,一个更好的主意可能是对所有情况都进行相同的处理,并始终将结果包含在列表中。
当packages.entry
已经是一个列表时,这确实会创建一个列表的列表,但是这种情况可以通过Ansible将flatten
过滤器添加到Jinja来扁平化列表来处理。
所以,你最终得到:
packages: >-
{{
[
(output.stdout | from_json).result
.system
.packages
.entry
]
| flatten
}}
给定数据
packages1:
entry:
- info: installed
name: package-1
version: 1.1.0
- info: installed
name: package-2
version: 1.0.0
packages2:
entry:
info: installed
name: package-1
version: 1.1.0
Q:"如何将字典作为项添加到新列表中?">
A:始终将附加项放入列表中,即使它已经是一个列表,并且使结果变平。例如,
- set_fact:
result: "{{ result|d([]) + [item] }}"
loop:
- "{{ packages1.entry }}"
- "{{ packages2.entry }}"
- debug:
var: result|flatten
为
result|flatten:
- info: installed
name: package-1
version: 1.1.0
- info: installed
name: package-2
version: 1.0.0
- info: installed
name: package-1
version: 1.1.0