eget: вынести роль в ansible-roles, декларативные пакеты
Linting / YAML Lint (push) Canceled after 0s
Linting / Ansible Lint (push) Canceled after 0s

This commit is contained in:
av
2026-07-16 21:03:27 +03:00
parent f31f51959e
commit 9dc57e0d29
8 changed files with 223 additions and 190 deletions
+74 -24
View File
@@ -1,38 +1,88 @@
Role Name
=========
# eget
A brief description of the role goes here.
Устанавливает утилиту [eget](https://github.com/zyedidia/eget) и через неё —
пиновые бинарники релизов с GitHub (restic, rclone, btop, zellij и т.п.).
Requirements
------------
Роль общая для всех серверных репозиториев; канон живёт в `ansible-roles`,
копии вендорятся через `inv roles-pull`.
Any pre-requisites that may not be covered by Ansible itself or the role should be mentioned here. For instance, if the role uses the EC2 module, it may be a good idea to mention in this section that the boto package is required.
## Что делает
Role Variables
--------------
1. **Bootstrap eget.** Если нужной версии `eget` нет — качает архив релиза с
GitHub напрямую (сам себя eget обновить не может — chicken-and-egg),
распаковывает во временную директорию, ставит бинарник и убирает мусор.
Идемпотентно: сверяет `eget --version` с `eget_version`.
2. **Установка пакетов.** Идёт по декларативному списку `eget_packages` и для
каждого вызывает `eget <repo> --tag <tag> --upgrade-only …`.
A description of the settable variables for this role should go here, including any variables that are in defaults/main.yml, vars/main.yml, and any variables that can/should be set via parameters to the role. Any variables that are read from other roles and/or the global scope (ie. hostvars, group vars, etc.) should be mentioned here as well.
## Идемпотентность и статус изменений
Dependencies
------------
`--upgrade-only` заставляет eget скачивать бинарник, только если релиз новее
установленного файла (сравнение по mtime). Когда обновление не нужно, eget
пишет в stderr `… requested release is not more recent than current version`
и выходит с кодом 0.
A list of other roles hosted on Galaxy should go here, plus any details in regards to parameters that may need to be set for other roles, or variables that are used from other roles.
Роль **не** глушит вывод (`--quiet` убран намеренно) и по наличию этой
подстроки (`eget_no_upgrade_marker`) выставляет `changed_when`: реальная
установка → `changed`, пропуск → `ok`. Ненулевой код выхода eget (реальная
ошибка) роняет таск штатно.
Example Playbook
----------------
> Ограничения `--upgrade-only` (сравнение по дате релиза vs mtime бинарника, а
> не по версии — поэтому это **не** строгий пиннинг тега):
>
> - Бамп тега на релиз, опубликованный раньше текущей установки, и любой
> **даунгрейд** eget сочтёт «не новее» и не поставит (роль покажет `ok`).
> На практике теги двигают только вперёд на свежие релизы; откат версии —
> вручную (удалить бинарник, затем прогнать роль).
> - Если имя бинарника не совпадает с последним сегментом `repo` (напр.
> `BurntSushi/ripgrep` → `rg`), eget не находит установленный файл, и роль
> будет **переустанавливать пакет каждый прогон** (рапортуя `changed`). Все
> текущие пакеты этим не задеты; для таких репозиториев ставь бинарник в
> отдельную директорию либо не полагайся на статус `changed`.
Including an example of how to use your role (for instance, with variables passed in as parameters) is always nice for users too:
## Переменные
- hosts: servers
roles:
- { role: username.rolename, x: 42 }
Полный список и значения по умолчанию — в `defaults/main.yml`.
License
-------
| Переменная | По умолчанию | Назначение |
|------------|--------------|------------|
| `eget_version` | `1.3.4` | Версия самой утилиты eget. |
| `eget_install_path` | `/usr/bin/eget` | Куда ставить бинарник eget. |
| `eget_download_url` | ссылка на релиз | URL архива eget (собирается из версии). |
| `eget_download_checksum` | `""` | Необязательная проверка архива eget (формат `get_url.checksum`). |
| `eget_packages_to` | `/usr/local/bin` | Директория для бинарников пакетов по умолчанию. |
| `eget_packages` | `[]` | Декларативный список пакетов (см. ниже). |
BSD
### Схема элемента `eget_packages`
Author Information
------------------
| Ключ | Обяз. | Назначение |
|------|:----:|------------|
| `repo` | да | `owner/repo` на GitHub, напр. `restic/restic`. |
| `tag` | да | Пиновка версии, напр. `v0.18.1`. |
| `to` | нет | Целевая директория; по умолчанию `eget_packages_to`. |
| `asset` | нет | Один фильтр ассета, напр. `zip` или `^musl` (`^` — анти-матч). |
| `assets` | нет | Список фильтров (каждый → свой `--asset`); приоритетнее `asset`. |
| `file` | нет | `--file` glob для выбора файла из архива. |
An optional section for the role authors to include contact information, or a website (HTML is not allowed).
## Пример
```yaml
- name: "Install eget and pinned binaries"
hosts: all
tasks:
- name: "Install eget and tools"
ansible.builtin.import_role:
name: eget
vars:
eget_install_path: "/usr/local/bin/eget"
eget_packages_to: "/usr/local/bin"
eget_packages:
- {repo: "restic/restic", tag: "v0.18.1"}
- {repo: "rclone/rclone", tag: "v1.73.4", asset: "zip"}
- {repo: "bootandy/dust", tag: "v1.2.4", asset: "gnu"}
- {repo: "creativeprojects/resticprofile", tag: "v0.32.0", asset: "^no_self_update"}
```
## License
MIT