- 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
Теперь факты собираться не будут.
Самостоятельная работа
- Создайте плейбук для установки Git. В плейбуке отключите сбор фактов
- Выполните плейбук, сравните скорость выполнения плейбука со сбором фактов и без
- Запушьте изменения на Github
Дополнительные материалы
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты
Для полного доступа к курсу нужен базовый план
Базовый план откроет полный доступ ко всем курсам, упражнениям и урокам Хекслета, проектам и пожизненный доступ к теории пройденных уроков. Подписку можно отменить в любой момент.