Роль k8s-user сделана универсальной:
- generate_keys.yml: имена фактов стали динамическими — {{ k8s_service_user }}_ssh_private_key
вместо захардкоженных k8s_ssh_private_key (поддержка любого пользователя)
- distribute_keys.yml: обращение к фактам через [k8s_service_user + '_ssh_private_key']
playbooks/k8s-user.yml переработан — 12 plays (6 для k8s + 6 для devops):
- devops plays вызывают ту же роль k8s-user с vars-переопределением k8s_service_user
- теги k8s/k8s_user и devops/devops_user — можно запустить одного пользователя
- ключи сохраняются: ./keys/k8s_id_rsa, ./keys/devops_id_rsa (приватные в .gitignore)
- имя файла ключа динамическое: {{ k8s_service_user }}_id_rsa
group_vars/all/main.yml:
- добавлены devops_service_user, devops_service_user_comment, devops_service_user_sudo и др.
Запуск только devops: ansible-playbook playbooks/k8s-user.yml --tags devops
Организация плейбуков:
- все .yml плейбуки перенесены из корня в playbooks/
- Makefile и entrypoint.sh обновлены — все пути с playbooks/ префиксом
- k8s-user.yml переработан: include_tasks → include_role (корректная работа из подкаталога)
Сохранение ключей и kubeconfig локально:
- k8s-user.yml: новый play сохраняет k8s SSH ключи в ./keys/ на машине запуска
- переменная k8s_local_keys_dir: "./keys" (настраивается в group_vars)
- .gitignore: keys/k8s_id_rsa исключён (публичный ключ можно коммитить)
- kubeconfig уже сохранялся роль k3s (k3s_kubeconfig_local_path: "./kubeconfig")
Автоматическая ротация сертификатов K3S (роль k3s-certs):
- K3S выпускает сертификаты на 1 год (hardcoded), таймер обеспечивает их обновление
- скрипт k3s-cert-check.sh: проверяет срок через openssl, ротирует при k3s_cert_rotate_before_days
- systemd service + timer: запуск по расписанию k3s_cert_check_schedule (по умолчанию monthly)
- RandomizedDelaySec: снижает нагрузку при одновременном запуске на нескольких нодах
- переменные: k3s_cert_validity_years: 5, k3s_cert_rotate_before_days: 90
- добавлен в site.yml (тег certs) и отдельный плейбук playbooks/k3s-certs.yml
- make k3s-certs и команда k3s-certs в entrypoint.sh
Роль mdadm:
- автоопределение RAID массива через mdadm --detail --scan
- монтирование в /storage через fstab (UUID-based, nofail)
- автоопределение fstype через blkid
- обновление mdadm.conf + initramfs
- флаг mdadm_enabled для отключения на отдельных нодах
Роль k8s-user:
- создание пользователя k8s + группа + sudo без пароля (visudo validation)
- генерация RSA 4096 ключевой пары на первом мастере (идемпотентно, creates:)
- раскладка приватного и публичного ключа на все ноды кластера
- добавление public key в authorized_keys — SSH с любой ноды на любую
- обновление /etc/hosts блоками через blockinfile (k3s_cluster + lab_hosts)
- поддержка lab_hosts: создание пользователя и деплой ключей через пароль из vault
Плейбуки:
- k8s-user.yml — полная оркестрация (5 plays: create → generate → distribute → hosts → lab)
- mdadm.yml — запуск роли mdadm на k3s_cluster
Инфраструктура:
- inventory: добавлена группа [lab_hosts] с примерами
- host_vars/nas01/vault.yml.example — шаблон credentials для лаб-серверов
- group_vars/all/main.yml: переменные mdadm_enabled и k8s_service_user_*
- Makefile: цели k8s-user и mdadm
- docker/entrypoint.sh: команды k8s-user и mdadm