[英]Filter out content from Ansible output
我想從 ansible 輸出中單獨過濾掉 ip 地址。 當我嘗試使用awk
命令進行過濾時,它失敗了。 請查看我的代碼、輸出和所需的輸出。
- name: Gather all VMs from a specific folder
community.vmware.vmware_vm_info:
hostname: hostname_local
username: vmwarelogin
password: passwordvmware
folder: "/VMFS/"
validate_certs: False
delegate_to: localhost
register: vm_info
- debug:
var: ip
vars:
ip: "{{ vm_info.virtual_machines|
selectattr('guest_name', 'eq', 'My-Machine')|
map(attribute='ip_address')|first }}"
register: ip
- name: add ip
shell: echo "{{ip}}"| awk '{print $2}'
運行上述代碼后的輸出
{'ip': '192.168.1.32', 'failed': False, 'changed': False}
預期輸出為
192.168.1.32
將此IP地址用作同一劇本中其他地方的變量將不勝感激
如果我理解您想要使用YAML
標簽傳達的內容,您是在暗示
{'ip': '192.168.1.32', 'failed': False, 'changed': False}
應被視為 YAML 文件。 如果是這種情況,您應該在允許的情況下使用 YAML 解析器,如果您想要可以用作流水線命令的一部分的解析器,那么我建議嘗試yq
。 如果您被迫為此使用AWK
,請注意它最適合處理屬於 Chomsky Type-3 的實體,而 YAML 不是 Chomsky Type-3 裝置。 無論如何,它可能足以滿足您的情況。 我建議以下啟發式:獲取看起來像十進制 IP 地址的第一件事,這可以在 GNU AWK
中按照以下方式完成,假設您正在使用標准輸入來傳遞
{'ip': '192.168.1.32', 'failed': False, 'changed': False}
然后
awk 'BEGIN{FPAT="[0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}"}{print $1}'
輸出
192.168.1.32
說明:我使用字段模式 ( FPAT
) 通知 GNU AWK
該字段是 1 到 3 位數字,后跟文字點,后跟 1 到 3 位數字,后跟 1 到 3 位數字,后跟 1 到 3 位數字。 請注意,這確實只考慮十進制表示法的 IP 地址,並且還可能給出誤報(例如,它會找到999.999.999.999
)但希望您的輸入不是那么惡意。 我print
為每一行找到的第一個此類字段。
(在 gawk 4.2.1 中測試)
關於如何
... 將此 IP 地址用作同一劇本中其他地方的變量?
並查看提供的示例,您可以將案例簡化如下:
---
- hosts: localhost
become: false
gather_facts: false
vars:
IP: "192.168.2.1"
tasks:
- name: Show vars
debug:
var: IP
register: result
- name: Show result
debug:
var: result
- name: Show IP
debug:
msg: "{{ result.IP }}"
只需在您的情況下使用 finally echo "{{ ip.ip }}"
。
我想從 Ansible 輸出中單獨過濾掉 IP 地址。
根本不需要awk
,因為內容已經存在並且可以直接訪問。
預期輸出是...
結果將符合要求
TASK [Show vars] ***
ok: [localhost] =>
IP: 192.168.2.1
TASK [Show result] ***
ok: [localhost] =>
result:
IP: 192.168.2.1
changed: false
failed: false
TASK [Show IP] ***
ok: [localhost] =>
msg: 192.168.2.1
更多文檔
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.