УДК 004.4
ББК 32.372
М42
М42 Бас Мейер, Лорин Хохштейн и Рене Мозер
Запускаем Ansible. Простой способ автоматизации управления конфигурациями
и развертыванием приложений. 3-е изд. / пер. с англ.
А. Н. Кисе лева – М.: ДМК Пресс, 2023. – 482 с.: ил.
ISBN 978-6-01763-867-2
Среди множества имеющихся инструментов управления конфигурациями
Ansible выделяется своими преимуществами, такими как небольшой
объем, отсутствие необходимости устанавливать что-либо на
управляемые хосты и простота в изучении и освоении.
Наиболее существенное отличие этого издания от предыдущего – добавление
шести новых глав, охватывающих применение контейнеров,
фреймворка Molecule, платформы автоматизации Ansible Automation
Platform и коллекций Ansible; приемы создания образов, поддержки облачной
инфраструктуры и реализации конвейеров CI/CD.
Книга предназначена разработчикам инструментов infrastructure as
a code для автоматизации задач по подготовке и конфигурированию
инфра структуры.
Copyright © 2023 Books.kz Limited Liability Partnership Authorized Russian
trans lation of the English edition of Ansible: Up and Running, 3rd Edition.
ISBN 9781098109158. Copyright © 2022 Bas Meijer.
Все права защищены. Любая часть этой книги не может быть воспроизведена
в какой бы то ни было форме и какими бы то ни было средствами без
письменного разрешения владельцев авторских прав.
Материал, изложенный в данной книге, многократно проверен. Но, поскольку
вероятность технических ошибок все равно существует, издательство не может гарантировать
абсолютную точность и правильность приводимых сведений. В связи
с этим издательство не несет ответственности за возможные ошибки, связанные
с использованием книги.
ISBN 978-1-098-10915-8 (англ.) © Bas Meijer, 2022
ISBN 978-6-01763-867-2 (казах.) © Оформление, перевод на русский язык, издание,
Books.kz, 2023
Стр.5
Оглавление
Предисловие к третьему изданию ............................................................16
Глава 1. Введение .........................................................................................20
Примечание о версиях .....................................................................................21
Ansible: область применения ...........................................................................22
Как работает Ansible .........................................................................................23
Какие преимущества дает Ansible? .................................................................24
Простота ..................................................................................................................24
Широта возможностей ...........................................................................................27
Защищенность ........................................................................................................30
Не слишком ли проста система Ansible? .........................................................33
Что я должен знать? ..........................................................................................33
О чем не рассказывается в этой книге ............................................................34
Поехали! ............................................................................................................34
Глава 2. Установка и настройка ..................................................................35
Установка Ansible ..............................................................................................35
Дополнительные зависимости ..............................................................................36
Запуск Ansible в контейнерах ................................................................................37
Версия Ansible для разработчиков ........................................................................37
Подготовка сервера для экспериментов .........................................................37
Использование Vagrant для подготовки сервера .................................................37
Передача информации о сервере в Ansible ..........................................................40
Упрощение задачи с помощью файла ansible.cfg ................................................43
Остановка тестового сервера ................................................................................46
Удобные настройки Vagrant .............................................................................46
Переадресация портов и частные IP-адреса ........................................................46
Включение переадресации агента ........................................................................48
Подготовка Docker ............................................................................................49
Подготовка локальной версии Ansible ............................................................49
Когда запускаются сценарии провайдеров ....................................................50
Плагины Vagrant ...............................................................................................50
vagrant-hostmanager ...............................................................................................50
vagrant-vbguest .......................................................................................................51
Настройка VirtualBox ........................................................................................51
Vagrantfile – это Ruby ........................................................................................51
Настройка промышленного окружения .........................................................54
Заключение .......................................................................................................55
Глава 3. Сценарии: начало ..........................................................................56
Подготовка ........................................................................................................56
Очень простой сценарий .................................................................................57
Файл конфигурации NGINX ...................................................................................58
Создание веб-страницы .........................................................................................59
Стр.6
6 Оглавление
Создание группы веб-серверов .............................................................................59
Запуск сценария .....................................................................................................60
Сценарии пишутся на YAML ............................................................................61
Начало файла ..........................................................................................................62
Конец файла............................................................................................................62
Комментарии ..........................................................................................................62
Отступы и пробельные строки ..............................................................................62
Строки .....................................................................................................................62
Булевы выражения .................................................................................................63
Списки .....................................................................................................................64
Словари ...................................................................................................................65
Многострочные строковые значения ...................................................................65
Чистый YAML вместо строковых аргументов.......................................................66
Структура сценария ..........................................................................................66
Операции ..........................................................................................................67
Задачи .....................................................................................................................69
Модули ....................................................................................................................70
Документация по модулям Ansible .......................................................................70
Резюме ....................................................................................................................71
Есть изменения? Отслеживание состояния хоста ..........................................71
Становимся знатоками: поддержка TLS .........................................................72
Создание сертификата TLS ....................................................................................72
Переменные ............................................................................................................73
Когда использовать кавычки в строках Ansible ...................................................73
Создание шаблона с конфигурацией NGINX ........................................................75
Циклы ......................................................................................................................76
Обработчики ...........................................................................................................77
Несколько фактов об обработчиках, которые необходимо помнить .................78
Тестирование ..........................................................................................................78
Проверка .................................................................................................................79
Сценарий ................................................................................................................79
Запуск сценария .....................................................................................................81
Заключение .......................................................................................................83
Глава 4. Реестр: описание серверов..........................................................84
Файл реестра .....................................................................................................85
Вводная часть: несколько машин Vagrant.......................................................85
Поведенческие параметры хостов в реестре ..................................................88
Переопределение значений по умолчанию в поведенческих параметрах .......90
Группы, группы и еще раз группы...................................................................90
Пример: развертывание приложения Django ......................................................92
Псевдонимы и порты .............................................................................................95
Группировка групп .................................................................................................95
Имена хостов с номерами (домашние питомцы и стадо) ...................................96
Переменные хостов и групп: внутренняя сторона реестра ...........................96
Переменные хостов и групп: создание собственных файлов .......................98
Динамический реестр ....................................................................................101
Стр.7
Оглавление 7
Плагины поддержки реестров .............................................................................101
Амазон EC2 ...........................................................................................................102
Диспетчер ресурсов Azure ...................................................................................102
Интерфейс сценария динамического реестра ...................................................102
Написание сценария динамического реестра ...................................................104
Деление реестра на несколько файлов..........................................................107
Добавление элементов во время выполнения с помощью
add_host и group_by ...................................................................................108
add_host .................................................................................................................108
group_by .................................................................................................................110
Заключение .....................................................................................................111
Глава 5. Переменные и факты .................................................................112
Определение переменных в сценариях ........................................................112
Определение переменных в отдельных файлах ................................................112
Структура каталогов ............................................................................................113
Вывод значений переменных ........................................................................113
Интерполяция переменных ................................................................................113
Регистрация переменных ..............................................................................114
Факты ..............................................................................................................118
Просмотр всех фактов, доступных для сервера .................................................119
Вывод подмножества фактов ..............................................................................120
Любой модуль может возвращать факты ...........................................................121
Локальные факты .................................................................................................122
Использование модуля set_fact для задания новой переменной .....................123
Встроенные переменные ...............................................................................123
hostvars ..................................................................................................................124
inventory_hostname ..............................................................................................125
groups ....................................................................................................................125
Установка переменных из командной строки .............................................126
Приоритет .............................................................................................................128
Заключение .....................................................................................................129
Глава 6. Введение в Mezzanine: тестовое приложение .......................130
Почему сложно развертывать приложения в промышленном окружении .....130
База данных PostgreSQL .................................................................................132
Сервер приложений Gunicorn ........................................................................133
Веб-сервер NGINX ...........................................................................................133
Диспетчер процессов Supervisor ...................................................................134
Заключение .....................................................................................................134
Глава 7. Развертывание Mezzanine с помощью Ansible ......................135
Вывод списка задач в сценарии ....................................................................135
Организация устанавливаемых файлов .......................................................136
Переменные и скрытые переменные ...........................................................137
Установка большого количества пакетов ......................................................139
Добавление выражения become в задачу ......................................................139
Обновление кеша диспетчера пакетов apt ...................................................140
Стр.8
8 Оглавление
Извлечение проекта из репозитория Git ......................................................141
Установка Mezzanine и других пакетов в virtualenv .....................................143
Короткое отступление: составные аргументы задач ...................................146
Настройка базы данных .................................................................................148
Создание файла local_settings.py из шаблона ...............................................149
Выполнение команд django-manage .............................................................152
Запуск своих сценариев на Python в контексте приложения ......................153
Настройка конфигурационных файлов служб ...................................................156
Активация конфигурации NGINX .................................................................159
Установка сертификатов TLS .........................................................................160
Установка задания cron для Twitter ...............................................................161
Сценарий целиком .........................................................................................162
Запуск сценария на машине Vagrant .............................................................167
Устранение проблем .......................................................................................168
Не получается извлечь файлы из репозитория Git ............................................168
Недоступен хост с адресом 192.168.33.10.nip.io .................................................168
Bad Request (400) ..................................................................................................169
Заключение .....................................................................................................169
Глава 8. Отладка сценариев Ansible ........................................................170
Информативные сообщения об ошибках .....................................................170
Отладка ошибок с SSH-подключением .........................................................171
Типичные проблемы с SSH ............................................................................175
PasswordAuthentication no ...................................................................................175
Подключение по SSH с учетными данными другого пользователя .................175
Ошибка проверки ключа хоста ...........................................................................176
Частные сети .........................................................................................................177
Модуль debug ..................................................................................................177
Интерактивный отладчик сценариев ............................................................177
Модуль assert ...................................................................................................179
Проверка сценария перед запуском ..............................................................182
Проверка синтаксиса ...........................................................................................182
Список хостов .......................................................................................................183
Список задач .........................................................................................................183
Режим проверки ...................................................................................................183
Вывод изменений в файлах .................................................................................184
Теги.... ...................................................................................................................185
Ограничение обслуживаемых хостов .................................................................186
Заключение .....................................................................................................186
Глава 9. Роли: масштабирование сценариев .........................................187
Базовая структура роли ..................................................................................187
Пример: развертывание Mezzanine с использованием ролей ....................189
Использование ролей в сценариях .....................................................................189
Предварительные и заключительные задачи ....................................................190
Роль database для развертывания базы данных .................................................191
Роль mezzanine для развертывания Mezzanine ..................................................195
Создание файлов и каталогов ролей с помощью ansible-galaxy .................199
Стр.9
Оглавление 9
Зависимые роли ..............................................................................................200
Ansible Galaxy ..................................................................................................201
Веб-интерфейс .....................................................................................................201
Интерфейс командной строки ............................................................................202
Требования к оформлению ролей на практике .................................................203
Как поделиться своей ролью ...............................................................................204
Заключение .....................................................................................................204
Глава 10. Сложные сценарии....................................................................205
Решение проблем с неидемпотентными командами ..................................205
Фильтры ..........................................................................................................209
Фильтр default ......................................................................................................209
Фильтры для зарегистрированных переменных ...............................................209
Фильтры для путей к файлам ..............................................................................210
Создание собственного фильтра .........................................................................211
Подстановки ....................................................................................................212
file..... .....................................................................................................................214
pipe.... ....................................................................................................................215
env...... ...................................................................................................................215
password ................................................................................................................215
template .................................................................................................................216
csvfile .....................................................................................................................216
dig...... ....................................................................................................................217
redis..... ..................................................................................................................218
Написание собственного плагина подстановки ................................................219
Сложные циклы ..............................................................................................220
Плагины with_* ................................................................................................221
with_lines ...............................................................................................................221
with_fileglob ...........................................................................................................222
with_dict ................................................................................................................222
Циклические конструкции как плагины подстановок ......................................223
Управление циклами ......................................................................................224
Выбор имени переменной цикла ........................................................................224
Управление выводом ...........................................................................................225
Импортирование и подключение .................................................................226
Динамическое подключение ...............................................................................228
Подключение ролей .............................................................................................228
Поток управления роли .......................................................................................229
Блоки ...............................................................................................................230
Обработка ошибок с помощью блоков .........................................................230
Шифрование конфиденциальных данных при помощи Vault ....................234
Шифрование с использованием разных паролей ..............................................236
Заключение .....................................................................................................237
Глава 11. Управление хостами, задачами и обработчиками ..............238
Шаблоны для выбора хостов ..........................................................................238
Ограничение обслуживаемых хостов ............................................................239
Запуск задачи на управляющей машине ............................................................239
Стр.10
10 Оглавление
Сбор фактов вручную .....................................................................................240
Получение IP-адреса хоста ............................................................................240
Запуск задачи на сторонней машине ......................................................................... 242
Последовательное выполнение задачи на хостах по одному .....................242
Пакетная обработка хостов ............................................................................244
Однократный запуск ......................................................................................245
Выбор задач для запуска ................................................................................245
step..... ...................................................................................................................246
start-at-task ...........................................................................................................246
Запуск действий с тегами ....................................................................................246
Пропуск действий с тегами .................................................................................247
Стратегии выполнения ..................................................................................247
linear ......................................................................................................................248
free... ......................................................................................................................249
Улучшенные обработчики .............................................................................251
Обработчики в pre_tasks и post_tasks ..................................................................251
Принудительный запуск обработчиков ..............................................................253
Метакоманды .......................................................................................................253
Уведомление обработчиков из обработчиков....................................................254
Выполнение обработчиков по событиям ...........................................................255
Выполнение обработчиков по событиям: случай SSL .......................................256
Заключение .....................................................................................................261
Глава 12. Управление хостами Windows ................................................262
Подключение к Windows ................................................................................262
PowerShell ........................................................................................................263
Модули поддержки Windows .........................................................................266
Наша машина для разработки на Java ...........................................................266
Добавление локального пользователя ..........................................................268
Функции Windows ...........................................................................................269
Установка программного обеспечения с помощью Chocolatey ..................269
Настройки для поддержки Java......................................................................270
Обновление Windows .....................................................................................271
Заключение .....................................................................................................272
Глава 13. Ansible и контейнеры ...............................................................273
Kubernetes .......................................................................................................274
Жизненный цикл приложения Docker ..........................................................275
Реестры ............................................................................................................275
Ansible и Docker ..............................................................................................276
Подключение к демону Docker ......................................................................276
Пример применения: Ghost ...........................................................................277
Запуск контейнера Docker на локальной машине ........................................277
Создание образа из Dockerfile........................................................................278
Отправка образа в реестр Docker ..................................................................280
Управление несколькими контейнерами на локальной машине ...............281
Запрос информации о локальном образе .....................................................283
Развертывание приложения в контейнере Docker .......................................284
Стр.11
Оглавление 11
MySQL ....................................................................................................................284
Развертывание базы данных Ghost .....................................................................285
Веб-сервер ............................................................................................................286
Веб-сервер: Ghost .................................................................................................287
Веб-сервер: NGINX ...............................................................................................288
Удаление контейнеров .........................................................................................289
Заключение .....................................................................................................289
Глава 14. Обеспечение качества с помощью Molecule .......................290
Установка и настройка ...................................................................................290
Настройка драйверов в Molecule ...................................................................291
Создание роли Ansible ....................................................................................292
Сценарии Molecule .........................................................................................293
Желаемое состояние ............................................................................................293
Настройка сценариев в Molecule .........................................................................294
Управление виртуальными машинами ..............................................................294
Управление контейнерами ..................................................................................295
Команды Molecule ..........................................................................................297
Статический анализ .......................................................................................298
yamllint ..................................................................................................................299
ansible-lint .............................................................................................................299
ansible-later ...........................................................................................................301
Верификаторы ................................................................................................301
Ansible ...................................................................................................................302
Goss... .....................................................................................................................302
TestInfra .................................................................................................................304
Заключение .....................................................................................................305
Глава 15. Коллекции ..................................................................................306
Установка коллекций ......................................................................................306
Вывод списка коллекций................................................................................308
Использование коллекций в сценариях ........................................................308
Разработка коллекций ....................................................................................309
Заключение .....................................................................................................311
Глава 16. Создание образов .....................................................................312
Создание образов с помощью Packer ............................................................312
Vagrant VirtualBox VM .....................................................................................312
Объединение Packer и Vagrant .............................................................................315
Облачные образы .................................................................................................316
Google Cloud Platform ...........................................................................................317
Azure ......................................................................................................................319
Amazon EC2 ...........................................................................................................320
Сценарий Ansible ..................................................................................................322
Образ Docker: GCC 11 ......................................................................................323
Заключение .....................................................................................................325
Глава 17. Облачная инфраструктура .......................................................326
Терминология .................................................................................................330
Стр.12
12 Оглавление
Экземпляр .............................................................................................................330
Образ машины Amazon ........................................................................................330
Теги.. ......................................................................................................................331
Учетные данные пользователя ......................................................................331
Переменные окружения ......................................................................................333
Файлы конфигурации ..........................................................................................333
Необходимое условие: библиотека Boto3 для Python ..................................333
Динамическая инвентаризация ....................................................................334
Кеширование реестра ..........................................................................................336
Другие параметры настройки .............................................................................336
Определение динамических групп с помощью тегов ..................................337
Присваивание тегов имеющимся ресурсам .......................................................337
Создание более точных названий групп ............................................................338
Виртуальные частные облака ........................................................................339
Конфигурирование ansible.cfg для использования с ES2 .............................340
Запуск новых экземпляров ............................................................................340
Пары ключей EC2 ............................................................................................342
Создание нового ключа .......................................................................................342
Выгрузка открытого ключа ..................................................................................342
Группы безопасности .....................................................................................343
Разрешенные IP-адреса .......................................................................................344
Порты групп безопасности ..................................................................................344
Получение последней версии AMI ................................................................345
Добавление нового экземпляра в группу .....................................................346
Ожидание запуска сервера ............................................................................347
Подведение итогов .........................................................................................348
Создание виртуального частного облака ......................................................351
Динамическая инвентаризация и VPC ...............................................................355
Заключение .....................................................................................................355
Глава 18. Плагины обратного вызова .....................................................356
Плагины стандартного вывода ......................................................................356
ARA.. ......................................................................................................................357
debug .....................................................................................................................358
default ....................................................................................................................359
dense ......................................................................................................................359
json.... ....................................................................................................................359
minimal ..................................................................................................................359
null... ......................................................................................................................359
oneline ...................................................................................................................359
Плагины уведомлений и агрегирования ......................................................360
Зависимости Python .............................................................................................361
foreman ..................................................................................................................361
jabber .....................................................................................................................361
junit.. ......................................................................................................................362
log_plays ................................................................................................................363
logentries ...............................................................................................................363
Стр.13
Оглавление 13
logstash ..................................................................................................................363
mail... .....................................................................................................................363
profile_roles ...........................................................................................................364
profile_tasks ...........................................................................................................364
say..... .....................................................................................................................365
slack.... ...................................................................................................................365
splunk ....................................................................................................................365
timer.. .....................................................................................................................366
Заключение .....................................................................................................366
Глава 19. Собственные модули ................................................................367
Пример: проверка доступности удаленного сервера ...................................367
Использование модуля script вместо написания своего модуля ......................368
can_reach как модуль ............................................................................................369
Когда следует разрабатывать модули? ..........................................................369
Где хранить свои модули ................................................................................370
Копирование модуля на хост ...............................................................................370
Создание файла с аргументами на хосте (для модулей не на языке Python) .....371
Вызов модуля ........................................................................................................371
Как Ansible вызывает модули ........................................................................370
Генерация автономного сценария на Python с аргументами
(только модули на Python) ..........................................................................370
Ожидаемый вывод ..........................................................................................372
Ожидаемые выходные переменные ...................................................................372
Реализация модулей на Python......................................................................373
Анализ аргументов ..............................................................................................375
Доступ к параметрам ...........................................................................................375
Импортирование вспомогательного класса AnsibleModule ..............................376
Свойства аргументов ...........................................................................................376
AnsibleModule: параметры метода инициализатора.........................................379
Возврат признака успешного завершения или неудачи ...................................383
Вызов внешних команд .......................................................................................383
Режим проверки (пробный прогон) ....................................................................384
Документирование модуля ............................................................................385
Отладка модуля ...............................................................................................387
Создание модуля на Bash ...............................................................................388
Альтернативное местоположение интерпретатора Bash ............................390
Заключение .....................................................................................................391
Глава 20. Ускорение работы Ansible .......................................................392
Мультиплексирование SSH и ControlPersist .................................................392
Включение мультиплексирования SSH вручную ...............................................393
Параметры мультиплексирования SSH в Ansible ..............................................395
Еще о настройке SSH ......................................................................................396
Рекомендации по выбору алгоритмов ...............................................................396
Конвейерный режим ......................................................................................398
Включение конвейерного режима ......................................................................398
Настройка хостов для поддержки конвейерного режима .................................399
Стр.14
14 Оглавление
Mitogen для Ansible .........................................................................................401
Кеширование фактов ......................................................................................401
Кеширование фактов в файлах JSON ..................................................................403
Кеширование фактов в Redis ...............................................................................403
Кеширование фактов в Memcached .....................................................................404
Параллелизм ...................................................................................................405
Асинхронное выполнение задач с помощью async .....................................406
Заключение .....................................................................................................407
Глава 21. Сети и безопасность .................................................................408
Управление сетевыми устройствами ............................................................408
Список поддерживаемых производителей сетевого оборудования ................409
Ansible Connection для автоматизации управления сетевыми
устройствами ...............................................................................................409
Привилегированный режим ................................................................................410
Реестр сетевых устройств ....................................................................................411
Примеры использования автоматизации управления сетевыми
устройствами ...............................................................................................412
Безопасность ...................................................................................................412
Соблюдение требований соответствия ...............................................................413
Защищено, но не безопасно ................................................................................414
Теневые ИТ-ресурсы ............................................................................................418
Солнечные ИТ-ресурсы ........................................................................................418
Нулевое доверие ...................................................................................................419
Заключение .....................................................................................................420
Глава 22. CI/CD и Ansible ...........................................................................421
Непрерывная интеграция ..............................................................................421
Элементы системы непрерывной интеграции ..................................................422
Jenkins и Ansible ...................................................................................................428
Обкатка ............................................................................................................434
Плагин Ansible ................................................................................................435
Плагин Ansible Tower ......................................................................................436
Заключение .....................................................................................................438
Глава 23. Ansible Automation Platform ...................................................439
Модели подписки ...........................................................................................442
Пробная версия Ansible Automation Platform .....................................................443
Какие задачи решает Ansible Automation Platform ......................................444
Управление доступом ..........................................................................................444
Проекты ...........................................................................................................445
Управление инвентаризацией ............................................................................446
Запуск заданий из шаблонов ...............................................................................447
RESTful API ......................................................................................................449
AWX.AWX .........................................................................................................450
Установка ..............................................................................................................451
Создание организации ........................................................................................452
Создание реестра ............................................................................................453
Запуск сценария с помощью шаблона задания .................................................454
Стр.15
Оглавление 15
Запуск Ansible в контейнерах ........................................................................455
Создание сред выполнения .................................................................................455
Заключение .....................................................................................................457
Глава 24. Практические рекомендации .................................................458
Простота, модульность и сочетаемость ........................................................458
Организуйте контент .....................................................................................459
Отделяйте реестры от проектов ....................................................................459
Отделяйте роли и коллекции .........................................................................459
Сценарии .........................................................................................................460
Оформляйте код .............................................................................................460
Снабжайте тегами и тестируйте все, что только возможно ........................461
Описывайте желаемое состояние ..................................................................461
Доставляйте непрерывно ...............................................................................461
Обеспечивайте безопасность.........................................................................461
Контролируйте развертывание .....................................................................462
Оценивайте эффективность ..........................................................................462
Контрольные показатели ...............................................................................463
Заключительные слова ...................................................................................463
Библиография ............................................................................................465
Об авторах ..................................................................................................467
Об изображении на обложке ...................................................................468
Предметный указатель .............................................................................469
Стр.16