Несколько дней новогоднего волшебства:
Успейте начать обучение в 2018-ом году со скидкой до 30%!
Выбрать курс

Модуль setup и Gathers facts в Ansible

DevOps_Deep_17.08_Site.png

В системе управления конфигурациями Ansible есть специальный модуль setup. Он выполняется первым, собирая информацию (Gathers facts) обо всех подключённых узлах (нодах). При выполнении модуля на хосте он собирает разные факты, включая дисковое пространство, версию и тип операционной системы, hostname машины, количество доступной памяти, архитектуру процессора, IP-адреса, сетевые интерфейсы и их состояние.

Собранная системная информация фиксируется в виде переменных, которые доступны только для чтения. Полученные факты можно в дальнейшем использовать в коде и сценариях плейбуков в своих целях. Например, вы можете писать условия в коде, при которых будут вноситься те либо иные изменения в зависимости от типа и версии операционной системы.

Посмотреть, какая информация собирается модулем setup и в какие переменные она упаковывается, можно следующим образом (вывод частично обрезан):

ansible <myhost> -m setup
localhost | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "10.20.30.40"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::250:56ff:fe59:aa5e"
        ], 
        "ansible_apparmor": {
            "status": "disabled"
        }, 
        "ansible_architecture": "x86_64", 
        "ansible_bios_date": "04/05/2016", 
        "ansible_bios_version": "6.00", 
        "ansible_cmdline": {
            "BOOT_IMAGE": "/vmlinuz-3.10.0-862.3.2.el7.x86_64", 
            "LANG": "en_US.UTF-8", 
            "crashkernel": "auto", 
            "net.ifnames": "0", 
            "quiet": true, 
            "rd.lvm.lv": "rootvg/root", 
            "rhgb": true, 
            "ro": true, 
            "root": "/dev/mapper/rootvg-root"
        }, 
        "ansible_distribution": "RedHat", 
        "ansible_distribution_file_parsed": true, 
        "ansible_distribution_file_path": "/etc/redhat-release", 
        "ansible_distribution_file_variety": "RedHat", 
        "ansible_distribution_major_version": "7", 
        "ansible_distribution_release": "Maipo", 
        "ansible_distribution_version": "7.5", 
        "ansible_dns": {
            "nameservers": [
                "8.8.8.8", 
                "8.8.4.4"
            ]
        }, 
        "ansible_local": {}, 
        "ansible_lsb": {}, 
        "ansible_machine": "x86_64", 
        "ansible_machine_id": "c120c1e3c00b442cabbab1f5a67a23c2", 
        "ansible_memfree_mb": 60, 
        "ansible_memory_mb": {
            "nocache": {
                "free": 516, 
                "used": 476
            }, 
            "real": {
                "free": 60, 
                "total": 992, 
                "used": 932
            }, 
            "swap": {
                "cached": 2, 
                "free": 1972, 
                "total": 2045, 
                "used": 73
            }
        }, 
        "ansible_memtotal_mb": 992, 
        "ansible_nodename": "mynode-host", 
        "ansible_os_family": "RedHat", 
        "ansible_pkg_mgr": "yum", 
        "ansible_processor": [
            "0", 
            "GenuineIntel", 
            "Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz"
        ], 
        "ansible_processor_cores": 1, 
        "ansible_processor_count": 1, 
        "ansible_processor_threads_per_core": 1, 
        "ansible_processor_vcpus": 1, 
        "ansible_product_name": "VMware Virtual Platform", 
        "ansible_product_serial": "NA", 
        "ansible_product_uuid": "NA", 
        "ansible_product_version": "None", 
        "ansible_python_version": "2.7.5", 
        "ansible_system_capabilities_enforced": "True", 
        "ansible_system_vendor": "VMware, Inc.", 
        "ansible_uptime_seconds": 2935287, 
        "ansible_user_dir": "/home/serjs", 
        "ansible_userspace_architecture": "x86_64", 
        "ansible_userspace_bits": "64", 
        "ansible_virtualization_role": "guest", 
        "ansible_virtualization_type": "VMware", 
        "gather_subset": [
            "all"
        ], 
        "module_setup": true
    }, 
    "changed": false
}

В целом модуль setup — очень полезный инструмент

Однако нельзя не учитывать, что на выполнение сбора системной информации уходит определённое время. И если код плейбука, который будет применяться на сервере, никак не будет использовать эти факты, модуль лучше отключить. В результате чего переменные собираться не будут в рамках выполнения всего плейбука, что сэкономит время. Это может быть важно, например, если вы используете Ansible для деплоя, когда каждые пару секунд влияют на скорость внесения изменений.

Отключение модуля setup не вызывает сложностей, причём управление включением/выключением выполняется на уровне всего плейбука. Кроме того, в ansible.cfg можно управлять его поведением по умолчанию.

---
- hosts: appservers
  gather_facts: false

  vars_files:
    - "{{ inventory_dir }}/credentials.yml"

  tasks:
...

А как вы используете Gathers facts? Пишите в комментариях!

И если хотите узнать об Ansible более подробно, записывайтесь на курс «DevOps практики и инструменты» в OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться