remember

yourlabs.remember

`````````````````

Метароль для архитекторов автоматизации Ansible.

Эта роль предоставляет возможности для улучшения рабочих процессов ролей Ansible:

  • значительное ускорение: требовать зависимую роль Один Раз И Только Один Раз
  • безинвентарный dry: запоминать переменные, введенные из командной строки на хосте
  • подсказка переменной CLI: интерактивный опрос пользователя для получения данных

.. примечание:: Эта роль не загружает зависимости автоматически: это работа команды bigsudo <https://pypi.org/project/bigsudo/>_.

Демо

Самый простой способ попробовать::

pip install --user bigsudo ~/.local/bin/bigsudo yourlabs.fqdn user@somehost

Или, если вы чувствуете себя смелым (пропустите имя хоста, чтобы выполнить на localhost)

~/.local/bin/bigsudo yourlabs.traefik

Конечно, вы также можете использовать команды ansible, но в этом случае будет больше команд и опций. Мы вдохновляемся практикой kubectl, для маленьких серверов, не-HA сервисов и команд-пиццы. Лично я бы все равно использовал bigsudo yourlabs.k8s для настройки экземпляров k8s, если бы мне пришлось ...

Использование

Эта роль позволяет вам определить, какие переменные необходимы в вашей собственной роли, вместе с такими вещами, как описание, которое будет отображаться пользователю, значения по умолчанию, валидация по регулярным выражениям и многое другое.

Внедрение зависимостей ролей OAOO

Я возьму пример того, что происходит с yourlabs.traefik (балансировщик нагрузки на основе docker), который требует yourlabs.docker, который, в свою очередь, просто устанавливает docker.

Тем не менее, для примера я буду использовать your.parent и your.child, чтобы представить случай использования yourlabs.docker и yourlabs.traefik соответственно.

В your.child/requirements.yml::

  • your.parent

В your.parent/requirements.yml::

  • yourlabs.remember

Таким образом, your.child зависит от your.parent, а your.parent зависит от yourlabs.remember.

.. примечание:: bigsudo прозрачно гарантирует, что зависимости будут установлены рекурсивно при запуске bigsudo your.child.

Без роли remember вы обычно включали бы роль your.parent таким образом в верхней части your.child/tasks/main.yml::

  • name: Установить your.parent перед выполнением наших задач include_role: name=your.parent

Однако это будет запускать роль каждый раз, что делает выполнение дольше. Если вы не хотите ждать полного выполнения your.parent каждый раз, когда выполняете your.child, вы можете преобразовать вышеуказанную задачу таким образом в верхней части your.child/tasks/main.yml:

.. код:: yaml

  • name: Установить your.parent, если этого никогда не делали на этом хосте include_role: name=your.parent when: ansible_facts['ansible_local']['your_parent']['state']|default('') != 'success'

Чтобы это заработало, вам нужно добавить следующее в конце your.parent/tasks/main.yml:

.. код:: yaml

  • include_role: name=yourlabs.remember tasks_from=success

Таким образом, запуск bigsudo your.parent (также работает с ansible) создаст /etc/ansible/facts.d/your_parent.fact с таким содержимым::

#!/bin/sh echo '{ "state": "success" }'

Таким образом, вы можете пропустить включение роли в следующий раз.

Читайте далее, чтобы добавить пользовательские постоянные переменные ролей с интерактивной настройкой.

Интерактивная настройка роли

В your.parent/vars/main.yml определите remember_fact, который является пространством имен для переменной развертывания данной роли, а также переменные, от которых зависит ваша роль::


remember_fact: your_parent remember:

  • name: email_enable question: Включить настраиваемый электронный адрес? default: false type: bool
  • name: email question: Какой адрес электронной почты использовать? type: email default: '{{ lookup("env", "USER") }}@{{ inventory_hostname }}' when: email_enable

Затем в your.parent/tasks/main.yml вы можете включить yourlabs.remember и она загрузит переменные и спросит пользователя о новых переменных интерактивно, довольно быстро благодаря Action Plugin::

  • include_role: name=yourlabs.remember

Вы можете делать больше, конечно, обратитесь к test.yml playbook, который я запускаю с ansible-playbook -c local -i localhost, test.yml -v --become:

.. include:: test.yml

Множественные развертывания: пространство имен переменных

Чтобы разрешить множественные развертывания роли на одном хосте, т.е. чтобы активировать eXtreme DevOps, вам потребуется, чтобы ваш remember_fact зависел от переменной.

Например, вы хотите развернуть docker-compose в разные директории на вашем хосте. Таким образом, вам потребуется переменная home:

.. код:: yaml

remember:
- name: home
  question: В какую домашнюю директорию развернуть? (должна начинаться с /home для примера regexp)
  default: /home/test
  type: path
  regexp: /home.*

Это означает, что если пользователь не передаст переменную home через командную строку (т.е. с -e home=/home/bar), его попросят указать домашнюю директорию. Теперь все, что нам нужно сделать, это повторно использовать эту переменную home в remember_fact, чтобы она создала пространство имен для переменных по домашней директории:

.. код:: yaml

remember_fact: your_role_j2((home))

Как вы видите, мы используем j2(( )) вместо {{ }}, это делается для того, чтобы предотвратить Ansible от рендеринга этого перед получением значения для переменной home. На самом деле, плагин действия remember будет:

  • пытаться отрендерить remember_fact, чтобы загрузить существующие переменные, если они есть,
  • ловить исключения AnsibleUndefinedVariable,
  • находить определения для неопределенных переменных, которые ему нужны, в remember,
  • спрашивать их без сохранения
  • загружать существующие переменные
  • и спрашивать любые новые переменные

Заключение

Наконец, мы подошли к тому моменту, когда у нас есть ясный и относительно простой способ:

  • динамически внедрять зависимые роли, чтобы ускорить последующие выполнения роли, эффективно предотвращая ненужное двойное выполнение зависимых ролей (таких как docker, балансировщики нагрузки и автоматизация более низкого уровня...)
  • игнорировать инвентарь, потому что каждый сервер хранит свои переменные, это также DRY, так что это еще один репозиторий, за которым вам не придется беспокоиться!
  • интерактивный запрос фактов, больше не нужно читать документацию перед выполнением роли, которую вы нашли в интернете, как root!

Благодарности

Спасибо totakoko из beta.gouv.fr за долгие обсуждения и за демонстрацию того, что мой инвентарь был избыточным и что это возможно без ;)

Спасибо каналу #ansible@irc.freenode.net, одному из лучших IRC-каналов, а именно:

  • agaffney
  • mackerman
  • jborean93

И спасибо вам за то, что прочитали мою маленькую приключенческую историю!

О проекте

Ansible role to inject dependencies OAOO (once and only once).

Установить
ansible-galaxy install yourlabs/yourlabs.remember
Лицензия
Unknown
Загрузки
3822
Владелец
OSS Hack'n'Dev, we provide all kind of paid services on OSS and sponsor OSS