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

Ad-Hoc Основы автоматизации в Ansible

Ansible – консольная утилита для настройки серверов и деплоя приложений. Если смотреть в целом, то она просто выполняет запросы на удаленных серверах, автоматизируя различные рутинные операции, например, установку и обновление пакетов, первоначальную подготовку машины для кода приложения и так далее.

У Ansible несколько режимов работы. Самый простой - ad-hoc, когда запрос к серверу выполняется напрямую из командной строки, без создания дополнительных файлов. Для выполнения такого запроса нам понадобится имя сервера или его ip-адрес. В примерах этого урока используется ip-адрес 157.230.82.133, в вашем случае это будет что-то свое. Кроме этого, сервер должен быть доступен для подключения по SSH суперпользователю (root).

# Проверяет доступность сервера по ip-адресу
# all – запрос выполняется для всех указанных машин
# 157.230.82.133 – ip-адрес моей машины. В вашем случае будет другой
# запятая в конце не ошибка, так нужно для работы Ansible
# root – пользователь для подключения по ssh
# ping – используемая команда (модуль ansible)
ansible all -i '157.230.82.133, ' -u root -m ping

После выполнения этой команды, Ansible покажет ответ от сервера:

# В случае, если доступ есть
157.230.82.133 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

# В случае, если доступа нет
# Здесь использовалось неправильное имя пользователя
157.230.82.133 | UNREACHABLE! => {
    "changed": false,
    "msg": "Failed to connect to the host via ssh: unknown@157.230.82.133: Permission denied (publickey).",
    "unreachable": true
}

В примере выше выполняется соединение с сервером по ssh, на котором запускается команда ping. За ее запуск отвечает одноименный модуль ping входящий в состав Ansible. Модули в Ansible выполняют команды на удаленных машинах. На протяжении следующих уроков мы познакомимся с десятком других самых часто используемых модулей для работы. Один из них называется command, он позволяет выполнить произвольную команду на сервере. Проверим с ее помощью сколько времени запущен сервер (время с последней перезагрузки), за это в Ubuntu отвечает команда uptime:

# Модуль command запускает на удаленной машине команду uptime
# -a – означает аргумент. В случае модуля command это то, что запустится на удаленной машине
ansible all -i '157.230.82.133, ' -u root -m command -a 'uptime'
157.230.82.133 | CHANGED | rc=0 >>
 06:12:48 up 11 days, 21:53,  1 user,  load average: 0.04, 0.04, 0.01
# На момент написания урока сервер находился в строю 11 дней

Модуль command в режиме Ad-Hoc подразумевается по умолчанию, то есть его можно пропустить:

# Тоже самое что и запуск выше
ansible all -i '157.230.82.133, ' -u root -a 'uptime'

Файл инвентаризации

Указание ip-адреса напрямую в командах Ansible — не очень удобный способ управления инфраструктурой. Во-первых, придется запомнить адрес и передавать его всем остальным членам команды. Во-вторых, серверов может быть больше одного. Чтобы не указывать адрес каждый раз, Ansible предлагает создать файл инвентаризации для описания инфраструктуры. В простейшем случае в этом файле указывается список ip адресов, по одному на строчку:

157.230.82.133
# Именем может быть доменное имя, что удобнее
# имена понятнее и не завязаны на ip-адрес, который может поменяться
ec2-3-17-186-111.us-east-2.compute.amazonaws.com
# тут другой адрес
# тут еще один

Сам файл имеет формат ini, но у него нет фиксированного имени. Для удобства назовем его inventory.ini. С этим файлом запуск Ansible в Ad-hoc режиме меняется на:

# -i – означает inventory
ansible all -i inventory.ini -u root -m ping

Ansible не просто выполняет команды на всех серверах, но и делает это одновременно. Ошибка выполнения команды на одном из серверов не останавливает выполнение. Ansible дойдет до конца и оповестит, о том где команда выполнилась успешно, а где нет.

Файл инвентаризации хранят в git-репозитории. Обычно прямо вместе с проектом. Если проект разделен на разные репозитории, то для управления инфраструктурой создают отдельный git-репозиторий, в котором работают администраторы и возможно разработчики. Здесь уже зависит от того, есть ли в компании культура DevOps.


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

  1. Выполните все команды урока с вашей локальной машины подставляя везде IP-адрес созданного сервера

  2. Создайте репозиторий, создайте файл inventory.ini и добавьте в него IP-адрес созданного сервера.

  3. Добавьте в Makefile ad-hoc команду с пингом сервера. Подробнее про Makefile

  4. Залейте изменения на Github


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

  1. Документация по ad-hoc

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Отправляя форму, вы принимаете «Соглашение об обработке персональных данных» и условия «Оферты», а также соглашаетесь с «Условиями использования»