Я изучаю ansible awx, и у меня возникнет ситуация, которую я хочу решить во время тестирования, поэтому я ищу идеи и возможные решения.
Файловая структура находится здесь, Best Practices - Ansible Documentation> «Directory Structure» .
Чтобы не усложнять этот вопрос, у меня есть два playbooks, и каждый playbook должен работать с предварительно настроенным Образ 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