Назад | Перейти на главную страницу

Ansible + AWX Run playbook / tasks против машин требует незначительных изменений по сравнению со стандартной ролью

Я изучаю 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