iac/aero/roles/sarex_stack/tasks/reload.yml
emelinda da2a0b33a7 Reload: литеральный скаляр вместо свёрнутого, иначе команды склеиваются
Задача падала на первом же прогоне:
  error: unknown flag: --timeout
Свёрнутый скаляр (>-) схлопывает переносы строк в пробелы, две команды
превращаются в одну —
  kubectl rollout restart deploy/x kubectl rollout status deploy/x --timeout=...
и флаг уезжает к restart, который его не знает. С литеральным (|) переносы
сохраняются.

Баг был с самого добавления задачи: до сих пор её никто не запускал, оба
переката до этого делались вручную.
2026-08-10 08:26:24 +03:00

47 lines
3.5 KiB
YAML
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.

---
# Перекат нагрузок, которые не перезапускаются сами при правке конфигурации.
#
# ЗАЧЕМ ЭТО ОТДЕЛЬНАЯ ЗАДАЧА. Flux обновляет ConfigMap в кластере за пару минут,
# но под продолжает работать со старым содержимым: у релизов universal-chart в
# шаблоне пода нет контрольной суммы конфига, поэтому спецификация не меняется
# и Kubernetes не видит причин пересоздавать под. Всё, что задаётся через
# ConfigMap, применяется только после явного переката.
#
# Так это выглядит на практике: правишь nginx.conf, Flux рапортует Applied
# revision, проверяешь — поведение старое. Легко принять за «правка не поехала»
# и пойти искать несуществующую ошибку. Дважды так и было: сначала с порядком
# set/rewrite, потом с auth_type.
#
# ПОЧЕМУ НЕ ДЕКЛАРАТИВНО. Правильное лечение — аннотация с хешем конфига в
# шаблоне пода, тогда изменение ConfigMap меняет спецификацию и перекат
# происходит сам. Здесь так не выходит: имя ConfigMap чарту передаётся строкой,
# монтирование он делает сам, и посчитать хеш на этапе kustomize нечем —
# configMapGenerator переименовал бы ресурс, но ссылку внутри чарта, который
# рендерится уже в кластере, не поправил бы. Так что действие остаётся
# императивным, и его место — здесь, а не в чьей-то памяти.
#
# ЗАПУСК ТОЛЬКО ЯВНЫЙ. Задача не выполняется при обычном прогоне: перекат
# нагрузок посреди деплоя — не то, что должно случаться само.
# uv run poe reload
# либо точечно:
# uv run poe reload -- -e "sarex_reload_workloads=[{'namespace':'django','deployment':'frontend'}]"
- name: Перекатить нагрузки с изменённой конфигурацией
# Скаляр ЛИТЕРАЛЬНЫЙ (|), а не свёрнутый (>-). Со свёрнутым переносы строк
# схлопываются в пробелы, две команды склеиваются в одну и получается
# kubectl rollout restart deploy/x kubectl rollout status deploy/x --timeout=...
# то есть флаг уезжает к restart, который его не знает:
# error: unknown flag: --timeout
ansible.builtin.shell:
cmd: |
{{ compose_cmd }} exec -T k3s-server sh -ec '
kubectl -n {{ item.namespace }} rollout restart deploy/{{ item.deployment }}
kubectl -n {{ item.namespace }} rollout status deploy/{{ item.deployment }} --timeout={{ sarex_reload_timeout }}
'
chdir: "{{ deploy_dir }}"
loop: "{{ sarex_reload_workloads }}"
loop_control:
label: "{{ item.namespace }}/{{ item.deployment }} — {{ item.why | default('правка конфигурации') }}"
changed_when: true
tags: [reload]