Рейтинг:0

ansible AND операция с WHEN не работает при использовании ansible_facts

флаг gr

Команда: Я пытаюсь провалить задачу, когда на узле не выполняются два условия. ansible_facts['версия_дистрибутива'] и ansible_facts['распределение'].

Я прохожу через два узла. один узел 20.х убунту и прочее 18.х.

Варс/main.yml

os_distribution: "Убунту"
ОС_версия: "20.04"

задача ниже

- name: "Проверить сопоставление базовой версии ОС с ожидаемой версией дистрибутива {{ os_version }}"
  потерпеть поражение:
    msg: "Задача не выполнена, так как обнаружена непредвиденная версия ОС: {{ ansible_facts['distribution'] }} {{ ansible_facts['distribution_version'] }} на {{ inventory_hostname }}"
  когда:
    - ansible_facts['distribution_version'] — это версия (os_version, '<')
    - os_distribution != ansible_facts['distribution']

результат

ЗАДАЧА [node-validation : Проверить сопоставление базовой версии ОС с ожидаемой версией дистрибутива 20.04] ***
Вторник, 23 ноября 2021 г., 20:11:32 +0000 (0:00:17.570) 0:00:17.690 ****** 
пропуск: [узел1]
пропуск: [узел2]
    

ожидаемый результат: наблюдайте за 18.x ниже, не уверен, что мне не хватает, чтобы получить это.

фатальный: [узел2]: FAILED! => {"changed": false, "msg": "Задача не выполнена, так как обнаружена непредвиденная версия ОС: Ubuntu 18.04 на узле 2"}

Когда я удаляю - os_distribution != ansible_facts['distribution'] то я получаю ожидаемый результат, как показано ниже, но я хочу удовлетворить два условия, а не только одно.

