Назад | Перейти на главную страницу

очень подробный выбор инвентаря с помощью Ansible

Я разрабатываю новый доступный инструмент для существующей системы. Существующая система представляет собой большую платформу для тестирования оборудования. Мне нужно уметь:

run task xyz on all version 3 hosts that are using a Broadcom BCM57412 network controller.

или

run task xyz on all hosts in group QA2 that have firmware version 3 and HGST hard drives

Я читал о возможностях инвентаризации с помощью Ansible, и, поскольку он, похоже, не имеет условного выбора инвентаря, я предполагаю, что мне нужно будет использовать внешнюю базу данных инвентаризации.

Я прав?

Как правило, задачи должны выполнять, по крайней мере, часть своего собственного выбора на основе применяемых системных фактов.

Например, вы можете написать задачу, которая относится к конкретной модели жесткого диска:

name: Upgrade firmware on HGST HUH728080AL5200 drive
command: /usr/bin/whatever arguments ...
when: ansible_devices['sda']['model'] == 'HGST HUH728080AL5200'

Это не обязательно требует выбора инвентаря, так как он будет работать только на хостах, у которых есть названная модель диска (как sda; цикл между установленными дисками оставлен в качестве упражнения для читателя).

Ansible может собирать факты о ваших системах. Используя модуль «настройка». Запускайте либо напрямую как задачу, либо через ключевое слово play 'gather_facts: yes'.

Если вы настроите кэширование фактов и зададите сбор явным образом, а затем создадите факты, охватывающие все варианты информации, которую вы хотите запросить, тогда вы сможете запускать игры на основе кэшированных фактов, создав динамическую группу.

ansible.cfg

[defaults]
fact_caching = jsonfile
fact_caching_connection = data/fact_cache
fact_caching_timeout = 86400
gathering = explicit

Мы могли бы запустить такую ​​пьесу

- hosts: all
  tasks:
  # simple example, you could use any facts you have
  # make your filter as complex as you want.
  - name: construct a group of systems based on facts
    group_by:
      key: filtered_systems
    when: ansible_distribution is defined and ansible_distribution == 'Debian' and
          ansible_architecture is defined and ansible_architecture == 'x86_64'

  - name: report the systems
    debug:
      var: groups['filtered_systems']
      verbosity: 1
    run_once: true

- hosts: filtered_systems
  tasks:
  - name: simple ping of the systems
    ping: