community.general.deploy_helper – Управляет некоторыми шагами, общими при развёртывании проектов.
Примечание
Этот плагин входит в коллекцию community.general (версия 1.3.2).
Для его установки используйте: ansible-galaxy collection install community.general.
Для использования в книге задач укажите: community.general.deploy_helper.
Описание
- Утилита Deploy Helper управляет некоторыми шагами, общими при развёртывании программного обеспечения. Она создаёт структуру каталогов, управляет символьной ссылкой для текущей версии и очищает старые версии.
- Выполнение с
state=queryилиstate=presentвернёт фактdeploy_helper.project_path, независимо от установленного вами параметра пути,current_path, путь к символьной ссылке, указывающей на активную версию,releases_path, путь к каталогу для хранения версий,shared_path, путь к каталогу для хранения общих ресурсов,unfinished_filename, имя файла для распознавания незавершенных сборок,previous_release, версия, на которую указывает символьная ссылка «текущая»,previous_release_path, полный путь к цели символьной ссылки «текущая»,new_release, либо параметр «release», либо сгенерированная метка времени,new_release_path, путь к новому каталогу версии (не создаваемый модулем).
Параметры
| Параметр | Варианты/Значения по умолчанию | Комментарии |
|---|---|---|
| attributes строка добавлено в версии 2.3 ansible.builtin | Атрибуты, которые должны иметь результирующий файл или каталог. Для получения поддерживаемых флагов обратитесь к справке по команде chattr на целевой системе. Эта строка должна содержать атрибуты в том же порядке, что и отображает lsattr. Оператор = предполагается по умолчанию, в противном случае операторы + или - должны быть включены в строку.псевдонимы: attr | |
| clean булево |
| Выполнять ли процедуру очистки в случае state=finalize. |
| current_path путь | По умолчанию: "current" | имя символьной ссылки, которая создаётся при завершении развёртывания. Используется в finalize и clean. Возвращается в факте deploy_helper.current_path. |
| group строка | Имя группы, которая должна владеть файлом/каталогом, как это передаётся в chown. | |
| keep_releases целое число | По умолчанию: 5 | количество старых версий для хранения при очистке. Используется в finalize и clean. Любые незавершенные сборки будут удалены в первую очередь, поэтому будут учитываться только правильные версии. Текущая версия не учитывается. |
| mode сырой | Разрешения, которые должны иметь результирующий файл или каталог. Для тех, кто знаком с /usr/bin/chmod, помните, что режимы фактически являются восьмеричными числами. Вы должны либо добавить ведущую нуль, чтобы парсер YAML Ansible знал, что это восьмеричное число (например, 0644 или 01777), либо заключить его в кавычки (например, '644' или '1777'), чтобы Ansible получил строку и мог выполнить преобразование из строки в число.Если вы передадите Ansible число без одного из этих правил, оно будет воспринято как десятичное число, что приведёт к неожиданным результатам. Начиная с Ansible 1.8, режим может быть указан как символьный режим (например, u+rwx или u=rw,g=r,o=r). | |
| owner строка | Имя пользователя, который должен владеть файлом/каталогом, как это передаётся в chown. | |
| path путь / обязательно | корневой путь проекта. Псевдоним dest. Возвращается в факте deploy_helper.project_path.псевдонимы: dest | |
| release строка | версия развёртываемой версии. По умолчанию имеет формат метки времени %Y%m%d%H%M%S (например, '20141119223359'). Этот параметр необязателен во время state=present, но должен быть явно задан для state=finalize. Вы можете использовать сгенерированный факт release={{ deploy_helper.new_release }}. | |
| releases_path строка | По умолчанию: "releases" | имя каталога, в котором будут храниться версии. Может быть относительным к path или абсолютным. Возвращается в факте deploy_helper.releases_path. |
| selevel строка | Часть уровня SELinux контекста файла. Это атрибут MLS/MCS, иногда известный как range.Если установлено значение _default, используется часть политики level, если она доступна. | |
| serole строка | Часть роли SELinux контекста файла. Если установлено значение _default, используется часть политики role, если она доступна. | |
| setype строка | Часть типа SELinux контекста файла. Если установлено значение _default, используется часть политики type, если она доступна. | |
| seuser строка | Часть пользователя SELinux контекста файла. По умолчанию используется политика system, где это применимо.Если установлено значение _default, используется часть политики user , если она доступна. | |
| shared_path путь | По умолчанию: "shared" | имя каталога, который будет содержать общие ресурсы. Может быть относительным к path или абсолютным. Если установлено пустое значение, каталог shared не будет создан. Возвращается в факте deploy_helper.shared_path. |
| state строка |
| состояние проекта. query собирает только факты, present создаёт корневой каталог проекта, а в нём каталоги releases и shared, finalize удаляет файл unfinished_filename, создаёт символьную ссылку на новую развёрнутую версию и необязательно очищает старые версии, clean удаляет неудавшиеся и старые версии, absent удаляет каталог проекта (аналогично модулю ansible.builtin.file с state=absent). |
| unfinished_filename строка | По умолчанию: "DEPLOY_UNFINISHED" | имя файла, указывающего на то, что развёртывание не завершено. Все каталоги в releases_path, содержащие этот файл, будут удалены при state=finalize с clean=True или state=clean. Этот файл автоматически удаляется из new_release_path во время state=finalize. |
| unsafe_writes булево добавлено в версии 2.2 ansible.builtin |
| Влияние на то, когда использовать атомную операцию для предотвращения повреждения данных или несогласованного чтения из целевого файла. По умолчанию этот модуль использует атомные операции для предотвращения повреждения данных или несогласованного чтения из целевых файлов, но иногда системы настроены или просто неисправны таким образом, что это предотвращается. Одним из примеров являются файлы, смонтированные в Docker, которые не могут быть обновлены атомарно изнутри контейнера и могут быть записаны только небезопасным способом. Этот параметр позволяет Ansible перейти к небезопасным методам обновления файлов при неудаче атомных операций (хотя он не заставляет Ansible выполнять небезопасные записи). ВАЖНО! Небезопасные записи подвержены проблемам гонки и могут привести к повреждению данных. |
Примечания
Примечание
- Факты возвращаются только для
state=queryиstate=present. Если вы используете оба, вы должны передать все изменённые параметры в оба вызова, иначе второй вызов перезапишет факты первого. - При использовании
state=clean, версии упорядочиваются по дате создания. Вы должны без проблем переключиться на новую стратегию именования. - Из-за поведения по умолчанию при генерации факта new_release, этот модуль не будет идемпотентным, если вы не передадите собственное имя выпуска с помощью
release. Из-за природы развёртывания программного обеспечения, это не должно быть большой проблемой.
Примеры
# General explanation, starting with an example folder structure for a project:
# root:
# releases:
# - 20140415234508
# - 20140415235146
# - 20140416082818
#
# shared:
# - sessions
# - uploads
#
# current: releases/20140416082818
# The 'releases' folder holds all the available releases. A release is a complete build of the application being
# deployed. This can be a clone of a repository for example, or a sync of a local folder on your filesystem.
# Having timestamped folders is one way of having distinct releases, but you could choose your own strategy like
# git tags or commit hashes.
#
# During a deploy, a new folder should be created in the releases folder and any build steps required should be
# performed. Once the new build is ready, the deploy procedure is 'finalized' by replacing the 'current' symlink
# with a link to this build.
#
# The 'shared' folder holds any resource that is shared between releases. Examples of this are web-server
# session files, or files uploaded by users of your application. It's quite common to have symlinks from a release
# folder pointing to a shared/subfolder, and creating these links would be automated as part of the build steps.
#
# The 'current' symlink points to one of the releases. Probably the latest one, unless a deploy is in progress.
# The web-server's root for the project will go through this symlink, so the 'downtime' when switching to a new
# release is reduced to the time it takes to switch the link.
#
# To distinguish between successful builds and unfinished ones, a file can be placed in the folder of the release
# that is currently in progress. The existence of this file will mark it as unfinished, and allow an automated
# procedure to remove it during cleanup.
# Typical usage
- name: Initialize the deploy root and gather facts
community.general.deploy_helper:
path: /path/to/root
- name: Clone the project to the new release folder
ansible.builtin.git:
repo: ansible.builtin.git://foosball.example.org/path/to/repo.git
dest: '{{ deploy_helper.new_release_path }}'
version: v1.1.1
- name: Add an unfinished file, to allow cleanup on successful finalize
ansible.builtin.file:
path: '{{ deploy_helper.new_release_path }}/{{ deploy_helper.unfinished_filename }}'
state: touch
- name: Perform some build steps, like running your dependency manager for example
composer:
command: install
working_dir: '{{ deploy_helper.new_release_path }}'
- name: Create some folders in the shared folder
ansible.builtin.file:
path: '{{ deploy_helper.shared_path }}/{{ item }}'
state: directory
with_items:
- sessions
- uploads
- name: Add symlinks from the new release to the shared folder
ansible.builtin.file:
path: '{{ deploy_helper.new_release_path }}/{{ item.path }}'
src: '{{ deploy_helper.shared_path }}/{{ item.src }}'
state: link
with_items:
- path: app/sessions
src: sessions
- path: web/uploads
src: uploads
- name: Finalize the deploy, removing the unfinished file and switching the symlink
community.general.deploy_helper:
path: /path/to/root
release: '{{ deploy_helper.new_release }}'
state: finalize
# Retrieving facts before running a deploy
- name: Run 'state=query' to gather facts without changing anything
community.general.deploy_helper:
path: /path/to/root
state: query
# Remember to set the 'release' parameter when you actually call 'state=present' later
- name: Initialize the deploy root
community.general.deploy_helper:
path: /path/to/root
release: '{{ deploy_helper.new_release }}'
state: present
# all paths can be absolute or relative (to the 'path' parameter)
- community.general.deploy_helper:
path: /path/to/root
releases_path: /var/www/project/releases
shared_path: /var/www/shared
current_path: /var/www/active
# Using your own naming strategy for releases (a version tag in this case):
- community.general.deploy_helper:
path: /path/to/root
release: v1.1.1
state: present
- community.general.deploy_helper:
path: /path/to/root
release: '{{ deploy_helper.new_release }}'
state: finalize
# Using a different unfinished_filename:
- community.general.deploy_helper:
path: /path/to/root
unfinished_filename: README.md
release: '{{ deploy_helper.new_release }}'
state: finalize
# Postponing the cleanup of older builds:
- community.general.deploy_helper:
path: /path/to/root
release: '{{ deploy_helper.new_release }}'
state: finalize
clean: False
- community.general.deploy_helper:
path: /path/to/root
state: clean
# Or running the cleanup ahead of the new deploy
- community.general.deploy_helper:
path: /path/to/root
state: clean
- community.general.deploy_helper:
path: /path/to/root
state: present
# Keeping more old releases:
- community.general.deploy_helper:
path: /path/to/root
release: '{{ deploy_helper.new_release }}'
state: finalize
keep_releases: 10
# Or, if you use 'clean=false' on finalize:
- community.general.deploy_helper:
path: /path/to/root
state: clean
keep_releases: 10
# Removing the entire project root folder
- community.general.deploy_helper:
path: /path/to/root
state: absent
# Debugging the facts returned by the module
- community.general.deploy_helper:
path: /path/to/root
- ansible.builtin.debug:
var: deploy_helper
Авторы
- Рамон де ла Фуэнте (@ramondelafuente)
© 2012–2018 Michael DeHaan
© 2018–2019 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.10/collections/community/general/deploy_helper_module.html