[фатальный: [узел2]: НЕУДАЧА! => {"changed": false, "msg": "Задача не выполнена, так как обнаружена непредвиденная версия ОС: Ubuntu 18.04 на узле 2 }}"}

ссылка на ansible_facts

ФАКТЫ для 20.x

10:17:59 [0;32m "раздача": "Ubuntu",[0m
10:17:59 [0;32m "distribution_file_parsed": правда,[0m
10:17:59 [0;32m "путь_к_файлу_дистрибутива": "/etc/os-release",[0m
10:17:59 [0;32m "разновидность_файла_дистрибутива": "Debian",[0m
10:17:59 [0;32m "основная_версия_дистрибутива": "18",[0m
10:17:59 [0;32m "distribution_release": "бионический",[0m
10:17:59 [0;32 м "версия_дистрибутива": "18.04",[0 м

ФАКТЫ для 20.x

10:23:43 [0;32m "раздача": "Ubuntu",[0m
10:23:43 [0;32m "distribution_file_parsed": правда,[0m
10:23:43 [0;32m "путь_к_файлу_дистрибутива": "/etc/os-release",[0m
10:23:43 [0;32m "разновидность_файла_дистрибутива": "Debian",[0m
10:23:43 [0;32m "основная_версия_дистрибутива": "20",[0m
10:23:43 [0;32m "distribution_release": "фокус",[0m
10:23:43 [0;32m "версия_дистрибутива": "20.04",[0m
Рейтинг:0
флаг in

Когда вы предоставляете список, он выполняет И из двух выражений. А вот стандартная таблица истинности И.

Конд1 Конт2 | Результат
Ложь Ложь | ЛОЖЬ
Ложь Верно | ЛОЖЬ
Верно Ложно | ЛОЖЬ
Правда Правда | Истинный

Считайте, что у вас есть

os_distribution: "Ubuntu" # переменная
ansible_facts.distribution: «Ubuntu» # факт

Выражение "Убунту" != "Убунту" является ЛОЖЬ, и поскольку согласно таблице истинности, если какое-либо из условий ложно, конечный результат ложен. Ansible выполнит задачу только тогда, когда результат будет верным.

В любом случае, я надеюсь, что для получения желаемого результата следует изменить когда для ИЛИ ЖЕ вместо того, чтобы иметь список, который соединен с помощью AND.

когда:
  ansible_facts['distribution_version'] — это версия (os_version, '<') или
  os_distribution != ansible_facts['распространение']

Демонстрационный плейбук + вывод

---
- хосты: локальный
  вары:
    os_distribution: "Убунту"
    ОС_версия: "20.04"
    ansible_facts:
      раздача: "Убунту"
      дистрибутив_файл_парсед: Истина
      путь_файла_распределения: "/etc/os-release"
      Distribution_file_variety: "Debian"
      дистрибутив_основная_версия: "18"
      дистрибутив_релиз: "бионический"
      версия_распределения: "18.04"

  задачи:
  - отладка:
      сообщение: >-
        {{ os_distribution }} {{ansible_facts['distribution'] }}
        {{ os_distribution != ansible_facts['distribution'] }}
  - отладка:
      сообщение: >-
        {{ ansible_facts['distribution_version'] }} {{ os_version }}
        {{ ansible_facts['distribution_version'] — это версия (os_version, '<') }}

  - name: "Проверить сопоставление базовой версии ОС с ожидаемой версией дистрибутива {{ os_version }}"
    отлаживать:
      msg: "Задача не выполнена, так как обнаружена непредвиденная версия ОС: {{ ansible_facts['distribution'] }} {{ ansible_facts['distribution_version'] }} на {{ inventory_hostname }}"
    когда:
      ansible_facts['distribution_version'] — это версия (os_version, '<') или
      os_distribution != ansible_facts['распространение']

- хосты: локальный
  вары:
    os_distribution: "Убунту"
    ОС_версия: "20.04"
    ansible_facts:
      раздача: "Убунту"
      Distribution_file_parsed: правда
      путь_файла_распределения: "/etc/os-release"
      Distribution_file_variety: "Debian"
      дистрибутив_основная_версия: "20"
      дистрибутив_релиз: "фокусный"
      версия_распределения: "20.04"

  задачи:
  - отладка:
      сообщение: >-
        {{ os_distribution }} {{ansible_facts['distribution'] }}
        {{ os_distribution != ansible_facts['distribution'] }}
  - отладка:
      сообщение: >-
        {{ ansible_facts['distribution_version'] }} {{ os_version }}
        {{ ansible_facts['distribution_version'] — это версия (os_version, '<') }}

  - name: "Проверить сопоставление базовой версии ОС с ожидаемой версией дистрибутива {{ os_version }}"
    отлаживать:
      msg: "Задача не выполнена, так как обнаружена непредвиденная версия ОС: {{ ansible_facts['distribution'] }} {{ ansible_facts['distribution_version'] }} на {{ inventory_hostname }}"
    когда:
      ansible_facts['distribution_version'] — это версия (os_version, '<') или
      os_distribution != ansible_facts['распространение']

# Вывод

# ЗАДАНИЕ [отладка] *************************************************** ******************************************************* *******************************
# хорошо: [локальный хост] => {
# "msg": "Убунту Убунту Ложь"
# }
#
# ЗАДАНИЕ [отладка] *************************************************** ******************************************************* *******************************
# хорошо: [локальный хост] => {
# "msg": "18.04 20.04 Истина"
# }
#
# TASK [Проверить сопоставление базовой версии ОС с ожидаемой версией дистрибутива 20.04] **************************************** ******************************
# хорошо: [локальный хост] => {
# "msg": "Задача не выполнена, так как обнаружена непредвиденная версия ОС: Ubuntu 18.04 на локальном хосте"
# }
#
# ИГРАТЬ [localhost] *************************************************** ******************************************************* *************************
#
# ЗАДАНИЕ [отладка] *************************************************** ******************************************************* *******************************
# хорошо: [локальный хост] => {
# "msg": "Убунту Убунту Ложь"
# }
#
# ЗАДАНИЕ [отладка] *************************************************** ******************************************************* *******************************
# хорошо: [локальный хост] => {
# "msg": "20.04 20.04 Ложь"
# }
#
# TASK [Проверить сопоставление базовой версии ОС с ожидаемой версией дистрибутива 20.04] **************************************** ******************************
# пропуск: [localhost]
#

PS, если вам нужна математика, почему вы переключаетесь с И на ИЛИ при отрицании, см. Законы_Де_Моргана

AhmFM avatar
флаг gr
согласен, и я считаю, что это то, что я думал, что делаю? У меня есть один node1, который является TT, а другой - TF. поэтому я должен был получить отказ для node2, который печатает сообщение, и пропустить node1, у которого есть TT без сообщения. но я получаю пропуск и нет сообщения в обеих ситуациях
флаг in
Если вам нужно больше, добавьте пример playbook и выходные данные, которые могут помочь, и вы можете использовать их для тестирования.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.