Среди множества имеющихся инструментов управления конфигурациями Ansible выделяется своими преимуществами, такими как небольшой объем, отсутствие необходимости устанавливать что-либо на управляемые хосты и простота в изучении и освоении.
Наиболее существенное отличие этого издания от предыдущего – добавление шести новых глав, охватывающих применение контейнеров, фреймворка Molecule, платформы автоматизации Ansible Automation Platform и коллекций Ansible; приемы создания образов, поддержки облачной инфраструктуры и реализации конвейеров CI/CD.
Книга предназначена разработчикам инструментов infrastructure as a code для автоматизации задач по подготовке и конфигурированию инфраструктуры.
Author(s): Бас Мейер, Лорин Хохштейн, Рене Мозер
Edition: 3
Publisher: ДМК Пресс
Year: 2023
Language: Russian
Commentary: Publisher's PDF
Pages: 482
City: М.
Tags: Cloud Computing; Security; Docker; Best Practices; Networking; Kubernetes; Automation; YAML; Ansible; Quality Assurance; Configuration Management; Molecule; CI/CD
Предисловие к третьему изданию
Глава 1
Введение
Примечание о версиях
Ansible: область применения
Как работает Ansible
Какие преимущества дает Ansible?
Простота
Широта возможностей
Защищенность
Не слишком ли проста система Ansible?
Что я должен знать?
О чем не рассказывается в этой книге
Поехали!
Глава 2
Установка и настройка
Установка Ansible
Дополнительные зависимости
Запуск Ansible в контейнерах
Версия Ansible для разработчиков
Подготовка сервера для экспериментов
Использование Vagrant для подготовки сервера
Передача информации о сервере в Ansible
Упрощение задачи с помощью файла ansible.cfg
Остановка тестового сервера
Удобные настройки Vagrant
Переадресация портов и частные IP-адреса
Включение переадресации агента
Подготовка Docker
Подготовка локальной версии Ansible
Когда запускаются сценарии провайдеров
Плагины Vagrant
vagrant-hostmanager
vagrant-vbguest
Настройка VirtualBox
Vagrantfile – это Ruby
Настройка промышленного окружения
Заключение
Глава 3
Сценарии: начало
Подготовка
Очень простой сценарий
Файл конфигурации NGINX
Создание веб-страницы
Создание группы веб-серверов
Запуск сценария
Сценарии пишутся на YAML
Начало файла
Конец файла
Комментарии
Отступы и пробельные строки
Строки
Булевы выражения
Списки
Словари
Многострочные строковые значения
Чистый YAML вместо строковых аргументов
Структура сценария
Операции
Задачи
Модули
Документация по модулям Ansible
Резюме
Есть изменения? Отслеживание состояния хоста
Становимся знатоками: поддержка TLS
Создание сертификата TLS
Переменные
Когда использовать кавычки в строках Ansible
Создание шаблона с конфигурацией NGINX
Циклы
Обработчики
Несколько фактов об обработчиках, которые необходимо помнить
Тестирование
Проверка
Сценарий
Запуск сценария
Заключение
Глава 4
Реестр: описание серверов
Файл реестра
Вводная часть: несколько машин Vagrant
Поведенческие параметры хостов в реестре
Переопределение значений по умолчанию в поведенческих параметрах
Группы, группы и еще раз группы
Пример: развертывание приложения Django
Псевдонимы и порты
Группировка групп
Имена хостов с номерами (домашние питомцы и стадо)
Переменные хостов и групп: внутренняя сторона реестра
Переменные хостов и групп: создание собственных файлов
Динамический реестр
Плагины поддержки реестров
Амазон EC2
Диспетчер ресурсов Azure
Интерфейс сценария динамического реестра
Написание сценария динамического реестра
Деление реестра на несколько файлов
Добавление элементов во время выполнения с помощью add_host и group_by
add_host
group_by
Заключение
Глава 5
Переменные и факты
Определение переменных в сценариях
Определение переменных в отдельных файлах
Структура каталогов
Вывод значений переменных
Интерполяция переменных
Регистрация переменных
Факты
Просмотр всех фактов, доступных для сервера
Вывод подмножества фактов
Любой модуль может возвращать факты
Локальные факты
Использование модуля set_fact для задания новой переменной
Встроенные переменные
hostvars
inventory_hostname
groups
Установка переменных из командной строки
Приоритет
Заключение
Глава 6
Введение в Mezzanine: тестовое приложение
Почему сложно развертывать приложения в промышленном окружении
База данных PostgreSQL
Сервер приложений Gunicorn
Веб-сервер NGINX
Диспетчер процессов Supervisor
Заключение
Глава 7
Развертывание Mezzanine с помощью Ansible
Вывод списка задач в сценарии
Организация устанавливаемых файлов
Переменные и скрытые переменные
Установка большого количества пакетов
Добавление выражения become в задачу
Обновление кеша диспетчера пакетов apt
Извлечение проекта из репозитория Git
Установка Mezzanine и других пакетов в virtualenv
Короткое отступление: составные аргументы задач
Настройка базы данных
Создание файла local_settings.py из шаблона
Выполнение команд django-manage
Запуск своих сценариев на Python в контексте приложения
Настройка конфигурационных файлов служб
Активация конфигурации NGINX
Установка сертификатов TLS
Установка задания cron для Twitter
Сценарий целиком
Запуск сценария на машине Vagrant
Устранение проблем
Не получается извлечь файлы из репозитория Git
Недоступен хост с адресом 192.168.33.10.nip.io
Bad Request (400)
Заключение
Глава 8
Отладка сценариев Ansible
Информативные сообщения об ошибках
Отладка ошибок с SSH-подключением
Типичные проблемы с SSH
PasswordAuthentication no
Подключение по SSH с учетными данными другого пользователя
Ошибка проверки ключа хоста
Частные сети
Модуль debug
Интерактивный отладчик сценариев
Модуль assert
Проверка сценария перед запуском
Проверка синтаксиса
Список хостов
Список задач
Режим проверки
Вывод изменений в файлах
Теги
Ограничение обслуживаемых хостов
Заключение
Глава 9
Роли: масштабирование сценариев
Базовая структура роли
Пример: развертывание Mezzanine с использованием ролей
Использование ролей в сценариях
Предварительные и заключительные задачи
Роль database для развертывания базы данных
Роль mezzanine для развертывания Mezzanine
Создание файлов и каталогов ролей с помощью ansible-galaxy
Зависимые роли
Ansible Galaxy
Веб-интерфейс
Интерфейс командной строки
Требования к оформлению ролей на практике
Как поделиться своей ролью
Заключение
Глава 10
Сложные сценарии
Решение проблем с неидемпотентными командами
Фильтры
Фильтр default
Фильтры для зарегистрированных переменных
Фильтры для путей к файлам
Создание собственного фильтра
Подстановки
file
pipe
env
password
template
csvfile
dig
redis
Написание собственного плагина подстановки
Сложные циклы
Плагины with_*
with_lines
with_fileglob
with_dict
Циклические конструкции как плагины подстановок
Управление циклами
Выбор имени переменной цикла
Управление выводом
Импортирование и подключение
Динамическое подключение
Подключение ролей
Поток управления роли
Блоки
Обработка ошибок с помощью блоков
Шифрование конфиденциальных данных при помощи Vault
Шифрование с использованием разных паролей
Заключение
Глава 11
Управление хостами, задачами и обработчиками
Шаблоны для выбора хостов
Ограничение обслуживаемых хостов
Запуск задачи на управляющей машине
Сбор фактов вручную
Получение IP-адреса хоста
Запуск задачи на сторонней машине
Последовательное выполнение задачи на хостах по одному
Пакетная обработка хостов
Однократный запуск
Выбор задач для запуска
step
start-at-task
Запуск действий с тегами
Пропуск действий с тегами
Стратегии выполнения
linear
free
Улучшенные обработчики
Обработчики в pre_tasks и post_tasks
Принудительный запуск обработчиков
Метакоманды
Уведомление обработчиков из обработчиков
Выполнение обработчиков по событиям
Выполнение обработчиков по событиям: случай SSL
Заключение
Глава 12
Управление хостами Windows
Подключение к Windows
PowerShell
Модули поддержки Windows
Наша машина для разработки на Java
Добавление локального пользователя
Функции Windows
Установка программного обеспечения с помощью Chocolatey
Настройки для поддержки Java
Обновление Windows
Заключение
Глава 13
Ansible и контейнеры
Kubernetes
Жизненный цикл приложения Docker
Реестры
Ansible и Docker
Подключение к демону Docker
Пример применения: Ghost
Запуск контейнера Docker на локальной машине
Создание образа из Dockerfile
Отправка образа в реестр Docker
Управление несколькими контейнерами на локальной машине
Запрос информации о локальном образе
Развертывание приложения в контейнере Docker
MySQL
Развертывание базы данных Ghost
Веб-сервер
Веб-сервер: Ghost
Веб-сервер: NGINX
Удаление контейнеров
Заключение
Глава 14
Обеспечение качества с помощью Molecule
Установка и настройка
Настройка драйверов в Molecule
Создание роли Ansible
Сценарии Molecule
Желаемое состояние
Настройка сценариев в Molecule
Управление виртуальными машинами
Управление контейнерами
Команды Molecule
Статический анализ
yamllint
ansible-lint
ansible-later
Верификаторы
Ansible
Goss
TestInfra
Заключение
Глава 15
Коллекции
Установка коллекций
Вывод списка коллекций
Использование коллекций в сценариях
Разработка коллекций
Заключение
Глава 16
Создание образов
Создание образов с помощью Packer
Vagrant VirtualBox VM
Объединение Packer и Vagrant
Облачные образы
Google Cloud Platform
Azure
Amazon EC2
Сценарий Ansible
Образ Docker: GCC 11
Заключение
Глава 17
Облачная инфраструктура
Терминология
Экземпляр
Образ машины Amazon
Теги
Учетные данные пользователя
Переменные окружения
Файлы конфигурации
Необходимое условие: библиотека Boto3 для Python
Динамическая инвентаризация
Кеширование реестра
Другие параметры настройки
Определение динамических групп с помощью тегов
Присваивание тегов имеющимся ресурсам
Создание более точных названий групп
Виртуальные частные облака
Конфигурирование ansible.cfg для использования с ec2
Запуск новых экземпляров
Пары ключей EC2
Создание нового ключа
Выгрузка открытого ключа
Группы безопасности
Разрешенные IP-адреса
Порты групп безопасности
Получение последней версии AMI
Добавление нового экземпляра в группу
Ожидание запуска сервера
Подведение итогов
Создание виртуального частного облака
Динамическая инвентаризация и VPC
Заключение
Глава 18
Плагины обратного вызова
Плагины стандартного вывода
ARA
debug
default
dense
json
minimal
null
oneline
Плагины уведомлений и агрегирования
Зависимости Python
foreman
jabber
junit
log_plays
logentries
logstash
mail
profile_roles
profile_tasks
say
slack
splunk
timer
Заключение
Глава 19
Собственные модули
Пример: проверка доступности удаленного сервера
Использование модуля script вместо написания своего модуля
can_reach как модуль
Когда следует разрабатывать модули?
Где хранить свои модули
Как Ansible вызывает модули
Генерация автономного сценария на Python с аргументами (только модули на Python)
Копирование модуля на хост
Создание файла с аргументами на хосте (для модулей не на языке Python)
Вызов модуля
Ожидаемый вывод
Ожидаемые выходные переменные
Реализация модулей на Python
Анализ аргументов
Доступ к параметрам
Импортирование вспомогательного класса AnsibleModule
Свойства аргументов
AnsibleModule: параметры метода инициализатора
Возврат признака успешного завершения или неудачи
Вызов внешних команд
Режим проверки (пробный прогон)
Документирование модуля
Отладка модуля
Создание модуля на Bash
Альтернативное местоположение интерпретатора Bash
Заключение
Глава 20
Ускорение работы Ansible
Мультиплексирование SSH и ControlPersist
Включение мультиплексирования SSH вручную
Параметры мультиплексирования SSH в Ansible
Еще о настройке SSH
Рекомендации по выбору алгоритмов
Конвейерный режим
Включение конвейерного режима
Настройка хостов для поддержки конвейерного режима
Mitogen для Ansible
Кеширование фактов
Кеширование фактов в файлах JSON
Кеширование фактов в Redis
Кеширование фактов в Memcached
Параллелизм
Асинхронное выполнение задач с помощью async
Заключение
Глава 21
Сети и безопасность
Управление сетевыми устройствами
Список поддерживаемых производителей сетевого оборудования
Ansible Connection для автоматизации управления сетевыми устройствами
Привилегированный режим
Реестр сетевых устройств
Примеры использования автоматизации управления сетевыми устройствами
Безопасность
Соблюдение требований соответствия
Защищено, но не безопасно
Теневые ИТ-ресурсы
Солнечные ИТ-ресурсы
Нулевое доверие
Заключение
Глава 22
CI/CD и Ansible
Непрерывная интеграция
Элементы системы непрерывной интеграции
Jenkins и Ansible
Обкатка
Плагин Ansible
Плагин Ansible Tower
Заключение
Глава 23
Ansible Automation Platform
Модели подписки
Пробная версия Ansible Automation Platform
Какие задачи решает Ansible Automation Platform
Управление доступом
Проекты
Управление инвентаризацией
Запуск заданий из шаблонов
RESTful API
AWX.AWX
Установка
Создание организации
Создание реестра
Запуск сценария с помощью шаблона задания
Запуск Ansible в контейнерах
Создание сред выполнения
Заключение
Глава 24
Практические рекомендации
Простота, модульность и сочетаемость
Организуйте контент
Отделяйте реестры от проектов
Отделяйте роли и коллекции
Сценарии
Оформляйте код
Снабжайте тегами и тестируйте все, что только возможно
Описывайте желаемое состояние
Доставляйте непрерывно
Обеспечивайте безопасность
Контролируйте развертывание
Оценивайте эффективность
Контрольные показатели
Заключительные слова
Библиография
Об авторах
Об изображении на обложке
Предметный указатель