Сравните ansible зарегистрированных переменных для нескольких хостов - PullRequest
1 голос
/ 28 января 2020

У меня есть ansible playbook:

---
- 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-м задании в списке воспроизведения). Сейчас в инвентаре всего 2 хоста, и он работает просто отлично.

Мой вопрос: как мне это сделать, если я скажу, что в инвентаре 10 хостов, и все должны работать с одной и той же версией? Должен быть более простой способ сравнить полученную версию для каждого имени хоста, чем то, как я это делаю сейчас hostvars[groups['IC'][0]].cv_raw.stdout_lines для 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

Whic h приводит к сообщению отладки:

TASK [debug]
ok: [10.241.55.6] => {
    "compare_versions": [
        "5.0.0.0600-1",
        "4.2.2.600111061-1",
        "4.2.2.600111061-1"
    ]
}

Так как мне сравнить эти версии?!

1 Ответ

1 голос
/ 28 января 2020

Q: "Отображение сообщения на экране, как host1 - версия ... "

A: Задачи, указанные ниже, выполняют работу. Для каждого хоста поместите версию в переменную sw_version. В следующей задаче извлеките hostvars хостов из группы I C и создайте список словарей версий хостов.

- 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

Q: " Как сравнить эти версии и отобразить сообщение об ошибке, если имеется несоответствие версий? "

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."

Q: "Допустим, хост1: 4.2.2.6, хост2: 4.2.2.6, хост3: 5.5 .0. Я хочу отобразить сообщение: Несоответствие версий между хостами: host1, host2 и host3. Если все хосты работают под одной и той же версией, то скажите: Все ваши хосты работают под одной версией. "

A: Например

 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']"
...