[英]Compare ansible registered variables for multiple hosts
我有這個可靠的劇本:
---
- name: Portal Quality Checks - IC
become: yes
hosts: all
tasks:
- name: Verify software version on Interconnect(s)
shell: |
dpkg -l | grep network-controller | awk '{print $3}'
register: cv_raw
when: inventory_hostname in groups.IC
tags: ['ic', 'software']
- debug:
msg: "{{ (cv_raw.stdout_lines | last) }}"
failed_when: ( hostvars[groups['IC'][0]].cv_raw.stdout_lines != hostvars[groups['IC'][1]].cv_raw.stdout_lines )
ignore_errors: true
tags: ['ic', 'software']
輸出類似於:
TASK [debug] ****************************************************************************************************************************************************************************************************************************************************************************************************************
ok: [10.241.55.6] => {
"msg": "5.0.0.0600-1"
}
ok: [10.241.55.8] => {
"msg": "4.2.0.819477-1"
}
想法是我正在嘗試比較輸出中的版本(這是播放列表中的第二個任務)。 現在庫存中只有 2 台主機,它運行得很好。
我的問題是,如果我假設庫存中有 10 台主機並且所有主機都應該運行相同的版本,我該怎么做? 應該有一種更簡單的方法來比較每個主機名的結果版本,而不是我現在的做法hostvars[groups['IC'][0]].cv_raw.stdout_lines
for host1和hostvars[groups['IC'][0]].cv_raw.stdout_lines
用於host2,因為對於 10 個主機中的每一個執行此操作確實需要大量手動工作,如果假設清單中有 50 個主機,則甚至會更加復雜。
我也有興趣在屏幕上顯示一條消息,如:
網絡控制器版本:
host1 - version
host2 - version
host3 - version
...
此外,如果版本不匹配,則顯示如下消息:
網絡控制器版本不匹配:
host1 version different than host2 version etc...
根據您的建議,以下是 3 台主機的輸出,其中 2 台運行相同的控制器版本,其中一台運行不同的版本:
TASK [debug]
ok: [10.241.55.6] => {
"sw_versions": [
{
"host": "ro151",
"version": "5.0.0.0600-1"
},
{
"host": "PrimaryIC-Stack5",
"version": "4.2.2.600111061-1"
},
{
"host": "SecondaryIC-Stack5",
"version": "4.2.2.600111061-1"
}
]
}
那么如何比較這些版本並在版本不匹配時顯示錯誤消息?
更新:
因此,除了您的劇本之外,我還添加了以下內容:
- set_fact:
compare_versions: "{{ groups.IC | map('extract', hostvars) | list | json_query('[].sw_version') }}"
- debug:
var: compare_versions
run_once: true
這會導致以下調試消息:
TASK [debug]
ok: [10.241.55.6] => {
"compare_versions": [
"5.0.0.0600-1",
"4.2.2.600111061-1",
"4.2.2.600111061-1"
]
}
那么我如何比較這些版本?!
問: “在屏幕上顯示一條消息,如host1 - version ... ”
A:下面的任務可以完成這項工作。 對於每個主機,將版本放入變量sw_version
。 在下一個任務中,從組 IC 中提取hostvars
的主機hostvars
並創建主機版本字典列表。
- set_fact:
sw_version: "{{ cv_raw.stdout_lines|last }}"
- set_fact:
sw_versions: "{{ groups.IC|
map('extract', hostvars)|
list|
json_query('[].{host: ansible_hostname,
version: sw_version}') }}"
run_once: true
- debug:
var: sw_versions
run_once: true
問: “如果版本不匹配,我如何比較這些版本並顯示錯誤消息?”
A:使用版本比較測試來分析數據。 例如
- set_fact:
install_version: 5.0.0.0600-1
- debug:
msg: "{{ item.host }} version is {{ item.version }}.
Upgrade to {{ install_version }}."
loop: "{{ sw_versions }}"
when: item.version is version( install_version, '<')
給
"msg": "PrimaryIC-Stack5 version is 4.2.2.600111061-1. Upgrade to 5.0.0.0600-1."
"msg": "SecondaryIC-Stack5 version is 4.2.2.600111061-1. Upgrade to 5.0.0.0600-1."
問: “假設主機 1:4.2.2.6,主機 2:4.2.2.6,主機 3:5.5.0。我想顯示一條消息:主機之間的版本不匹配:主機 1、主機 2 和主機 3。如果所有主機都運行相同的版本然后說:您所有的主機都運行相同的版本。”
答:例如
hosts: localhost
gather_facts: false
vars:
sw_versions:
- host: host1
version: 4.2.2.6
- host: host2
version: 4.2.2.6
- host: host3
version: 4.2.2.6
tasks:
- set_fact:
my_hosts: "{{ sw_versions|json_query('[].host') }}"
- debug:
msg: "All your hosts are running the same version."
when: sw_versions|json_query('[].version')|unique|length == 1
給
"msg": "All your hosts are running the same version."
和
- hosts: localhost
gather_facts: false
vars:
sw_versions:
- host: host1
version: 4.2.2.6
- host: host2
version: 4.2.2.6
- host: host3
version: 5.5.0
tasks:
- set_fact:
my_hosts: "{{ sw_versions|json_query('[].host') }}"
- debug:
msg: "Version mismatch among hosts: {{ my_hosts }}"
when: sw_versions|json_query('[].version')|unique|length > 1
給
"msg": "Version mismatch among hosts: [u'host1', u'host2', u'host3']"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.