feat: добавлены роли mdadm и k8s-user с полной оркестрацией SSH ключей

Роль 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
This commit is contained in:
Sergey Antropoff
2026-04-24 06:50:22 +03:00
parent 24846d2e52
commit 408779a379
15 changed files with 470 additions and 10 deletions

View File

@@ -49,7 +49,7 @@ k3s_common_packages:
- nfs-common
- mc
- htop
- vim
- nano
- wget
- open-iscsi
- bash-completion
@@ -155,40 +155,54 @@ cert_manager_namespace: "cert-manager"
# none — не создавать (настрой вручную)
# selfsigned — самоподписанный CA (для внутреннего использования)
# letsencrypt — Let's Encrypt (требует публичный домен)
cert_manager_issuer: "selfsigned" # none | selfsigned | letsencrypt
cert_manager_issuer: "letsencrypt" # none | selfsigned | letsencrypt
# Let's Encrypt (нужен только если cert_manager_issuer: letsencrypt)
cert_manager_acme_email: "admin@example.com"
cert_manager_acme_server: "prod" # prod | staging
# ─── etcd backup ──────────────────────────────────────────────────────────────
etcd_backup_dir: "{{ k3s_data_dir }}/server/db/snapshots"
etcd_backup_dir: "{{ k3s_data_dir }}/server/etcd/snapshots"
etcd_backup_retention: 5 # сколько снимков хранить локально
etcd_backup_copy_to_local: false # скопировать снимок на Ansible-хост
etcd_backup_local_dir: "./etcd-backups"
# ─── Istio (Service Mesh) ──────────────────────────────────────────────────────
# istio_enabled: false (задаётся выше)
# istio_version: "1.22.2"
# istio_mtls_mode: "STRICT" # STRICT | PERMISSIVE | DISABLE
# istio_install_gateway: true
# Kiali (UI для Istio) — требует istio_enabled: true
# Токен задаётся в vault.yml:
# vault_kiali_token: "" # заполни после первой установки (токен выведет Ansible)
# kiali_enabled: false (задаётся выше)
# vault_kiali_token: "" # заполни после первой установки (токен выведет Ansible)
# ─── kube-prometheus-stack (Prometheus + Grafana + Alertmanager) ───────────────
# prometheus_stack_enabled: false (задаётся выше)
# prometheus_stack_version: "60.3.0"
# prometheus_retention_days: 7
# prometheus_storage_size: "10Gi"
# Grafana: логин и пароль — задай в vault.yml:
# vault_grafana_user: "admin"
# vault_grafana_password: "ваш-пароль"
# vault_grafana_user: "admin"
# vault_grafana_password: "ваш-пароль"
# grafana_admin_user: "{{ vault_grafana_user | default('admin') }}"
# prometheus_grafana_admin_password: "{{ vault_grafana_password | default('admin') }}"
# prometheus_grafana_ingress_enabled: false
# prometheus_grafana_ingress_host: "grafana.local"
# ─── mdadm ────────────────────────────────────────────────────────────────────
# Поиск RAID массива и монтирование в /storage
# Отключить на конкретной ноде: задай mdadm_enabled: false в host_vars/<node>/main.yml
mdadm_enabled: false
# ─── k8s-user ─────────────────────────────────────────────────────────────────
# Сервисный пользователь k8s — создаётся на всех серверах (кластер + lab_hosts)
# RSA 4096 ключ генерируется один раз на первом мастере, затем раскладывается везде
k8s_service_user: k8s
k8s_service_user_shell: /bin/bash
k8s_service_user_comment: "K8S Service Account"
k8s_service_user_key_type: rsa
k8s_service_user_key_bits: 4096
k8s_service_user_key_comment: "k8s@cluster"
k8s_service_user_ssh_dir: ".ssh"
k8s_service_user_sudo: true