Поиск по сайту:

Объяснение фактов 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

Заключение

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

Сбор фактов — трудоемкий процесс, когда вы сталкиваетесь с огромным количеством целей.

Статьи по данной тематике