Оформление файлов Ansible#
Единые правила оформления помогают читать и проверять наборы сценариев, роли, описания инвентаря и конфигурацию Ansible.
Примеры используют Ansible Core из состава Astra Automation.
Правила оформления дополняют требования форматов файлов, но не меняют их синтаксис.
Например, Ansible принимает yes как логическое значение YAML, однако в новых примерах рекомендуется использовать true.
Файлы YAML#
Для наборов сценариев, задач роли и файлов переменных используйте расширение .yml, а для шаблонов Jinja – .j2.
Начинайте документ YAML с --- и завершайте файл переводом строки.
Это правила оформления; многие документы YAML корректны и без начального маркера.
Не рекомендуется |
Рекомендуется |
Причина |
|---|---|---|
|
|
Расширение выбирают по назначению файла; само расширение не меняет синтаксис содержимого. |
Файл начинается с |
Первая строка содержит |
Начальный маркер явно обозначает документ YAML. |
Последняя строка |
После последнего символа строки |
Завершающий перевод строки упрощает обработку файла текстовыми инструментами. |
Отступы и списки#
Используйте два пробела для каждого уровня вложенности и один пробел после двоеточия между ключом и значением. Для отступов нельзя использовать символы табуляции, так как они нарушают синтаксис YAML. Элементы списка располагайте с отступом относительно содержащего их ключа.
Следующий фрагмент YAML использует допустимые, но не рекомендуемые отступы и пробелы:
Рекомендуемое оформление того же словаря:
server:
port: 8080
Замена пробелов перед port символом табуляции сделает этот пример синтаксически некорректным.
Запрет табуляции относится к отступам, а не к содержимому строковых значений.
Следующий фрагмент файла переменных допустим по синтаксису YAML, но не соответствует выбранному оформлению списка:
Рекомендуемое оформление того же фрагмента:
packages:
- nginx
- curl
Разделяйте соседние задачи пустой строкой.
Отступы ключевых слов name, when, register и changed_when должны соответствовать уровню задачи, а не уровню параметров модуля.
Следующий фрагмент списка задач соответствует синтаксису YAML, но Ansible воспримет when и register как параметры модуля ansible.builtin.debug:
Рекомендуемый фрагмент того же списка задач; переменную service_name необходимо определить в сценарии или инвентаре:
- name: Вывод сообщения о начале проверки
ansible.builtin.debug:
msg: Проверка начата
when: true
register: _message
- name: "Вывод сообщения службы {{ service_name }}"
ansible.builtin.debug:
msg: Проверка завершена
Исправленный пример также показывает пустую строку между задачами, содержательное название первым ключом и переменную в конце названия.
Порядок ключей и пустая строка относятся к оформлению, а расположение when и register – к структуре задачи Ansible.
Ошибка параметров модуля может проявиться только при выполнении задачи, поэтому проверки синтаксиса недостаточно.
Типы значений и кавычки#
Тип значения влияет на результат обработки файла.
Для логических значений используйте true и false без кавычек, а для целых чисел – десятичную запись.
Строки, которые YAML может принять за число, логическое значение или другую конструкцию, заключайте в кавычки.
Для таких строк рекомендуется использовать двойные кавычки.
Не рекомендуется |
Рекомендуется |
Причина |
|---|---|---|
|
|
Оба значения логические; |
|
|
Парсер YAML Ansible воспринимает |
|
|
Обе записи задают строку; двойные кавычки рекомендуются для единообразия. |
Ошибочный фрагмент файла переменных, если все три значения должны быть строками:
Исправленный фрагмент с явными строковыми значениями:
account_code: "00123"
answer_text: "false"
file_mode: "0644"
Заключайте в кавычки также строки с выражением Jinja в начале или с двоеточием перед пробелом:
service_name: nginx
service_enabled: true
service_port: 8080
service_message: "Служба: запущена"
service_config_path: "{{ config_dir }}/nginx.conf"
Здесь config_dir – переменная с путем к каталогу конфигурации, которую необходимо определить перед использованием шаблона.
Нельзя добавлять кавычки ко всем значениям автоматически, поскольку это меняет числа и логические значения на строки.
Преобразование строки в нужный тип зависит от параметра модуля или места использования переменной.
Одинарные кавычки допустимы, если необходимо сохранить обратные косые черты без экранирования, например в пути Windows или регулярном выражении:
windows_path: 'C:\Temp\example.txt'
file_pattern: '^example\.txt$'
Ошибочный фрагмент YAML |
Корректный фрагмент YAML |
Причина |
|---|---|---|
|
|
Без кавычек этот фрагмент не соответствует синтаксису YAML. |
|
|
Двоеточие перед пробелом требует кавычек в таком строковом значении. |
|
|
В двойных кавычках YAML обрабатывает обратную косую черту как начало управляющей последовательности. Допустимый альтернативный вариант – экранировать каждый разделитель двойной обратной косой чертой. |
Для многострочной строки используйте |, если переводы строк существенны, и >, если переносы обычных строк должны стать пробелами.
Суффикс - удаляет завершающий перевод строки.
Пустые строки и строки с дополнительными отступами имеют отдельные правила обработки, поэтому > не заменяет все переводы строк без исключения.
Если между словами необходимо сохранить перевод строки, следующий синтаксически корректный фрагмент не дает нужного результата:
Он задает строку первая вторая с завершающим переводом строки.
Для сохранения границы строк используйте следующий вариант:
message: |
первая
вторая
В результате между словами и после слова вторая есть переводы строки.
Если текст должен занимать одну строку, первый вариант с > соответствует этой цели, а вариант с | – нет.
Если завершающий перевод строки не требуется, замените | на |- при том же содержимом.
Оба последних варианта сохраняют перевод строки между словами, но только |- удаляет завершающий перевод строки.
Файл ansible.cfg#
Файл ansible.cfg тоже использует формат INI, но не является описанием инвентаря.
Типы значений определяет конкретная настройка Ansible.
Правила строк узлов и секций :vars к нему не относятся.
Указывайте настройки в соответствующих секциях и отделяйте = пробелами.
Комментарии рекомендуется помещать на отдельные строки.
Не подходит для указанной цели |
Корректный вариант |
Причина |
|---|---|---|
|
|
Обе записи задают одно число; пробелы вокруг |
|
|
Неверная секция не задает настройку |
|
Строка |
Символ |
|
|
Название переменной инвентаря не является названием настройки конфигурации. |
|
|
Ansible не вычисляет выражения Jinja в файле конфигурации. |
Пример полного файла конфигурации для проекта, в котором файл inventory.yml расположен рядом с ansible.cfg:
[defaults]
inventory = ./inventory.yml
remote_user = ansible
forks = 5
retry_files_enabled = false
Учетную запись подключения в секции [defaults] задает настройка remote_user, а не переменная инвентаря ansible_user.
Не переносите в ansible.cfg выражения Jinja из набора сценариев, поскольку Ansible не обрабатывает их как шаблоны конфигурации.
Путь ./inventory.yml относится к каталогу файла конфигурации.
Для проверки выбранного файла и распознанных настроек выполните команды из каталога проекта:
ansible --version
ansible-config dump --only-changed
Ожидаемый результат: первая команда показывает путь к ansible.cfg, а вторая – значения измененных настроек и их источники.
Если настройка отсутствует в выводе, проверьте ее название, секцию и фактически загруженный файл.