У меня есть 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"
]
}
Так как мне сравнить эти версии?!