Модуль community.general.deploy_helper — выполняет некоторые стандартные шаги при развертывании проектов
Примечание
Этот модуль входит в коллекцию community.general (версия 12.6.1).
Возможно, эта коллекция уже установлена, если вы используете пакет ansible. Она не входит в состав ansible-core. Чтобы проверить, установлена ли она, выполните ansible-galaxy collection list.
Для установки используйте: 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— выпуск, на который указывает символическая ссылка «current»,previous_release_path— полный путь к цели символической ссылки «current»,new_release— либо параметрrelease, либо сгенерированная метка времени,new_release_path— путь к каталогу нового выпуска (модуль его не создает).
Параметры
Параметр | Комментарии |
|---|---|
attributes псевдонимы: attr строка | Атрибуты, которые должен иметь создаваемый объект файловой системы. Список поддерживаемых флагов см. на странице справочного руководства для Эта строка должна содержать атрибуты в том же порядке, в котором они выводятся командой По умолчанию предполагается оператор |
clean логическое значение | |
current_path путь | Имя символической ссылки, создаваемой после завершения развертывания. Используется в По умолчанию: |
group строка | Имя группы, которой должен принадлежать объект файловой системы, как если бы оно передавалось команде Если значение не указано, используется текущая группа текущего пользователя; если вы работаете от имени root, может быть сохранен прежний владелец. |
keep_releases целое число | Количество старых выпусков, которые следует сохранить при очистке. Используется в По умолчанию: |
mode любой | Разрешения, которые должен иметь создаваемый объект файловой системы. Если вы привыкли к Если передать Ansible число, не соблюдая ни одно из этих правил, оно будет интерпретировано как десятичное, что приведет к неожиданным результатам. Начиная с Ansible 1.8, режим можно указывать в символьной форме (например, Если параметр Если параметр Указание |
owner строка | Имя пользователя, которому должен принадлежать объект файловой системы, как если бы оно передавалось команде Если значение не указано, используется текущий пользователь; если вы работаете от имени root, может быть сохранен прежний владелец. Числовое имя пользователя будет считаться идентификатором пользователя, а не именем. Не используйте числовые имена пользователей, чтобы избежать путаницы. |
path псевдонимы: dest путь / обязательный | Корневой путь проекта. Возвращается в факте |
release строка | Версия выпуска, который развертывается. По умолчанию используется формат метки времени |
releases_path строка | Имя каталога, в котором хранятся выпуски. Путь может быть относительным относительно По умолчанию: |
selevel строка | Уровень в контексте объекта файловой системы SELinux. Это атрибут MLS/MCS, иногда называемый Если задано значение |
serole строка | Роль в контексте объекта файловой системы SELinux. Если задано значение |
setype строка | Тип в контексте объекта файловой системы SELinux. Если задано значение |
seuser строка | Пользователь в контексте объекта файловой системы SELinux. По умолчанию используется политика Если задано значение |
путь | Имя каталога, в котором хранятся общие ресурсы. Путь может быть относительным относительно По умолчанию: |
state строка | Состояние проекта.
Варианты:
|
unfinished_filename строка | Имя файла, указывающего на то, что развертывание не завершено. Все каталоги в По умолчанию: |
unsafe_writes логическое значение | Определяет, когда использовать атомарную операцию для предотвращения повреждения данных или несогласованного чтения целевого объекта файловой системы. По умолчанию этот модуль использует атомарные операции для предотвращения повреждения данных или несогласованного чтения целевых объектов файловой системы, однако иногда настройки систем или их неисправности не позволяют это делать. Например, объекты файловой системы, подключенные в Docker, нельзя атомарно обновить изнутри контейнера — их можно записать только небезопасным способом. Этот параметр позволяет Ansible использовать небезопасные методы обновления объектов файловой системы, если атомарные операции завершаются ошибкой (однако он не заставляет Ansible выполнять небезопасную запись). ВАЖНО! Небезопасная запись подвержена состояниям гонки и может привести к повреждению данных. Варианты:
|
Атрибуты
Атрибут | Поддержка | Описание |
|---|---|---|
check_mode | Поддержка: полная | Модуль можно запускать в режиме |
diff_mode | Поддержка: нет | В режиме сравнения возвращает сведения об изменениях (или о возможных изменениях в |
Примечания
Примечание
- Факты возвращаются только для
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
Ссылки на коллекцию
© 2012–2018 Michael DeHaan
© 2018–2025 Red Hat, Inc.
Licensed under the GNU General Public License version 3.
https://docs.ansible.com/projects/ansible/latest/collections/community/general/deploy_helper_module.html