Зарегистрируйтесь для доступа к 15+ бесплатным курсам по программированию с тренажером

Факты Основы автоматизации в Ansible

- hosts: dbservers
  tasks:
    - name: update postgresql config
      ansible.builtin.template:
        src: templates/postgresql.conf.j2
        dest: /var/tmp/postgresql.conf

В этом примере у нас есть конфиг для postgresql - templates/postgresql.conf.j2, в котором настраивается множество различных буферов. И мы хотим, чтобы один из них зависел от настроек целевой машины, например, использовал 10% от её оперативной памяти. Для этого необходимо получить данные о сервере, на котором происходит запуск. В Ansible есть специальный модуль setup. В его задачи входит сбор информации о целевой машине. Запустим и посмотрим, что он из себя представляет:

ansible dbservers -i inventory.ini -m setup | less
ec2-18-216-178-214.us-east-2.compute.amazonaws.com | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [],
        "ansible_all_ipv6_addresses": [
            "fe80::aede:48ff:fe00:1122%en5",
            "fe80::8038:cb42:6c17:775c%utun0",
            "fe80::5b76:5b55:f705:4331%utun1"
        ],
        "ansible_ap1": {
            "device": "ap1",
            "flags": [
                "BROADCAST",
                "SIMPLEX",
                "MULTICAST"
            ],
...

В выводе мы видим большую структуру данных и сверху слово ansible_facts. В Ansible существует понятие facts (факты). Это и есть информация о тех машинах, на которых происходит запуск. Факты - статическая информация о сервере: операционная система, процессор, память, настройка сети, переменные окружения, интерфейсы и т.д. В плейбуках она оказывается в виде обычных переменных, которые можно использовать и подставлять. Это очень удобно.

Как это работает. Все факты хранятся внутри переменной ansible_facts. Используем ее в шаблоне templates/postgresql.conf.j2 для того, чтобы определить размер нашего буфера:

# Так мы задаём переменную и сообщаем, что буфер должен
# использовать десятую часть от общего объёма памяти
buffer: "{{ ansible_facts['memtotal_mb'] / 10 }}"

По умолчанию Ansible регистрирует как переменные факты, которые будут находиться на самом верхнем уровне в переменную с префиксом ansible_. Пример выше можно записать следующим образом:

# Переменная была зарегистрирована Ansible благодаря сбору фактов
buffer: "{{ ansible_memtotal_mb / 10 }}"

При запуске плейбуков по умолчанию факты собираются первой задачей. Для её выполнения ничего дополнительно делать не нужно. Иногда это может мешать, т.к. сбор фактов не моментальная операция. Если для выполнения сценариев информация о целевой машине не нужна, то сбор фактов можно отключить. Для этого в плейбуке под хостами нужно указать значение gather_facts: no:

- hosts: webservers
  gather_facts: no
  tasks:
    - name: install redis server
      ansible.builtin.apt:
        name: redis-server
        state: present
        update_cache: yes

Теперь факты собираться не будут.


Самостоятельная работа

  1. Выполните ad-hoc команду для удаленных серверов с модулем setup. Изучите вывод.
  2. Выключите сбор фактов для установки и удаления Git
  3. Перенесите переменную server_name из переменных хостов в переменные группы webservers. Задайте этой переменной имя хоста hostname, которое берётся из фактов
  4. Выполните плейбук с настройкой Nginx, проверьте, при открытии страницы в браузере на разных хостах выводится разное имя сервера
  5. Залейте изменения на Github

В результате выполения плейбука на HTML-странице будет выводиться имя сервера

<html lang="en"><head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Hello World!</title>
</head>
<body>
  <h1>Hello World!</h1>
  <h2>This is server ubuntu-s-1vcpu-1gb-fra1-02!</h2>


</body></html>

Дополнительные материалы

  1. Ansible facts / Документация Ansible

Аватары экспертов Хекслета

Остались вопросы? Задайте их в разделе «Обсуждение»

Вам ответят команда поддержки Хекслета или другие студенты.

Ошибки, сложный материал, вопросы >
Нашли опечатку или неточность?

Выделите текст, нажмите ctrl + enter и отправьте его нам. В течение нескольких дней мы исправим ошибку или улучшим формулировку.

Что-то не получается или материал кажется сложным?

Загляните в раздел «Обсуждение»:

  • задайте вопрос. Вы быстрее справитесь с трудностями и прокачаете навык постановки правильных вопросов, что пригодится и в учёбе, и в работе программистом;
  • расскажите о своих впечатлениях. Если курс слишком сложный, подробный отзыв поможет нам сделать его лучше;
  • изучите вопросы других учеников и ответы на них. Это база знаний, которой можно и нужно пользоваться.

Об обучении на Хекслете

Для полного доступа к курсу нужен базовый план

Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.

Получить доступ
900
упражнений
2000+
часов теории
3200
тестов

Открыть доступ

Курсы программирования для новичков и опытных разработчиков. Начните обучение бесплатно.

  • 130 курсов, 2000+ часов теории
  • 900 практических заданий в браузере
  • 360 000 студентов
Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Наши выпускники работают в компаниях:

Логотип компании Альфа Банк
Логотип компании Aviasales
Логотип компании Yandex
Логотип компании Tinkoff

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»