Ansible

如何正確管理網路設備的 Ansible 正則表達式

  • September 27, 2022

我目前正在測試使用 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"
       ]
   ]
}

並不是說您擁有結構化形式的數據,您可以按照您認為合適的方式儲存它。

引用自:https://serverfault.com/questions/1111687