Рейтинг:0

сопоставить значение item.x со значением inventory_hostname

флаг cn

Мне нужна помощь в сопоставлении inventory_hostname с item.host (из vars_file). Как лучше всего это сделать? Я не мог понять это, поскольку я новичок.

Мое требование:

  • Я должен вызвать все хосты из файла инвентаризации.

  • Я должен сопоставить item.host с ansible_inventory, если он существует, запустить команду оболочки на хостах, которая соответствует всем item.hosts, а затем выйти.

  • filelist.yml — это динамический файл, который меняется ежедневно, все хосты существуют в инвентаре, но я хочу использовать только те, которые есть в файле.

У меня есть файл list.yml, который содержит имя хоста, диск и информацию о версии.

$ список котов.yml
---
список:
  - хост: хост1
    диск: диск0
    ОС: 7

  - хост: хост2
    диск: диск4
    ОС: 7

  - хост: lhost6
    диск: hdisk7
    ОС: 7
---

В playbook я пытался сопоставить значение, но не повезло.

---
- название: Моя книга игр   
  хозяева: все   
  vars_file: 
    - список.yml   
  задачи:
   - имя: Удалить файл из клиента
     оболочка: "rm -f /tmp/me"
     когда:
       - "('item.host' в inventory_hostname) и (ansible_distribution_version == 'item.os')"
     цикл: "{{список}}"
     зарегистрироваться: файлопт
   - отладка: var=fileopt
----

Пожалуйста, предложите решение, которое может решить эту проблему.

Рейтинг:2
флаг br

Например, при наличии инвентаря

оболочка> кошачьи хосты
хост01
хост02
хост03

и список

список:
  - хост: host01
    диск: диск0
    ОС: 13.0
  - хост: host02
    диск: диск4
    ОС: 13.0
  - хост: host06
    диск: hdisk7
    ОС: 13.0

Создайте список разрешенных хостов

my_hosts: "{{ список|карта(атрибут='хост')|список }}"

дает

мои_хосты:
  - хост01
  - хост02
  - хост06

Далее создайте словарь разрешенных хостов и версий ОС

my_os: "{{ list|items2dict(key_name='host', value_name='os') }}"

дает

  мой_ос:
    хост01: 13.0
    хост02: 13.0
    хост06: 13.0

Теперь приведенные ниже задачи удаляют файл условно и отображают зарегистрированные результаты.

    - имя: Удалить файл из клиента
      файл:
        состояние: отсутствует
        путь: /tmp/me
      когда:
        - inventory_hostname в my_hosts
        - ansible_distribution_version ==
          my_os[inventory_hostname]|по умолчанию('Нет')|строка
      зарегистрироваться: файлопт
    - отладка:
        переменная: файлopt

дает

ЗАДАЧА [Удалить файл из клиента] ************************************************* **
пропуск: [host03]
хорошо: [host02]
хорошо: [хост01]

ЗАДАЧА [отладка] **************************************************** *****************
хорошо: [host01] => 
  файлopt:
    изменено: ложь
    не удалось: ложь
    путь: /tmp/me
    состояние: отсутствует
хорошо: [host02] => 
  файлopt:
    изменено: ложь
    не удалось: ложь
    путь: /tmp/me
    состояние: отсутствует
хорошо: [host03] => 
  файлopt:
    изменено: ложь
    skip_reason: Условный результат был False
    пропущено: правда

Как и ожидалось, хост03 который отсутствует в списке, был пропущен.


При желании создание динамической группы может быть более эффективным, если список разрешенных хостов будет намного меньше, чем список всех хостов. Например, создайте группу разрешенных хостов в первом воспроизведении и используйте ее во втором воспроизведении.

- имя: Создать группу my_hosts
  хозяева: все
  собрать_факты: правда
  вары:
    список:
      - хост: host01
        диск: диск0
        ОС: 13.0
      - хост: host02
        диск: диск4
        ОС: 13.0
      - хост: host06
        диск: hdisk7
        ОС: 13.0
    my_hosts: "{{ список|карта(атрибут='хост')|список }}"
    my_os: "{{ list|items2dict(key_name='host', value_name='os') }}"
  задачи:
    - set_fact:
        _my_os: "{{ ansible_distribution_version ==
                    my_os[inventory_hostname]|по умолчанию('Нет')|строка }}"
    - имя: Создать группу my_hosts
      add_host:
        имя: "{{ элемент }}"
        группы: my_hosts
      цикл: "{{ hostvars|dict2items|
                selectattr('ключ', 'в', my_hosts)|
                selectattr('value._my_os')|
                карта (атрибут = 'ключ') |
                список }}"
      run_once: правда

- имя: Удалить файл из my_hosts
  хосты: my_hosts
  сбор_фактов: ложь
  задачи:
    - имя: Удалить файл из клиента
      файл:
        состояние: отсутствует
        путь: /tmp/me
      зарегистрироваться: файлопт
    - отладка:
        переменная: файлopt

дает

ИГРАТЬ [Создать группу my_hosts] *********************************************

ЗАДАНИЕ [Сбор фактов] ***************************************************
хорошо: [host03]
хорошо: [хост01]
хорошо: [host02]

ЗАДАЧА [set_fact] **************************************************** ******
хорошо: [host03]
хорошо: [host02]
хорошо: [хост01]

ЗАДАЧА [Создать группу my_hosts] *******************************************
ок: [host01] => (item=host01)
ок: [host01] => (item=host02)

PLAY [Удалить файл с my_hosts] ***************************************

ЗАДАЧА [Удалить файл из клиента] ****************************************
хорошо: [хост01]
хорошо: [host02]

ЗАДАЧА [отладка] **************************************************** *********
хорошо: [host01] => 
  файлopt:
    изменено: ложь
    не удалось: ложь
    путь: /tmp/me
    состояние: отсутствует
хорошо: [host02] => 
  файлopt:
    изменено: ложь
    не удалось: ложь
    путь: /tmp/me
    состояние: отсутствует

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

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