Я изучаю ansible awx, и у меня возникнет ситуация, которую я хочу решить во время тестирования, поэтому я ищу идеи и возможные решения.
Файловая структура отсюда, Лучшие Лрактики - Документация Ansible> «Структура каталогов».
Чтобы не усложнять этот вопрос, у меня есть два сценария, и каждый сценарий должен работать с предварительно настроенным образом Linux, который выполняет определенную роль. Одна роль предназначена для настольных компьютеров, другая - для серверов.
Количество развернутых рабочих столов может составлять сотни или тысячи, поэтому мне действительно нужно простое решение, которое масштабируется без особого вмешательства человека.
Я предполагаю, что некоторым пользователям настольных компьютеров потребуются собственные изменения. Хотя рабочие столы используют 99% стандартной конфигурации ролей, им может потребоваться определенное фоновое изображение или часовой пояс, установленный для их учетной записи в качестве примера, или что-то еще, что необходимо заблокировать на этом рабочем столе.
Я не хочу создавать структуру playbook для каждой машины, которая выходит за рамки стандартной конфигурации, поэтому есть ли способ сказать, запустить стандартную playbook, но также запустить этот другой набор задач, но только для имени хоста / группы, сопоставленного в AWX после стандартного сценария или даже посреди стандартной ролевой задачи?
Пример может быть в tasks / main.yml, могу ли я включить еще один файл yml, который импортируется и запускается, если хост соответствует группе AWX? Таким образом, стандартная роль остается довольно чистой, которая просто импортирует другой файл, который может импортировать другой файл на основе совпадений хостов, которые должны соответствовать имени группы в AWX?
Концепция, о которой я думаю, не уверен, выполнима ли она или что-то в этом роде? Все, что мне нужно сделать, это добавить тест в custom.yml
и создайте новый файл с пользовательскими задачами для этого хоста / группы.
In tasks / main.yml
- name: install app
...
#end of tasks declarations
# At bottom of the file
include custom.yml
#file custom.yml
host: user_machine_123
import user_machine_123_custom_tasks.yml
#file user_machine_123_custom_tasks.yml
- name: install special app for user_machine_123
...
Включение всех исключений в playbook не обязательно, если пользователь может настраивать сторонние ansible. Кроме того, будьте осторожны, имея слишком большой и сложный playbook, у вас может быть несколько playbook.
При этом возможны значения и действия для каждой группы и для каждого хоста.
Определите все значения как переменные, чтобы разрешить переопределения. Например, на уровне роли по умолчанию часовой пояс tz: UTC
но в group_vars / desktop это может быть tz: America/Chicago
или что угодно. В общей роли, которую вы выполняете на всех хостах, используйте модуль часового пояса:
- timezone:
name: "{{tz}}"
Дополнительные задачи для каждого хоста немного сложнее. Попробуйте статическое включение с поиском first_found. Сначала найдите наиболее конкретное имя файла, содержащее inventory_hostname, а затем (возможно, пустой) файл по умолчанию.
- name: per host tasks
include: "{{lookup('first_found', params)}}"
vars:
params:
files:
- '{{inventory_hostname}}.yml'
- default.yml
paths:
- 'tasks'
Если вы обнаружите, что тянетесь к этому шаблону, подумайте об ограничении его использования. Он работает только на хостах, уже нацеленных на игру, а поведение хоста внутри каталога задач не очень интуитивно понятно.
Роль - это более управляемая единица, содержащая задачи и переменные, и ее можно повторно использовать для любого количества хостов. Попросите пользователей Ansible участвовать в ролях, которые при желании можно поддерживать отдельно от вашей игры. Затем сопоставьте их с хостами в playbooks:
---
- name: Server common
hosts: servers
roles:
- common
- name: Web servers common
hosts: web
roles:
- webserver
- name: Widget inventory app
hosts: widget
roles:
- widgetapp
- name: special snowflake
hosts: user123
roles:
- custom123