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:
@@ -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 _(ансибл-ревью)_
|
||||
|
||||
## Низкий
|
||||
|
||||
|
||||
@@ -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.
|
||||
@@ -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:
|
||||
|
||||
@@ -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
@@ -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
@@ -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
@@ -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:
|
||||
|
||||
@@ -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,5 +1,5 @@
|
||||
---
|
||||
- name: "Update and upgrade system packages"
|
||||
- name: "Remove user and application"
|
||||
hosts: all
|
||||
|
||||
vars:
|
||||
|
||||
+6
-8
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user