3.1 KiB
ansible-roles
Канон общих Ansible-ролей для изолированных серверных репозиториев
(pet-project-server, buckland, …).
Это рабочая директория-канон, а не сервис. Серверные репозитории
держат закоммиченные копии ролей в своём roles/ и синхронизируются с
этим каноном через invoke-задачи (rsync, git здесь не участвует):
inv roles-pull [-- <role>]— канон → репозиторий;inv roles-push [-- <role>]— репозиторий → канон (с подтверждением при расхождении);inv roles-status— сравнить подписанные роли с каноном.
Каждый репозиторий объявляет подписку в своём tasks.py
(SYNCED_ROLES). «Пином версии» служит сама закоммиченная копия в
репозитории: деплоится ровно то, что лежит в его git.
Git в этой директории — опциональный бэкап истории канона, он не стоит в рабочей петле синхронизации.
Спецификация подхода: pet-project-server/docs/drafts/shared-roles-sync.md.
Роли
eget— установка утилиты eget.app_image— локальная сборка docker-образа приложения и доставка его на сервер черезdocker save/load(без registry; тулчейн сборки на сервере не нужен). Подробности и переменные — вroles/app_image/README.md.
Контракт для приложения (app_image)
Чтобы приложение можно было деплоить этой ролью, в его рабочей директории
должна быть команда сборки образа (по умолчанию task image). Роль —
инициатор: она вызывает команду и передаёт ей случайный BUILD_ID через
окружение. Команда обязана собрать полный образ и затегать его
<app_image_name>:$BUILD_ID.
Пример реализации на Taskfile (тег из $BUILD_ID, по умолчанию dev для
локальной работы):
image:
desc: 'Полный docker-образ. Тег из $BUILD_ID (по умолчанию dev).'
deps: [build]
cmds:
- docker build -t {{.BINARY}}:${BUILD_ID:-dev} .
Вызов роли в плейбуке:
- name: 'Build and deliver application image'
ansible.builtin.import_role:
name: app_image
vars:
app_image_name: 'myapp'
app_image_src_dir: '{{ (playbook_dir, "..", "myapp") | path_join }}'
# роль выставляет факт app_image_tag для рендера compose