ansible:列表和字典的stdout下面的



是";结果":

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是字典的列表

    1. 键进程和vrf被分配给regex值
    2. 通过reverse,钥匙被带到前面
    3. 通过community.general.dict,根据键值对创建dict
  • ospf_dict:一种基于过程的dict

  • vrf_dict:一种基于vrf-的dict

注意:如果键重复,ospf_dictvrf_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

最新更新