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)_
|
- [Уведомления о размере приложений и диске](disk-usage-alerts.md) — алерты на заполнение диска и аномальный рост data-томов; сервер ресурсно ограничен _(tududi)_
|
||||||
- [Handlers рестарта для оставшихся приложений](handlers-remaining-apps.md) — apprise/dashboard/transcriber/miniflux монтируют конфиг в контейнер, но рестарта нет вовсе; правка конфига не подхватывается
|
- [Handlers рестарта для оставшихся приложений](handlers-remaining-apps.md) — apprise/dashboard/transcriber/miniflux монтируют конфиг в контейнер, но рестарта нет вовсе; правка конфига не подхватывается
|
||||||
- [Composable-роль `backup`](ansible-backup-role.md) — бэкап — самый чистый шов для extraction (одинаков у всех, различается только список targets) _(ансибл-ревью)_
|
- [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:/host/var/run:ro"
|
||||||
- "/var/run/docker.sock:/var/run/docker.sock:ro"
|
- "/var/run/docker.sock:/var/run/docker.sock:ro"
|
||||||
environment:
|
environment:
|
||||||
PGID: "{{ netdata_docker_group_output.stdout | default(999) }}"
|
PGID: "{{ netdata_docker_gid }}"
|
||||||
NETDATA_EXTRA_DEB_PACKAGES: "fail2ban"
|
NETDATA_EXTRA_DEB_PACKAGES: "fail2ban"
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
|
|||||||
@@ -34,16 +34,14 @@
|
|||||||
- "{{ config_dir }}"
|
- "{{ config_dir }}"
|
||||||
|
|
||||||
- name: "Create backup targets file"
|
- name: "Create backup targets file"
|
||||||
ansible.builtin.lineinfile:
|
ansible.builtin.copy:
|
||||||
path: "{{ base_dir }}/backup-targets"
|
dest: "{{ base_dir }}/backup-targets"
|
||||||
line: "{{ item }}"
|
content: |
|
||||||
create: true
|
{{ books_dir }}
|
||||||
|
{{ config_dir }}
|
||||||
owner: "{{ app_user }}"
|
owner: "{{ app_user }}"
|
||||||
group: "{{ app_user }}"
|
group: "{{ app_user }}"
|
||||||
mode: "0750"
|
mode: "0640"
|
||||||
loop:
|
|
||||||
- "{{ books_dir }}"
|
|
||||||
- "{{ config_dir }}"
|
|
||||||
|
|
||||||
- name: "Copy docker compose file"
|
- name: "Copy docker compose file"
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
|
|||||||
+7
-9
@@ -55,17 +55,15 @@
|
|||||||
mode: "0750"
|
mode: "0750"
|
||||||
|
|
||||||
- name: "Create backup targets file"
|
- name: "Create backup targets file"
|
||||||
ansible.builtin.lineinfile:
|
ansible.builtin.copy:
|
||||||
path: "{{ base_dir }}/backup-targets"
|
dest: "{{ base_dir }}/backup-targets"
|
||||||
line: "{{ item }}"
|
content: |
|
||||||
create: true
|
{{ data_dir }}
|
||||||
|
{{ media_dir }}
|
||||||
|
{{ backups_dir }}
|
||||||
owner: "{{ app_user }}"
|
owner: "{{ app_user }}"
|
||||||
group: "{{ app_user }}"
|
group: "{{ app_user }}"
|
||||||
mode: "0750"
|
mode: "0640"
|
||||||
loop:
|
|
||||||
- "{{ data_dir }}"
|
|
||||||
- "{{ media_dir }}"
|
|
||||||
- "{{ backups_dir }}"
|
|
||||||
|
|
||||||
- name: "Copy rename script"
|
- name: "Copy rename script"
|
||||||
ansible.builtin.copy:
|
ansible.builtin.copy:
|
||||||
|
|||||||
+6
-8
@@ -51,16 +51,14 @@
|
|||||||
mode: "0750"
|
mode: "0750"
|
||||||
|
|
||||||
- name: "Create backup targets file"
|
- name: "Create backup targets file"
|
||||||
ansible.builtin.lineinfile:
|
ansible.builtin.copy:
|
||||||
path: "{{ base_dir }}/backup-targets"
|
dest: "{{ base_dir }}/backup-targets"
|
||||||
line: "{{ item }}"
|
content: |
|
||||||
create: true
|
{{ data_dir }}
|
||||||
|
{{ backups_dir }}
|
||||||
owner: "{{ app_user }}"
|
owner: "{{ app_user }}"
|
||||||
group: "{{ app_user }}"
|
group: "{{ app_user }}"
|
||||||
mode: "0750"
|
mode: "0640"
|
||||||
loop:
|
|
||||||
- "{{ data_dir }}"
|
|
||||||
- "{{ backups_dir }}"
|
|
||||||
|
|
||||||
- name: "Copy docker compose file"
|
- name: "Copy docker compose file"
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
|
|||||||
+10
-8
@@ -117,14 +117,16 @@
|
|||||||
mode: "0640"
|
mode: "0640"
|
||||||
notify: "Restart application"
|
notify: "Restart application"
|
||||||
|
|
||||||
- name: "Grab docker group id."
|
- name: "Grab docker group info"
|
||||||
ansible.builtin.shell:
|
ansible.builtin.getent:
|
||||||
cmd: |
|
database: "group"
|
||||||
set -o pipefail
|
key: "docker"
|
||||||
grep docker /etc/group | cut -d ':' -f 3
|
|
||||||
executable: /bin/bash
|
# getent_group отдаёт поля строки /etc/group без имени группы,
|
||||||
register: netdata_docker_group_output
|
# то есть [пароль, gid, участники] — gid лежит под индексом 1.
|
||||||
changed_when: netdata_docker_group_output.rc != 0
|
- name: "Store docker group id"
|
||||||
|
ansible.builtin.set_fact:
|
||||||
|
netdata_docker_gid: "{{ ansible_facts.getent_group['docker'][1] }}"
|
||||||
|
|
||||||
- name: "Copy docker compose file"
|
- name: "Copy docker compose file"
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
|
|||||||
@@ -51,16 +51,14 @@
|
|||||||
mode: "0750"
|
mode: "0750"
|
||||||
|
|
||||||
- name: "Create backup targets file"
|
- name: "Create backup targets file"
|
||||||
ansible.builtin.lineinfile:
|
ansible.builtin.copy:
|
||||||
path: "{{ base_dir }}/backup-targets"
|
dest: "{{ base_dir }}/backup-targets"
|
||||||
line: "{{ item }}"
|
content: |
|
||||||
create: true
|
{{ media_dir }}
|
||||||
|
{{ backups_dir }}
|
||||||
owner: "{{ app_user }}"
|
owner: "{{ app_user }}"
|
||||||
group: "{{ app_user }}"
|
group: "{{ app_user }}"
|
||||||
mode: "0750"
|
mode: "0640"
|
||||||
loop:
|
|
||||||
- "{{ media_dir }}"
|
|
||||||
- "{{ backups_dir }}"
|
|
||||||
|
|
||||||
- name: "Copy docker compose file"
|
- name: "Copy docker compose file"
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
- name: "Update and upgrade system packages"
|
- name: "Remove user and application"
|
||||||
hosts: all
|
hosts: all
|
||||||
|
|
||||||
vars:
|
vars:
|
||||||
|
|||||||
+6
-8
@@ -39,16 +39,14 @@
|
|||||||
# ничтожна, а retention (90 дневных / 36 месячных) страхует от редкого
|
# ничтожна, а retention (90 дневных / 36 месячных) страхует от редкого
|
||||||
# несогласованного снимка.
|
# несогласованного снимка.
|
||||||
- name: "Create backup targets file"
|
- name: "Create backup targets file"
|
||||||
ansible.builtin.lineinfile:
|
ansible.builtin.copy:
|
||||||
path: "{{ base_dir }}/backup-targets"
|
dest: "{{ base_dir }}/backup-targets"
|
||||||
line: "{{ item }}"
|
content: |
|
||||||
create: true
|
{{ db_dir }}
|
||||||
|
{{ uploads_dir }}
|
||||||
owner: "{{ app_user }}"
|
owner: "{{ app_user }}"
|
||||||
group: "{{ app_user }}"
|
group: "{{ app_user }}"
|
||||||
mode: "0750"
|
mode: "0640"
|
||||||
loop:
|
|
||||||
- "{{ db_dir }}"
|
|
||||||
- "{{ uploads_dir }}"
|
|
||||||
|
|
||||||
- name: "Copy docker compose file"
|
- name: "Copy docker compose file"
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
|
|||||||
@@ -43,15 +43,13 @@
|
|||||||
state: absent
|
state: absent
|
||||||
|
|
||||||
- name: "Create backup targets file"
|
- name: "Create backup targets file"
|
||||||
ansible.builtin.lineinfile:
|
ansible.builtin.copy:
|
||||||
path: "{{ base_dir }}/backup-targets"
|
dest: "{{ base_dir }}/backup-targets"
|
||||||
line: "{{ item }}"
|
content: |
|
||||||
create: true
|
{{ data_dir }}
|
||||||
owner: "{{ app_user }}"
|
owner: "{{ app_user }}"
|
||||||
group: "{{ app_user }}"
|
group: "{{ app_user }}"
|
||||||
mode: "0750"
|
mode: "0640"
|
||||||
loop:
|
|
||||||
- "{{ data_dir }}"
|
|
||||||
|
|
||||||
- name: "Copy docker compose file"
|
- name: "Copy docker compose file"
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
- name: "Configure gramps application"
|
- name: "Configure wanderer application"
|
||||||
hosts: all
|
hosts: all
|
||||||
|
|
||||||
vars:
|
vars:
|
||||||
@@ -62,15 +62,13 @@
|
|||||||
state: absent
|
state: absent
|
||||||
|
|
||||||
- name: "Create backup targets file"
|
- name: "Create backup targets file"
|
||||||
ansible.builtin.lineinfile:
|
ansible.builtin.copy:
|
||||||
path: "{{ base_dir }}/backup-targets"
|
dest: "{{ base_dir }}/backup-targets"
|
||||||
line: "{{ item }}"
|
content: |
|
||||||
create: true
|
{{ data_dir }}
|
||||||
owner: "{{ app_user }}"
|
owner: "{{ app_user }}"
|
||||||
group: "{{ app_user }}"
|
group: "{{ app_user }}"
|
||||||
mode: "0750"
|
mode: "0640"
|
||||||
loop:
|
|
||||||
- "{{ data_dir }}"
|
|
||||||
|
|
||||||
- name: "Copy docker compose file"
|
- name: "Copy docker compose file"
|
||||||
ansible.builtin.template:
|
ansible.builtin.template:
|
||||||
|
|||||||
Reference in New Issue
Block a user