Советы и рекомендации
Эти советы и рекомендации помогли нам оптимизировать использование Ansible, и мы предлагаем их здесь в качестве предложений. Мы надеемся, что они помогут вам организовать контент, писать playbook'ы, поддерживать инвентаризацию и выполнять Ansible. Однако в конечном счете вы должны использовать Ansible таким образом, который наиболее подходит вашей организации и вашим целям.
Общие рекомендации
Эти концепции относятся ко всем операциям и артефактам Ansible.
Делайте все просто
Всякий раз, когда это возможно, делайте все просто. Используйте расширенные функции только в необходимых случаях и выбирайте функцию, которая лучше всего соответствует вашему случаю использования. Например, вам, вероятно, не понадобятся vars, vars_files, vars_prompt и --extra-vars одновременно, используя также внешний файл инвентаризации. Если что-то кажется сложным, скорее всего, так оно и есть. Потратьте время на поиск более простого решения.
Используйте систему управления версиями
Храните файлы playbook'ов, ролей, инвентаризации и переменных в git или другой системе управления версиями и делайте коммиты в репозиторий при внесении изменений. Система управления версиями обеспечивает историю изменений, описывая, когда и почему вы изменяли правила, автоматизирующие вашу инфраструктуру.
Рекомендации по playbook'ам
Эти рекомендации помогают сделать playbook'ы и роли более читабельными, поддерживаемыми и отлаживаемыми.
Используйте пробелы
Широкое использование пробелов, например, пустая строка перед каждым блоком или задачей, упрощает сканирование playbook'а.
Всегда присваивайте имена задачам
Имена задач необязательны, но очень полезны. В своем выводе Ansible отображает имя каждой выполняемой задачи. Выбирайте имена, описывающие, что делает каждая задача и почему.
Всегда указывайте состояние
Для многих модулей параметр «state» необязателен. Разные модули имеют разные значения по умолчанию для «state», а некоторые модули поддерживают несколько значений «state». Явное указание «state=present» или «state=absent» делает playbook'ы и роли более понятными.
Используйте комментарии
Даже с именами задач и явным состоянием, иногда часть playbook'а или роли (или файла инвентаризации/переменных) требует дополнительного объяснения. Добавление комментария (любая строка, начинающаяся с «#»), помогает другим (и, возможно, вам в будущем) понять, что делает, как делает и почему делает тот или иной play, задача (или настройка переменной).
Рекомендации по инвентаризации
Эти рекомендации помогут сохранить вашу инвентаризацию хорошо организованной.
Используйте динамическую инвентаризацию с облаками
Используйте динамическую инвентаризацию с поставщиками облачных услуг и другими системами, которые поддерживают стандартные списки вашей инфраструктуры, вместо ручного обновления статических файлов инвентаризации. Для облачных ресурсов вы можете использовать теги для различения производственных и тестовых сред.
Группируйте инвентаризацию по функциям
Система может входить в несколько групп. Смотрите Как создать свою инвентаризацию и Шаблоны: нацеливание на узлы и группы. Если вы создаете группы, названные по функциям узлов в группе, например, webservers или dbservers, ваши playbook'ы могут нацеливаться на машины в зависимости от функции. Вы можете назначать переменные, специфичные для функции, используя систему переменных группы, и разрабатывать роли Ansible для обработки случаев использования, специфичных для функции. Смотрите Роли.
Разделяйте инвентаризацию для производства и этапа подготовки
Вы можете сохранить вашу производственную среду отдельно от сред разработки, тестирования и подготовки, используя отдельные файлы или каталоги инвентаризации для каждой среды. Таким образом вы выбираете, на что вы нацеливаетесь, используя -i. Сохранение всех сред в одном файле может привести к неожиданностям!
Храните зашифрованные переменные в безопасном доступе
Вы должны шифровать чувствительные или секретные переменные с помощью Ansible Vault. Однако шифрование имен переменных, а также значений переменных затрудняет поиск источника значений. Вы можете сохранить доступ к именам ваших переменных (например, с помощью grep) без раскрытия секретов, добавив уровень косвенности:
- Создайте подкаталог
group_vars/с именем группы. - Внутри этого подкаталога создайте два файла с именами
varsиvault. - В файле
varsопределите все необходимые переменные, включая любые секретные. - Скопируйте все секретные переменные в файл
vaultи добавьте этим переменным префиксvault_. - Измените переменные в файле
varsдля указания на соответствующие переменныеvault_с использованием синтаксиса jinja2:db_password: {{ vault_db_password }}. - Зашифруйте файл
vaultдля защиты его содержимого. - Используйте имя переменной из файла
varsв своих playbook'ах.
При выполнении playbook'а Ansible находит переменные в незашифрованном файле, который извлекает значения секретных переменных из зашифрованного файла. Количество файлов переменных и файлов vault'а, а также их имена не ограничены.
Рекомендации по выполнению
Эти рекомендации применяются к использованию Ansible, а не к артефактам Ansible.
Сначала протестируйте в среде подготовки
Тестирование изменений в среде подготовки перед внедрением в производство всегда хорошая идея. Ваши среды не обязательно должны быть одинакового размера, и вы можете использовать групповые переменные для управления различиями между этими средами.
Обновляйте по частям
Используйте ключевое слово «serial», чтобы контролировать, сколько машин обновляется одновременно в пачке. См. Управление местом выполнения задач: делегирование и локальные действия.
Обработка различий в операционных системах и дистрибутивах
Файлы групповых переменных и модуль group_by работают вместе, чтобы помочь Ansible выполнять задачи в широком диапазоне операционных систем и дистрибутивов, которые требуют различных настроек, пакетов и инструментов. Модуль group_by создает динамическую группу узлов, соответствующую определенным критериям. Эта группа не должна быть определена в файле инвентаризации. Этот подход позволяет выполнять разные задачи на разных операционных системах или дистрибутивах. Например:
---
- name: talk to all hosts just so we can learn about them
hosts: all
tasks:
- name: Classify hosts depending on their OS distribution
group_by:
key: os_{{ ansible_facts['distribution'] }}
# now just on the CentOS hosts...
- hosts: os_CentOS
gather_facts: False
tasks:
- # tasks that only happen on CentOS go in this play
Первый play классифицирует все системы в динамические группы на основе имени операционной системы. Позже play'ы могут использовать эти группы в качестве шаблонов в строке hosts. Вы также можете добавить настройки, специфичные для группы, в файлах group vars. Все три имени должны совпадать: имя, созданное задачей group_by, имя шаблона в последующих play'ах и имя файла group vars. Например:
--- # file: group_vars/all asdf: 10 --- # file: group_vars/os_CentOS.yml asdf: 42
В этом примере машины CentOS получают значение «42» для asdf, но другие машины получают «10». Это можно использовать не только для установки переменных, но и для применения определенных ролей только к определенным системам.
Вы можете использовать ту же установку с include_vars, когда вам нужны только переменные, специфичные для ОС, а не задачи:
- hosts: all
tasks:
- name: Set OS distribution dependent variables
include_vars: "os_{{ ansible_facts['distribution'] }}.yml"
- debug:
var: asdf
Это подключает переменные из файла group_vars/os_CentOS.yml.
См. также
- YAML-синтаксис
-
Узнайте о синтаксисе YAML
- Работа с playbook'ами
-
Пересмотрите основные функции playbook'а
- Индекс коллекций
-
Просмотрите существующие коллекции, модули и плагины
- Стоит ли вам разрабатывать модуль?
-
Узнайте, как расширить Ansible, написав собственные модули
- Шаблоны: нацеливание на узлы и группы
-
Узнайте, как выбрать узлы
- Директория примеров GitHub
-
Полные файлы playbook'ов из исходного кода проекта github
- Список рассылки
-
Вопросы? Помощь? Идеи? Загляните на список на Google Groups
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.10/user_guide/playbooks_best_practices.html