我目前正在测试使用 arubanetworks.aos_switch 集合检索 HP/Aruba 交换机上的固件版本列表。基本上我只是在做:
collections:
- arubanetworks.aos_switch
tasks:
- name: Launching "show flash" CLI
arubaoss_command:
commands:
- "show flash"
register: output_version
- name: Firmware Display
debug:
msg: "{{ output_version.stdout_lines }}"
以下是我从 stdout 和 stdout_lines 角度使用 -vvv 选项启动剧本时检索到的内容:
"stdout": [
"show flashImage Size (bytes) Date Version \n----------------- ------------ -------- --------------\nPrimary Image : 14184498 04/14/17 YA.16.03.0004 \nSecondary Image : 14184498 04/14/17 YA.16.03.0004 \n\nBoot ROM Version \n----------------\nPrimary Boot ROM Version : YA.15.19\b\nDefault Boot Image : Primary"
],
"stdout_lines": [
[
"show flashImage Size (bytes) Date Version ",
"----------------- ------------ -------- --------------",
"Primary Image : 14184498 04/14/17 YA.16.03.0004 ",
"Secondary Image : 14184498 04/14/17 YA.16.03.0004 ",
"",
"Boot ROM Version ",
"----------------",
"Primary Boot ROM Version : YA.15.19",
"",
"Default Boot Image : Primary"
]
]
}
如果我在标准输出上使用以下正则表达式msg: "{{ output_version.stdout | regex_findall('(Primary Image[^\\\\n]*)')}}"
,我会成功检索到一行结果,例如:“主要图像:14184498 04/14/17 YA.16.03.0004”
我的主要问题是,因为它不是 JSON 格式的输出,正确检索这些数据的最佳和最简单的方法是什么?将来,我想将其存储在一个文件中,基本上类似于主机名;闪存图像;大小;日期;版本
非常感谢你的建议。Gael
答案1
您可以使用过滤器和测试从stdout_lines
与正则表达式匹配的行中提取单独的行。例如:select
match
- hosts: localhost
gather_facts: false
vars:
output_version:
stdout: "show flashImage Size (bytes) Date Version \n----------------- ------------ -------- --------------\nPrimary Image : 14184498 04/14/17 YA.16.03.0004 \nSecondary Image : 14184498 04/14/17 YA.16.03.0004 \n\nBoot ROM Version \n----------------\nPrimary Boot ROM Version : YA.15.19\b\nDefault Boot Image : Primary"
stdout_lines: [
[
"show flashImage Size (bytes) Date Version ",
"----------------- ------------ -------- --------------",
"Primary Image : 14184498 04/14/17 YA.16.03.0004 ",
"Secondary Image : 14184498 04/14/17 YA.16.03.0004 ",
"",
"Boot ROM Version ",
"----------------",
"Primary Boot ROM Version : YA.15.19",
"",
"Default Boot Image : Primary"
]
]
tasks:
- name: extract primary image
set_fact:
primary_image: >-
{{ (output_version.stdout_lines[0] | select("match", "Primary Image") | first | split(":"))[1].strip().split() }}
secondary_image: >-
{{ (output_version.stdout_lines[0] | select("match", "Secondary Image") | first | split(":"))[1].strip().split() }}
- debug:
msg:
- "{{ primary_image }}"
- "{{ secondary_image }}"
如果我们运行上述剧本,我们会得到以下输出:
TASK [debug] ******************************************************************************************************************************************************************************************************
ok: [localhost] => {
"msg": [
[
"14184498",
"04/14/17",
"YA.16.03.0004"
],
[
"14184498",
"04/14/17",
"YA.16.03.0004"
]
]
}
这并不意味着您拥有结构化的数据,您可以按照自己认为合适的方式存储它。