Я разрабатываю новый доступный инструмент для существующей системы. Существующая система представляет собой большую платформу для тестирования оборудования. Мне нужно уметь:
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: