是";结果":
stdout:
- |-
ospf T1 VRF vrf1
ospf T2 VRF vrf2
ospf T3 VRF vrf3
stdout_lines:
- ospf T1 VRF vrf1
- ospf T2 VRF vrf2
- ospf T3 VRF vrf3
我想要列表和字典中的输出:
第一个输出将是列表。列表将有以下内容:
- T1
- T2
- T3
第二个输出将如下所示:
ospf_vrf:
- vrf: vrf1
process: T1
- vrf: vrf2
process: T2
- vrf: vrf3
process: T3
第三个输出将是字典。
怎么做?
我将首先通过regex解析stdout
中的数据。假设输出中的组件总是:ospf <process_value> VRF <vrf_falue>
,则正则表达式如下所示:
{{ stdout | regex_findall('^ospf (.+) VRF (.+)$', multiline=True) }}
基于此,您可以将值放入不同的形式,并将其存储在变量中:
- set_fact:
ospf: "{{ extracted | map('first') }}"
ospf_vrf: "{{ extracted | map('zip', ['process', 'vrf']) |
map('map', 'reverse') | map('community.general.dict') }}"
ospf_dict: "{{ dict(extracted) }}"
vrf_dict: "{{ dict(extracted | map('reverse')) }}"
vars:
extracted: "{{ stdout | regex_findall('^ospf (.+) VRF (.+)$', multiline=True) }}"
extracted
是正则表达式值的助手,也是所有其他值的基础ospf
是process_values的列表在每种情况下,都会获取正则表达式的第一个元素。ospf_vrf
是字典的列表- 键进程和vrf被分配给regex值
- 通过
reverse
,钥匙被带到前面 - 通过
community.general.dict
,根据键值对创建dict
ospf_dict
:一种基于过程的dictvrf_dict
:一种基于vrf-的dict
注意:如果键重复,ospf_dict
和vrf_dict
都将丢失值
4个变量的输出如下所示:
TASK [debug] ***************************
ok: [localhost] => {
"ospf": [
"T1",
"T2",
"T3"
]
}
TASK [debug] ***************************
ok: [localhost] => {
"ospf_vrf": [
{
"process": "T1",
"vrf": "vrf1"
},
{
"process": "T2",
"vrf": "vrf2"
},
{
"process": "T3",
"vrf": "vrf3"
}
]
}
TASK [debug] ***************************
ok: [localhost] => {
"ospf_dict": {
"T1": "vrf1",
"T2": "vrf2",
"T3": "vrf3"
}
}
TASK [debug] ***************************
ok: [localhost] => {
"vrf_dict": {
"vrf1": "T1",
"vrf2": "T2",
"vrf3": "T3"
}
}
我已经为您的需求创建了这个示例剧本。我不清楚第三个预期产出。请澄清
- hosts: localhost
gather_facts: no
vars:
stdout_lines:
- ospf T1 VRF vrf1
- ospf T2 VRF vrf2
- ospf T3 VRF vrf3
tasks:
- set_fact:
first_output: "{{ first_output | default([]) + [ (item | split())[1] ] }}"
with_items:
"{{ stdout_lines }}"
- debug:
var: first_output
- set_fact:
second_output: "{{ second_output | default([]) + [ { 'vrf': (item | split())[3] , 'process': (item | split())[1] } ] }}"
with_items:
"{{ stdout_lines }}"
- debug:
var: second_output