Files
ansible-roles/roles/eget/README.md
T

89 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# eget
Устанавливает утилиту [eget](https://github.com/zyedidia/eget) и через неё —
пиновые бинарники релизов с GitHub (restic, rclone, btop, zellij и т.п.).
Роль общая для всех серверных репозиториев; канон живёт в `ansible-roles`,
копии вендорятся через `inv roles-pull`.
## Что делает
1. **Bootstrap eget.** Если нужной версии `eget` нет — качает архив релиза с
GitHub напрямую (сам себя eget обновить не может — chicken-and-egg),
распаковывает во временную директорию, ставит бинарник и убирает мусор.
Идемпотентно: сверяет `eget --version` с `eget_version`.
2. **Установка пакетов.** Идёт по декларативному списку `eget_packages` и для
каждого вызывает `eget <repo> --tag <tag> --upgrade-only …`.
## Идемпотентность и статус изменений
`--upgrade-only` заставляет eget скачивать бинарник, только если релиз новее
установленного файла (сравнение по mtime). Когда обновление не нужно, eget
пишет в stderr `… requested release is not more recent than current version`
и выходит с кодом 0.
Роль **не** глушит вывод (`--quiet` убран намеренно) и по наличию этой
подстроки (`eget_no_upgrade_marker`) выставляет `changed_when`: реальная
установка → `changed`, пропуск → `ok`. Ненулевой код выхода eget (реальная
ошибка) роняет таск штатно.
> Ограничения `--upgrade-only` (сравнение по дате релиза vs mtime бинарника, а
> не по версии — поэтому это **не** строгий пиннинг тега):
>
> - Бамп тега на релиз, опубликованный раньше текущей установки, и любой
> **даунгрейд** eget сочтёт «не новее» и не поставит (роль покажет `ok`).
> На практике теги двигают только вперёд на свежие релизы; откат версии —
> вручную (удалить бинарник, затем прогнать роль).
> - Если имя бинарника не совпадает с последним сегментом `repo` (напр.
> `BurntSushi/ripgrep` → `rg`), eget не находит установленный файл, и роль
> будет **переустанавливать пакет каждый прогон** (рапортуя `changed`). Все
> текущие пакеты этим не задеты; для таких репозиториев ставь бинарник в
> отдельную директорию либо не полагайся на статус `changed`.
## Переменные
Полный список и значения по умолчанию — в `defaults/main.yml`.
| Переменная | По умолчанию | Назначение |
|------------|--------------|------------|
| `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` | `[]` | Декларативный список пакетов (см. ниже). |
### Схема элемента `eget_packages`
| Ключ | Обяз. | Назначение |
|------|:----:|------------|
| `repo` | да | `owner/repo` на GitHub, напр. `restic/restic`. |
| `tag` | да | Пиновка версии, напр. `v0.18.1`. |
| `to` | нет | Целевая директория; по умолчанию `eget_packages_to`. |
| `asset` | нет | Один фильтр ассета, напр. `zip` или `^musl` (`^` — анти-матч). |
| `assets` | нет | Список фильтров (каждый → свой `--asset`); приоритетнее `asset`. |
| `file` | нет | `--file` glob для выбора файла из архива. |
## Пример
```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