簡體   English   中英

比較多個主機的 ansible 注冊變量

[英]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 host1hostvars[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM