community.general.deploy_helper – Управляет некоторыми шагами, общими для развертывания проектов.
Примечание
Этот плагин входит в состав коллекции community.general (версия 2.0.1).
Для его установки используйте: ansible-galaxy collection install community.general.
Для использования в книге задач укажите: community.general.deploy_helper.
Обзор
- Помощник по развертыванию управляет некоторыми шагами, общими для развертывания программного обеспечения. Он создает структуру папок, управляет символической ссылкой для текущей версии и очищает старые версии.
- Запуск с
state=queryилиstate=presentвернёт фактdeploy_helper.project_path, значение, заданное в параметре path,current_path, путь к символической ссылке, указывающей на активную версию,releases_path, путь к папке для хранения версий,shared_path, путь к папке для хранения общих ресурсов,unfinished_filename, файл для проверки, чтобы распознать незавершенные сборки,previous_release, версия, на которую указывает символическая ссылка «текущая»,previous_release_path, полный путь к целевому объекту символической ссылки «текущая»,new_release, либо параметр «release», либо сгенерированная метка времени,new_release_path, путь к новой папке версии (не созданной модулем).
Параметры
| Параметр | Варианты/Значения по умолчанию | Комментарии |
|---|---|---|
| attributes string добавлен в 2.3 ansible.builtin | Атрибуты, которые должны иметь результирующий файл или каталог. Чтобы получить поддерживаемые флаги, см. справку man для chattr на целевой системе. Эта строка должна содержать атрибуты в том же порядке, что и в выводе lsattr. Оператор = предполагается по умолчанию, в противном случае операторы + или - необходимо включить в строку.псевдонимы: attr | |
| clean boolean |
| Выполнять ли процедуру очистки в случае state=finalize. |
| current_path path | Значение по умолчанию: "current" | имя символической ссылки, создаваемой при завершении развертывания. Используется в finalize и clean. Возвращается в факте deploy_helper.current_path. |
| group string | Имя группы, которой должен принадлежать файл/каталог, как это передается в chown. | |
| keep_releases integer | Значение по умолчанию: 5 | количество старых версий, которые нужно сохранить при очистке. Используется в finalize и clean. Все незавершенные сборки будут удалены в первую очередь, поэтому будут учитываться только корректные версии. Текущая версия не учитывается. |
| mode raw | Права доступа, которые должны иметь результирующий файл или каталог. Для тех, кто привык к /usr/bin/chmod, помните, что режимы фактически являются восьмеричными числами. Вы должны либо добавить ведущую нуль, чтобы парсер YAML Ansible знал, что это восьмеричное число (как 0644 или 01777), или заключить его в кавычки (как '644' или '1777'), чтобы Ansible получил строку и выполнил собственное преобразование из строки в число.Передача Ansible числа без соблюдения одного из этих правил приведет к десятичному числу, что приведет к непредвиденным результатам. Начиная с Ansible 1.8, режим может быть указан в символическом виде (например, u+rwx или u=rw,g=r,o=r).Если mode не указано, и целевой файл не существует, то значение по умолчанию umask на системе будет использоваться при установке режима для вновь созданного файла.Если mode не указано, и целевой файл существует, то будет использован режим существующего файла.Указание mode — лучший способ гарантировать создание файлов с правильными разрешениями. См. CVE-2020-1736 для получения дополнительной информации. | |
| owner string | Имя пользователя, которому должен принадлежать файл/каталог, как это передается в chown. | |
| path path / required | корневой путь проекта. Псевдоним dest. Возвращается в факте deploy_helper.project_path.псевдонимы: dest | |
| release string | версия развертываемой версии. По умолчанию используется формат метки времени %Y%m%d%H%M%S (например, '20141119223359'). Этот параметр необязателен при state=present, но должен быть явно задан для state=finalize. Вы можете использовать сгенерированный факт release={{ deploy_helper.new_release }}. | |
| releases_path string | Значение по умолчанию: "releases" | имя папки, которая будет содержать версии. Может быть относительным к path или абсолютным. Возвращается в факте deploy_helper.releases_path. |
| selevel string | Часть уровня SELinux контекста файла. Это атрибут MLS/MCS, иногда известный как range.При установке в значение _default, используется часть политики level, если доступна. | |
| serole string | Часть роли SELinux контекста файла. При установке в значение _default, используется часть политики role, если доступна. | |
| setype string | Часть типа SELinux контекста файла. При установке в значение _default, используется часть политики type, если доступна. | |
| seuser string | Часть пользователя SELinux контекста файла. По умолчанию используется политика system, где это применимо.При установке в значение _default, используется часть политики user, если доступна. | |
| shared_path path | Значение по умолчанию: "shared" | имя папки, которая будет содержать общие ресурсы. Может быть относительным к path или абсолютным. Если это значение пустая строка, общая папка не будет создана. Возвращается в факте deploy_helper.shared_path. |
| state string |
| состояние проекта. query будет только собирать факты, present создаст корневую папку проекта, и в ней папки releases и shared, finalize удалит файл unfinished_filename, создаст символическую ссылку на вновь развернутую версию и, при необходимости, очистит старые версии, clean удалит не удавшиеся и старые версии, absent удалит папку проекта (аналогично модулю ansible.builtin.file с state=absent). |
| unfinished_filename string | Значение по умолчанию: "DEPLOY_UNFINISHED" | имя файла, указывающего, что развертывание не завершено. Все папки в releases_path, содержащие этот файл, будут удалены при state=finalize с clean=True, или state=clean. Этот файл автоматически удаляется из new_release_path во время state=finalize. |
| unsafe_writes boolean добавлен в 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
Авторы
- Ramon de la Fuente (@ramondelafuente)
© 2012–2018 Michael DeHaan
© 2018–2021 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/ansible/2.11/collections/community/general/deploy_helper_module.html