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-galaxy install yourlabs/yourlabs.remember