Ansible: точечные фиксы идемпотентности

- backup-targets собирается одной copy вместо lineinfile в цикле: теперь
  удаление цели из списка реально убирает строку из файла (7 плейбуков)
- netdata: getent вместо grep по /etc/group, ушёл бессмысленный changed_when
  и мёртвый фолбэк PGID
- исправлены копипастные имена play в wanderer и remove-user-and-app
This commit is contained in:
av
2026-07-24 21:26:39 +03:00
parent 4d976585ec
commit 564432755d
12 changed files with 54 additions and 92 deletions
-1
View File
@@ -36,7 +36,6 @@ _(sec-ревью)_ — три независимых security-ревью на м
- [Уведомления о размере приложений и диске](disk-usage-alerts.md) — алерты на заполнение диска и аномальный рост data-томов; сервер ресурсно ограничен _(tududi)_
- [Handlers рестарта для оставшихся приложений](handlers-remaining-apps.md) — apprise/dashboard/transcriber/miniflux монтируют конфиг в контейнер, но рестарта нет вовсе; правка конфига не подхватывается
- [Composable-роль `backup`](ansible-backup-role.md) — бэкап — самый чистый шов для extraction (одинаков у всех, различается только список targets) _(ансибл-ревью)_
- [Точечные фиксы идемпотентности и баг имени play](ansible-quick-fixes.md) — быстрые правки: имя play в wanderer, `changed_when` в netdata/eget, backup-targets через template _(ансибл-ревью)_
## Низкий
-25
View File
@@ -1,25 +0,0 @@
# Точечные фиксы идемпотентности и баг имени play
**Приоритет:** средний
Быстрые пойнтовые правки без структурных изменений:
- **`playbook-wanderer.yml:2`** — play назван `"Configure gramps application"`
при `app_name: "wanderer"` (копипаст из gramps). Поправить имя. _(баг)_
- **`playbook-netdata.yml:118-125`** — `changed_when: ...rc != 0` для read-only
запроса лишён смысла; должно быть `changed_when: false`. Лучше заменить
`shell: grep docker /etc/group` на модуль `ansible.builtin.getent` — уйдёт
`pipefail` и хрупкий парсинг.
- **`playbook-eget.yml:23-78`** — восемь `command` с `changed_when: false`, хотя
реально ставят/обновляют бинарники: прогон всегда «ok», теряется честность
`--diff`. Ставить через роль `eget` (она корректно проверяет версию) или через
проверку версии.
- **`playbook-memos.yml:57-67`** и аналоги — сборка `backup-targets` через
`lineinfile` в цикле не удаляет устаревшие строки при изменении списка; `mode:
"0750"` на файле-списке выглядит как copy-paste. Чище — `template`/`copy:
content` со всем списком.
Контекст: [docs/drafts/ansible-review.md](../drafts/ansible-review.md) §4, §7.
Связано: playbook-wanderer.yml, playbook-netdata.yml, playbook-eget.yml,
playbook-memos.yml, roles/eget.
+1 -1
View File
@@ -33,7 +33,7 @@ services:
- "/var/run:/host/var/run:ro"
- "/var/run/docker.sock:/var/run/docker.sock:ro"
environment:
PGID: "{{ netdata_docker_group_output.stdout | default(999) }}"
PGID: "{{ netdata_docker_gid }}"
NETDATA_EXTRA_DEB_PACKAGES: "fail2ban"
networks:
+6 -8
View File
@@ -34,16 +34,14 @@
- "{{ config_dir }}"
- name: "Create backup targets file"
ansible.builtin.lineinfile:
path: "{{ base_dir }}/backup-targets"
line: "{{ item }}"
create: true
ansible.builtin.copy:
dest: "{{ base_dir }}/backup-targets"
content: |
{{ books_dir }}
{{ config_dir }}
owner: "{{ app_user }}"
group: "{{ app_user }}"
mode: "0750"
loop:
- "{{ books_dir }}"
- "{{ config_dir }}"
mode: "0640"
- name: "Copy docker compose file"
ansible.builtin.template:
+7 -9
View File
@@ -55,17 +55,15 @@
mode: "0750"
- name: "Create backup targets file"
ansible.builtin.lineinfile:
path: "{{ base_dir }}/backup-targets"
line: "{{ item }}"
create: true
ansible.builtin.copy:
dest: "{{ base_dir }}/backup-targets"
content: |
{{ data_dir }}
{{ media_dir }}
{{ backups_dir }}
owner: "{{ app_user }}"
group: "{{ app_user }}"
mode: "0750"
loop:
- "{{ data_dir }}"
- "{{ media_dir }}"
- "{{ backups_dir }}"
mode: "0640"
- name: "Copy rename script"
ansible.builtin.copy:
+6 -8
View File
@@ -51,16 +51,14 @@
mode: "0750"
- name: "Create backup targets file"
ansible.builtin.lineinfile:
path: "{{ base_dir }}/backup-targets"
line: "{{ item }}"
create: true
ansible.builtin.copy:
dest: "{{ base_dir }}/backup-targets"
content: |
{{ data_dir }}
{{ backups_dir }}
owner: "{{ app_user }}"
group: "{{ app_user }}"
mode: "0750"
loop:
- "{{ data_dir }}"
- "{{ backups_dir }}"
mode: "0640"
- name: "Copy docker compose file"
ansible.builtin.template:
+10 -8
View File
@@ -117,14 +117,16 @@
mode: "0640"
notify: "Restart application"
- name: "Grab docker group id."
ansible.builtin.shell:
cmd: |
set -o pipefail
grep docker /etc/group | cut -d ':' -f 3
executable: /bin/bash
register: netdata_docker_group_output
changed_when: netdata_docker_group_output.rc != 0
- name: "Grab docker group info"
ansible.builtin.getent:
database: "group"
key: "docker"
# getent_group отдаёт поля строки /etc/group без имени группы,
# то есть [пароль, gid, участники] — gid лежит под индексом 1.
- name: "Store docker group id"
ansible.builtin.set_fact:
netdata_docker_gid: "{{ ansible_facts.getent_group['docker'][1] }}"
- name: "Copy docker compose file"
ansible.builtin.template:
+6 -8
View File
@@ -51,16 +51,14 @@
mode: "0750"
- name: "Create backup targets file"
ansible.builtin.lineinfile:
path: "{{ base_dir }}/backup-targets"
line: "{{ item }}"
create: true
ansible.builtin.copy:
dest: "{{ base_dir }}/backup-targets"
content: |
{{ media_dir }}
{{ backups_dir }}
owner: "{{ app_user }}"
group: "{{ app_user }}"
mode: "0750"
loop:
- "{{ media_dir }}"
- "{{ backups_dir }}"
mode: "0640"
- name: "Copy docker compose file"
ansible.builtin.template:
+1 -1
View File
@@ -1,5 +1,5 @@
---
- name: "Update and upgrade system packages"
- name: "Remove user and application"
hosts: all
vars:
+6 -8
View File
@@ -39,16 +39,14 @@
# ничтожна, а retention (90 дневных / 36 месячных) страхует от редкого
# несогласованного снимка.
- name: "Create backup targets file"
ansible.builtin.lineinfile:
path: "{{ base_dir }}/backup-targets"
line: "{{ item }}"
create: true
ansible.builtin.copy:
dest: "{{ base_dir }}/backup-targets"
content: |
{{ db_dir }}
{{ uploads_dir }}
owner: "{{ app_user }}"
group: "{{ app_user }}"
mode: "0750"
loop:
- "{{ db_dir }}"
- "{{ uploads_dir }}"
mode: "0640"
- name: "Copy docker compose file"
ansible.builtin.template:
+5 -7
View File
@@ -43,15 +43,13 @@
state: absent
- name: "Create backup targets file"
ansible.builtin.lineinfile:
path: "{{ base_dir }}/backup-targets"
line: "{{ item }}"
create: true
ansible.builtin.copy:
dest: "{{ base_dir }}/backup-targets"
content: |
{{ data_dir }}
owner: "{{ app_user }}"
group: "{{ app_user }}"
mode: "0750"
loop:
- "{{ data_dir }}"
mode: "0640"
- name: "Copy docker compose file"
ansible.builtin.template:
+6 -8
View File
@@ -1,5 +1,5 @@
---
- name: "Configure gramps application"
- name: "Configure wanderer application"
hosts: all
vars:
@@ -62,15 +62,13 @@
state: absent
- name: "Create backup targets file"
ansible.builtin.lineinfile:
path: "{{ base_dir }}/backup-targets"
line: "{{ item }}"
create: true
ansible.builtin.copy:
dest: "{{ base_dir }}/backup-targets"
content: |
{{ data_dir }}
owner: "{{ app_user }}"
group: "{{ app_user }}"
mode: "0750"
loop:
- "{{ data_dir }}"
mode: "0640"
- name: "Copy docker compose file"
ansible.builtin.template: