将dictionary作为项添加到空列表中



我使用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

最新更新