Files
K3S/molecule/cluster/verify.yml
Sergey Antropoff 91299fcc1b test: добавить полное покрытие Molecule + HTML report генератор
Molecule тесты для всех аддонов и кластерный topology тест:

Аддоны (Helm lint + template + assertions):
- addons/technitium-dns/role/molecule/ — Primary/Secondary DNS, CronJob, kube-vip
- addons/authelia/role/molecule/ — OIDC clients, access_control, manifests
- addons/ingress-proxypass/role/molecule/ — proxies, Service/Endpoints/Ingress
- addons/ingress-add-domains/role/molecule/ — entries, Ingress per namespace
- addons/yandex-dns-controller/role/molecule/ — CronJob, ConfigMap, RBAC

Кластер:
- molecule/cluster/ — 3 master (embedded etcd HA) + 2 worker topology тест

Инфраструктура:
- scripts/molecule-report.py — генератор HTML отчётов из JUnit XML
  (читает /tmp/molecule-junit/*.xml → /tmp/molecule-report.html)
- requirements-python.txt — комментарий к отчётному блоку
- docker/entrypoint.sh — добавлены команды molecule-addon, molecule-cluster,
  molecule-report с автоматическим включением junit callback
- Makefile — targets: molecule-cluster, molecule-addon-*, molecule-addon-all,
  molecule-report; molecule-all генерирует HTML отчёт
- docs/molecule-testing.md — полная документация всех сценариев
- docs/addons.md — добавлены technitium-dns и authelia в таблицу аддонов
2026-04-26 18:57:11 +03:00

176 lines
7.2 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.

---
# ── Verify master node configs ────────────────────────────────────────────────
- name: Verify — k3s master configs
hosts: k3s_master
become: true
gather_facts: false
tasks:
- name: Read master config.yaml
ansible.builtin.slurp:
src: /etc/kubernetes/k3s/config.yaml
register: config_raw
- name: Parse master config
ansible.builtin.set_fact:
cfg: "{{ config_raw.content | b64decode | from_yaml }}"
- name: Assert token is set on all masters
ansible.builtin.assert:
that: cfg.token | length > 0
fail_msg: "token не задан в config.yaml на {{ inventory_hostname }}"
- name: Assert cluster-cidr is correct
ansible.builtin.assert:
that: cfg['cluster-cidr'] == '10.42.0.0/16'
fail_msg: "cluster-cidr неверный: {{ cfg['cluster-cidr'] }}"
- name: Assert service-cidr is correct
ansible.builtin.assert:
that: cfg['service-cidr'] == '10.43.0.0/16'
fail_msg: "service-cidr неверный: {{ cfg['service-cidr'] }}"
- name: Assert traefik is disabled
ansible.builtin.assert:
that: "'traefik' in cfg.disable"
fail_msg: "traefik должен быть в disable на {{ inventory_hostname }}"
# master01 — инициализатор кластера
- name: Assert master01 has cluster-init=true
ansible.builtin.assert:
that: cfg['cluster-init'] == true
fail_msg: "master01 должен иметь cluster-init: true"
when: inventory_hostname == groups['k3s_master'][0]
# master02 + master03 — присоединяются к кластеру
- name: Assert master02/master03 have server URL (join address)
ansible.builtin.assert:
that:
- cfg.server is defined
- "'192.168.1.100' in cfg.server"
- "'6443' in cfg.server"
fail_msg: "master02/master03 должны иметь server URL с VIP, получено: {{ cfg }}"
when: inventory_hostname != groups['k3s_master'][0]
- name: Assert master02/master03 do NOT have cluster-init
ansible.builtin.assert:
that: cfg['cluster-init'] is not defined
fail_msg: "master02/master03 не должны иметь cluster-init"
when: inventory_hostname != groups['k3s_master'][0]
- name: Check config file permissions are 0600
ansible.builtin.stat:
path: /etc/kubernetes/k3s/config.yaml
register: config_stat
- name: Assert config file permissions
ansible.builtin.assert:
that: config_stat.stat.mode == '0600'
fail_msg: "config.yaml должен иметь права 0600, получено: {{ config_stat.stat.mode }}"
# kube-vip manifest
- name: Check kube-vip manifest exists
ansible.builtin.stat:
path: /var/lib/kubernetes/k3s/server/manifests/kube-vip.yaml
register: kubevip_stat
- name: Assert kube-vip manifest exists
ansible.builtin.assert:
that: kubevip_stat.stat.exists
fail_msg: "kube-vip manifest не создан на {{ inventory_hostname }}"
- name: Read kube-vip manifest
ansible.builtin.slurp:
src: /var/lib/kubernetes/k3s/server/manifests/kube-vip.yaml
register: kubevip_raw
- name: Assert kube-vip VIP address in manifest
ansible.builtin.assert:
that: "'192.168.1.100' in (kubevip_raw.content | b64decode)"
fail_msg: "VIP 192.168.1.100 не найден в kube-vip manifest"
# ── Verify worker node configs ────────────────────────────────────────────────
- name: Verify — k3s worker configs
hosts: k3s_workers
become: true
gather_facts: false
tasks:
- name: Read worker config.yaml
ansible.builtin.slurp:
src: /etc/kubernetes/k3s/config.yaml
register: agent_raw
- name: Parse worker config
ansible.builtin.set_fact:
agent: "{{ agent_raw.content | b64decode | from_yaml }}"
- name: Assert workers have server URL
ansible.builtin.assert:
that:
- agent.server is defined
- "'192.168.1.100' in agent.server"
- "'6443' in agent.server"
fail_msg: "Worker {{ inventory_hostname }} должен иметь server URL с VIP"
- name: Assert workers have token
ansible.builtin.assert:
that: agent.token | length > 0
fail_msg: "token не задан в agent config на {{ inventory_hostname }}"
- name: Assert workers do NOT have cluster-init
ansible.builtin.assert:
that: agent['cluster-init'] is not defined
fail_msg: "Воркер не должен иметь cluster-init"
# ── Verify rendered addon values ──────────────────────────────────────────────
- name: Verify — ingress-nginx values template (master01)
hosts: master01
become: false
gather_facts: false
tasks:
- name: Read rendered ingress-nginx values
ansible.builtin.slurp:
src: /tmp/molecule-values/ingress-nginx.yaml
register: nginx_raw
- name: Parse ingress-nginx values
ansible.builtin.set_fact:
nginx: "{{ nginx_raw.content | b64decode | from_yaml }}"
- name: Assert ingress-nginx controller service type
ansible.builtin.assert:
that:
- nginx.controller is defined
- nginx.controller.service.type == 'LoadBalancer'
fail_msg: "ingress-nginx service type должен быть LoadBalancer"
- name: Assert metrics are enabled
ansible.builtin.assert:
that: nginx.controller.metrics.enabled == true
fail_msg: "ingress-nginx metrics должны быть включены"
# ── Summary ───────────────────────────────────────────────────────────────────
- name: Summary
hosts: localhost
gather_facts: false
tasks:
- name: Print topology
ansible.builtin.debug:
msg:
- "╔══════════════════════════════════════════════════════╗"
- "║ Cluster scenario — ALL ASSERTIONS PASSED ║"
- "╚══════════════════════════════════════════════════════╝"
- ""
- " Topology tested:"
- " Masters (cluster-init HA): master01, master02, master03"
- " Workers (agent): worker01, worker02"
- ""
- " Configs verified:"
- " ✓ master01: cluster-init=true, traefik disabled"
- " ✓ master02/03: server=https://192.168.1.100:6443"
- " ✓ worker01/02: agent config with VIP server URL"
- " ✓ kube-vip manifests rendered on all masters"
- " ✓ ingress-nginx values.yaml.j2 renders correctly"