From 564432755d4e379dddef21698474b18c7249d1e0 Mon Sep 17 00:00:00 2001 From: Anton Vakhrushev Date: Fri, 24 Jul 2026 21:26:39 +0300 Subject: [PATCH] =?UTF-8?q?Ansible:=20=D1=82=D0=BE=D1=87=D0=B5=D1=87=D0=BD?= =?UTF-8?q?=D1=8B=D0=B5=20=D1=84=D0=B8=D0=BA=D1=81=D1=8B=20=D0=B8=D0=B4?= =?UTF-8?q?=D0=B5=D0=BC=D0=BF=D0=BE=D1=82=D0=B5=D0=BD=D1=82=D0=BD=D0=BE?= =?UTF-8?q?=D1=81=D1=82=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - backup-targets собирается одной copy вместо lineinfile в цикле: теперь удаление цели из списка реально убирает строку из файла (7 плейбуков) - netdata: getent вместо grep по /etc/group, ушёл бессмысленный changed_when и мёртвый фолбэк PGID - исправлены копипастные имена play в wanderer и remove-user-and-app --- docs/backlog/README.md | 1 - docs/backlog/ansible-quick-fixes.md | 25 ----------------------- files/netdata/docker-compose.template.yml | 2 +- playbook-calibre.yml | 14 ++++++------- playbook-gramps.yml | 16 +++++++-------- playbook-memos.yml | 14 ++++++------- playbook-netdata.yml | 18 ++++++++-------- playbook-outline.yml | 14 ++++++------- playbook-remove-user-and-app.yml | 2 +- playbook-tududi.yml | 14 ++++++------- playbook-tuwunel.yml | 12 +++++------ playbook-wanderer.yml | 14 ++++++------- 12 files changed, 54 insertions(+), 92 deletions(-) delete mode 100644 docs/backlog/ansible-quick-fixes.md diff --git a/docs/backlog/README.md b/docs/backlog/README.md index de1747c..ba9bbe3 100644 --- a/docs/backlog/README.md +++ b/docs/backlog/README.md @@ -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 _(ансибл-ревью)_ ## Низкий diff --git a/docs/backlog/ansible-quick-fixes.md b/docs/backlog/ansible-quick-fixes.md deleted file mode 100644 index a597279..0000000 --- a/docs/backlog/ansible-quick-fixes.md +++ /dev/null @@ -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. diff --git a/files/netdata/docker-compose.template.yml b/files/netdata/docker-compose.template.yml index fd37560..8c52931 100644 --- a/files/netdata/docker-compose.template.yml +++ b/files/netdata/docker-compose.template.yml @@ -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: diff --git a/playbook-calibre.yml b/playbook-calibre.yml index 6fadedf..55ffdc8 100644 --- a/playbook-calibre.yml +++ b/playbook-calibre.yml @@ -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: diff --git a/playbook-gramps.yml b/playbook-gramps.yml index 2e37221..685b92c 100644 --- a/playbook-gramps.yml +++ b/playbook-gramps.yml @@ -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: diff --git a/playbook-memos.yml b/playbook-memos.yml index dcbb117..abc94a7 100644 --- a/playbook-memos.yml +++ b/playbook-memos.yml @@ -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: diff --git a/playbook-netdata.yml b/playbook-netdata.yml index 68cd552..a9d7f9d 100644 --- a/playbook-netdata.yml +++ b/playbook-netdata.yml @@ -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: diff --git a/playbook-outline.yml b/playbook-outline.yml index 015afca..d29d651 100644 --- a/playbook-outline.yml +++ b/playbook-outline.yml @@ -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: diff --git a/playbook-remove-user-and-app.yml b/playbook-remove-user-and-app.yml index 070ee87..b5c2ab8 100644 --- a/playbook-remove-user-and-app.yml +++ b/playbook-remove-user-and-app.yml @@ -1,5 +1,5 @@ --- -- name: "Update and upgrade system packages" +- name: "Remove user and application" hosts: all vars: diff --git a/playbook-tududi.yml b/playbook-tududi.yml index 78f951a..5b0dae8 100644 --- a/playbook-tududi.yml +++ b/playbook-tududi.yml @@ -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: diff --git a/playbook-tuwunel.yml b/playbook-tuwunel.yml index f76e6cc..1f0396d 100644 --- a/playbook-tuwunel.yml +++ b/playbook-tuwunel.yml @@ -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: diff --git a/playbook-wanderer.yml b/playbook-wanderer.yml index 5e96b32..74bfd2d 100644 --- a/playbook-wanderer.yml +++ b/playbook-wanderer.yml @@ -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: