Объяснение фактов Ansible с помощью примеров
Введение в Ansible Facts
В этом руководстве объясняется, что такое факты Ansible и как собирать системную информацию, то есть факты, в сборниках сценариев Ansible.
Краткое введение в факты Ansible
Факты — это информация об управляемых хостах.
Когда вы запускаете playbook, ansible попытается собрать системную информацию об управляемом хосте и сохранить ее в памяти до завершения playbook.
Информация может представлять собой IP-адрес, операционную систему, файловую систему и многое другое. Сбором информации занимается модуль "setup".
Вам не нужно определять модуль установки. Вместо этого ansible автоматически использует модуль настройки и собирает факты.
Посмотрите на следующий пример.
Создайте сборник сценариев и добавьте следующее определение воспроизведения. Определение воспроизведения содержит только имя воспроизведения и целевые хосты. Для этой пьесы не создается задача.
- name: Stats collection
hosts: all
Как вы можете видеть из следующего вывода, когда я запускаю книгу, сбор фактов отправляется в качестве первой задачи, хотя мы не определили ни одной задачи в книге.
PLAY [Stats collection] *******************************************************************************************
TASK [Gathering Facts] ********************************************************************************************
ok: [rocky.anslab.com]
ok: [master.anslab.com]
ok: [ubuntu.anslab.com]
PLAY RECAP ********************************************************************************************************
master.anslab.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
rocky.anslab.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ubuntu.anslab.com : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Факты также называются переменными playbook.
Как использовать переменные в Ansible Playbooks
Отключение сбора фактов
Не каждая книга пьес требует сбора фактов. Вы можете пропустить сбор фактов, добавив "gather_facts: false
" к определению воспроизведения.
- name: Stats collection
hosts: all
gather_facts: false
Как использовать модуль настройки
Как я говорил в предыдущем разделе, ansible использует модуль настройки для сбора фактов. Давайте рассмотрим некоторые способы использования модуля настройки в качестве специальной команды, а затем увидим, как явно использовать модуль настройки в сборнике сценариев.
Вывод команды настройки будет в формате JSON
. Запустите следующую команду на целевом хосте, чтобы получить выходные данные.
ansible m1 -m setup | less
Сбор фактов с помощью Ansible
Как вы можете видеть на изображении выше, собирается много информации, связанной с системой. Какая-то информация может быть полезна, а какая-то нет.
Тип данных фактов
Информация, хранящаяся в фактах, классифицируется на три различных типа данных.
- AnsibleUnsafeText
- Словарь
- Список
Следующая книга предназначена для демонстрации типов данных на основе вывода фактов. Я использую type_debug
, чтобы найти тип данных.
- name: Facts Data type
hosts: m2
gather_facts: true
tags: datatype
tasks:
- name: AnsibleUnsafeText
debug:
var: ansible_facts['distribution'] | type_debug
- name: dict
debug:
var: ansible_facts['eth0']['ipv4'] | type_debug
- name: List
debug:
var: ansible_facts['eth0']['ipv6'] | type_debug
Пример вывода:
ansible-playbook facts_data_type.yml
TASK [AnsibleUnsafeText] ****************************************************************************************************************************************************************************************
ok: [rocky.anslab.com] => {
"ansible_facts['distribution'] | type_debug": "AnsibleUnsafeText"
}
TASK [dict] *****************************************************************************************************************************************************************************************************
ok: [rocky.anslab.com] => {
"ansible_facts['eth0']['ipv4'] | type_debug": "dict"
}
TASK [List] *****************************************************************************************************************************************************************************************************
ok: [rocky.anslab.com] => {
"ansible_facts['eth0']['ipv6'] | type_debug": "list"
}
Фильтр фактов и Gather_subset
Вы можете применить фильтры, чтобы получить часть данных из выходных фактов. Допустим, если я хочу получить архитектуру машины, команда будет следующей.
ansible m2 -m setup -a "filter=ansible_architecture"
rocky.anslab.com | SUCCESS => {
"ansible_facts": {
"ansible_architecture": "x86_64",
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
Вы также можете фильтровать данные, используя шаблоны.
ansible m2 -m setup -a "filter=*architecture"
rocky.anslab.com | SUCCESS => {
"ansible_facts": {
"ansible_architecture": "x86_64",
"ansible_userspace_architecture": "x86_64",
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
Вы также можете использовать gather_subset
, чтобы получить указанное подмножество фактов. Например, если вам нужна только информация, связанная с сетью, вы можете использовать "gather_subset=network
".
ansible m2 -m setup -a "gather_subset=network"
Аналогично существуют и другие подмножества, такие как all
, min
, hardware
, network
и virtual
и т. д. По умолчанию установлено «all
».
Вы можете добавить к символу !
любое подмножество, которое не будет собирать конкретное подмножество. Например, приведенная ниже команда соберет все факты, кроме информации, связанной с сетью.
ansible m2 -m setup -a "gather_subset=!network"
Запись фактов в файл
Вы можете записать факты в файл, используя флаг --tree
. Путь к каталогу должен быть передан в качестве аргумента флага --tree
.
ansible all -m setup --tree /home/vagrant/facts
Здесь ansible соберет факты для всей группы и сохранит выходные данные с именем сервера в каталоге /home/vagrant/facts
.
ls -l ~/facts
total 68
-rw-rw-r-- 1 vagrant vagrant 21092 Apr 27 05:36 master.anslab.com
-rw-rw-r-- 1 vagrant vagrant 18336 Apr 27 05:36 rocky.anslab.com
-rw-rw-r-- 1 vagrant vagrant 21093 Apr 27 05:36 ubuntu.anslab.com
Использование модуля настройки в Playbook
Не все данные, собранные в фактах, будут использоваться в ваших сборниках сценариев. Таким образом, вы можете явно использовать модуль настройки и собрать интересующую вас часть данных.
Если вы посмотрите на книгу ниже, единственные данные, которые меня интересуют, — это информация о распределении управляемых узлов. Используя эту информацию, я написал условное утверждение.
- name: Explicitly using setup module
hosts: all
gather_facts: false
tasks:
- name: Setup Module
setup:
filter: ansible_distribution
- name: Doing something
debug:
msg: "Spotted RHEL based distro. Proceeding with activity..."
when: ansible_distribution | lower in ["rocky","redhat","centos"]
В выводе ниже вы можете видеть, что задачи выполняются только в Rocky Linux и пропускаются в дистрибутивах на базе Ubuntu.
TASK [Setup Module] ***********************************************************************************
ok: [rocky.anslab.com]
ok: [master.anslab.com]
ok: [ubuntu.anslab.com]
TASK [Doing something] ********************************************************************************
skipping: [master.anslab.com]
skipping: [ubuntu.anslab.com]
ok: [rocky.anslab.com] => {
"msg": "Spotted RHEL based distro. Proceeding with activity..."
}
Вы также можете использовать фильтры и gather_subset в сборнике сценариев.
- name: Applying filter
setup:
filter:
- 'ansible_distribution'
- 'ansible_eth[0-3]'
- name: Using subsets
setup:
gather_subset:
- '!all'
- 'network'
Изменение времени выполнения со сбором фактов и без него
Когда вы запускаете сборник сценариев на большом наборе управляемых хостов, сбор фактов может замедлить игру. Используя команду time
, вы можете проверить время выполнения плейбука с фактами и без них.
Вывод ниже показывает разницу во времени с фактами и без них. В моей книге игр меньше задач и всего 3 управляемых хоста, поэтому большой разницы во времени выполнения не будет.
# With facts
time ansible-playbook facts.yml
real0m3.096s
user0m1.264s
sys 0m0.340s
Without facts
time ansible-playbook facts.yml
real0m2.112s
user0m0.887s
sys 0m0.265s
Заключение
В этой статье мы обсудили, что такое факты и как запускать специальные команды с помощью модуля настройки, а также как явно использовать модуль настройки в сборнике сценариев.
Сбор фактов — трудоемкий процесс, когда вы сталкиваетесь с огромным количеством целей.