Использование выборочного сбора фактов
В некоторых случаях вам могут потребоваться только определенные факты, а не вся информация о системе. Ansible позволяет выполнять выборочный сбор фактов для оптимизации производительности, сохраняя при этом возможность сбора необходимой информации.
Понимание подмножеств фактов
Ansible организует факты в подмножества, такие как:
all
: Все факты (по умолчанию)
min
/ minimal
: Минимальный набор фактов
hardware
: Информация о процессоре, памяти и устройствах
network
: Информация о сетевом интерфейсе и маршрутизации
virtual
: Сведения о виртуализации
ohai
: Факты из Ohai (если доступны)
facter
: Факты из Facter (если доступны)
Выбирая только необходимые факты, вы можете повысить производительность плейбука, сохраняя при этом доступ к необходимой информации.
Создание плейбука с выборочным сбором фактов
Давайте создадим плейбук, который собирает только факты, связанные с оборудованием:
- В WebIDE перейдите в каталог
/home/labex/project/ansible
- Создайте новый файл с именем
selective_facts_playbook.yml
- Добавьте следующее содержимое:
---
- name: Selective Fact Gathering
hosts: local
gather_facts: true
gather_subset:
- "!all" ## Exclude all facts by default
- "hardware" ## Then include only hardware facts
tasks:
- name: Display CPU information
debug:
msg: "CPU: {{ ansible_processor[1] }} with {{ ansible_processor_cores }} cores"
- name: Display memory information
debug:
msg: "Total Memory: {{ ansible_memtotal_mb }} MB"
- name: Try to access network facts (should fail)
debug:
msg: "Default IPv4 Address: {{ ansible_default_ipv4.address }}"
ignore_errors: true
Этот плейбук:
- Включает сбор фактов с помощью
gather_facts: true
- Использует
gather_subset
для ограничения собираемых фактов
- Сначала исключает все факты с помощью
!all
- Затем включает только факты об оборудовании с помощью
hardware
- Пытается получить доступ к сетевым фактам (которые не были собраны), чтобы продемонстрировать ограничение
Запуск плейбука с выборочным сбором фактов
Давайте запустим плейбук, чтобы увидеть выборочный сбор фактов в действии:
cd ~/project/ansible
ansible-playbook -i hosts selective_facts_playbook.yml
Вы должны увидеть вывод, похожий на этот:
PLAY [Selective Fact Gathering] **********************************************
TASK [Gathering Facts] *******************************************************
ok: [localhost]
TASK [Display CPU information] ***********************************************
ok: [localhost] => {
"msg": "CPU: Intel(R) Xeon(R) CPU with 2 cores"
}
TASK [Display memory information] ********************************************
ok: [localhost] => {
"msg": "Total Memory: 3907 MB"
}
TASK [Try to access network facts (should fail)] *****************************
fatal: [localhost]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute 'address'..."}
...ignoring
PLAY RECAP *******************************************************************
localhost : ok=4 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1
Обратите внимание, что первые две задачи выполнены успешно, потому что они обращаются к фактам об оборудовании, которые были собраны, но третья задача завершается неудачей, потому что сетевые факты не были собраны. Мы использовали ignore_errors: true
, чтобы продолжить выполнение плейбука, несмотря на эту ошибку.
Создание плейбука с несколькими подмножествами фактов
Теперь давайте создадим плейбук, который собирает как аппаратные, так и сетевые факты:
- В WebIDE создайте новый файл с именем
multiple_subsets_playbook.yml
- Добавьте следующее содержимое:
---
- name: Multiple Fact Subsets
hosts: local
gather_facts: true
gather_subset:
- "!all" ## Exclude all facts by default
- "hardware" ## Include hardware facts
- "network" ## Include network facts
tasks:
- name: Display CPU information
debug:
msg: "CPU: {{ ansible_processor[1] }} with {{ ansible_processor_cores }} cores"
- name: Display memory information
debug:
msg: "Total Memory: {{ ansible_memtotal_mb }} MB"
- name: Display network information
debug:
msg: "Default IPv4 Address: {{ ansible_default_ipv4.address }}"
Запустите этот плейбук:
ansible-playbook -i hosts multiple_subsets_playbook.yml
На этот раз все задачи должны быть выполнены успешно, потому что мы собрали как аппаратные, так и сетевые факты.