Ansible
如何正確管理網路設備的 Ansible 正則表達式
我目前正在測試使用 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 格式的輸出,正確檢索這些數據的最佳和最簡單的方法應該是什麼?將來,我想將它儲存在一個文件中,基本上類似於主機名;快閃記憶體圖像;大小;日期;版本
非常感謝您的建議。蓋爾
您可以使用過濾器和測試從
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" ] ] }
並不是說您擁有結構化形式的數據,您可以按照您認為合適的方式儲存它。