Files
K3S/addons/yandex-dns-controller/role/tasks/main.yml
Sergey Antropoff 404347b535 feat: добавить аддон yandex-dns-controller — управление DNS Yandex 360
CronJob (*/5 мин) reconcile ConfigMap → Yandex 360 DNS API.
Safe mode: управляет только записями с managed: true.
Никогда не удаляет неуправляемые записи (MX, DKIM, SPF и т.д.).

Удаление только при двух условиях одновременно:
  1. Запись была создана контроллером (есть в state ConfigMap)
  2. Запись полностью удалена из ConfigMap (не просто managed: false)

Переключение managed: true → false = release без удаления из DNS.

API: /directory/v1/org/{org_id}/domains/{domain}/dns
Fields: A→content, CNAME→target, TXT→text, MX→exchange+preference
2026-04-26 12:16:32 +03:00

136 lines
5.8 KiB
YAML

---
# ── Validate inputs ───────────────────────────────────────────────────────────
- name: Validate yandex_dns credentials
ansible.builtin.assert:
that:
- yandex_dns is defined
- yandex_dns.org_id is defined and yandex_dns.org_id | length > 0
- yandex_dns.token is defined and yandex_dns.token | length > 0
fail_msg: >
yandex_dns.org_id and yandex_dns.token must be set in vault.yml.
Get org_id from https://admin.yandex.ru/company-profile
Get token from https://oauth.yandex.ru/
- name: Validate yandex_dns_controller_zones has at least one domain
ansible.builtin.assert:
that:
- yandex_dns_controller_zones.domains is defined
- yandex_dns_controller_zones.domains | length > 0
fail_msg: >
yandex_dns_controller_zones.domains is empty.
Define at least one domain in group_vars/all/addons.yml.
# ── Create namespace ──────────────────────────────────────────────────────────
- name: Create yandex-dns-controller namespace
ansible.builtin.command: >
k3s kubectl create namespace {{ yandex_dns_controller_namespace }}
--dry-run=client -o yaml | k3s kubectl apply -f -
become: true
changed_when: false
# ── Copy Helm chart to master node ───────────────────────────────────────────
- name: Ensure chart temp directory is clean
ansible.builtin.file:
path: /tmp/yandex-dns-controller-chart
state: absent
become: true
- name: Create chart temp directory
ansible.builtin.file:
path: /tmp/yandex-dns-controller-chart
state: directory
mode: "0755"
become: true
- name: Copy Helm chart to master
ansible.builtin.copy:
src: "{{ role_path }}/chart/"
dest: /tmp/yandex-dns-controller-chart/
mode: preserve
become: true
# ── Template Helm values ──────────────────────────────────────────────────────
- name: Template Helm values
ansible.builtin.template:
src: values.yaml.j2
dest: /tmp/yandex-dns-controller-values.yaml
mode: "0600"
become: true
no_log: true # contains OAuth token
# ── Lint chart ────────────────────────────────────────────────────────────────
- name: Lint Helm chart
ansible.builtin.command: >
helm lint /tmp/yandex-dns-controller-chart
--values /tmp/yandex-dns-controller-values.yaml
become: true
changed_when: false
register: _helm_lint
failed_when: _helm_lint.rc != 0
# ── Deploy chart ──────────────────────────────────────────────────────────────
- name: Deploy yandex-dns-controller via Helm
ansible.builtin.command: >
helm upgrade --install {{ yandex_dns_controller_release_name }}
/tmp/yandex-dns-controller-chart
--namespace {{ yandex_dns_controller_namespace }}
--values /tmp/yandex-dns-controller-values.yaml
--atomic
--wait
--timeout 120s
become: true
register: _helm_result
changed_when: true
# ── Cleanup temp values file (contains token) ─────────────────────────────────
- name: Remove temp values file
ansible.builtin.file:
path: /tmp/yandex-dns-controller-values.yaml
state: absent
become: true
# ── Verify ────────────────────────────────────────────────────────────────────
- name: Get CronJob status
ansible.builtin.command: >
k3s kubectl -n {{ yandex_dns_controller_namespace }} get cronjob -o wide
become: true
changed_when: false
register: _cronjob_status
# ── Summary ───────────────────────────────────────────────────────────────────
- name: "=== yandex-dns-controller Ready ==="
ansible.builtin.debug:
msg:
- "╔══════════════════════════════════════════════════════════════╗"
- "║ Yandex 360 DNS Controller — Deployed ║"
- "╚══════════════════════════════════════════════════════════════╝"
- ""
- " Namespace : {{ yandex_dns_controller_namespace }}"
- " Schedule : {{ yandex_dns_controller_schedule }}"
- " Dry-run : {{ yandex_dns_controller_dry_run }}"
- " Domains : {{ yandex_dns_controller_zones.domains | map(attribute='name') | list | join(', ') }}"
- ""
- " CronJob:"
- "{{ _cronjob_status.stdout_lines | to_yaml }}"
- ""
- " Manual trigger:"
- " kubectl create job --from=cronjob/yandex-dns-controller dns-manual-1 \\"
- " -n {{ yandex_dns_controller_namespace }}"
- ""
- " Logs:"
- " kubectl -n {{ yandex_dns_controller_namespace }} logs \\"
- " -l app.kubernetes.io/name=yandex-dns-controller --tail=100 -f"
- ""
- " State:"
- " kubectl -n {{ yandex_dns_controller_namespace }} get cm yandex-dns-controller-state \\"
- " -o jsonpath='{.data.state\\.json}' | jq ."