refactor: bootstrap использует cluster_service_users вместо отдельного ansible-пользователя

Проблема: bootstrap создавал отдельного пользователя ansible (k3s_admin_user),
хотя у нас уже есть cluster_service_users с k8s и devops.

Решение:
- k3s_admin_user: devops (один из cluster_service_users, не отдельный пользователь)
- bootstrap phase 1: создаёт ВСЕХ пользователей из cluster_service_users через k8s-user role
- bootstrap phase 2: деплоит SSH ключ Ansible runner только в authorized_keys k3s_admin_user
- roles/bootstrap/tasks/main.yml: удалено создание пользователя/группы/sudoers (теперь в k8s-user)
- roles/bootstrap/defaults/main.yml: удалены k3s_admin_shell/comment/groups (не нужны)
- добавлена проверка: k3s_admin_user должен быть в cluster_service_users (assert)

group_vars/all/main.yml:
- ansible_user: "{{ k3s_admin_user }}" — все playbooks подключаются как k3s_admin_user
- ansible_ssh_private_key_file: "~/.ssh/id_rsa"
- k3s_admin_ssh_additional_keys: [] — для нескольких инженеров через vault

inventory/hosts.ini:
- убраны ansible_user=ubuntu с каждого хоста (теперь в group_vars)
- убран ansible_ssh_private_key_file из group vars (теперь в group_vars/all/main.yml)
This commit is contained in:
Sergey Antropoff
2026-04-24 07:18:57 +03:00
parent c6f3c60434
commit e99f1d5dfb
5 changed files with 98 additions and 97 deletions

View File

@@ -1,29 +1,29 @@
---
# ─────────────────────────────────────────────────────────────────────────────
# Bootstrap — первоначальная настройка нод
# Bootstrap — первичная настройка нод
#
# Запускать ОДИН РАЗ перед make install.
# Подключается с начальными логином/паролем из vault (host_vars/<node>/vault.yml).
# Создаёт пользователя k3s_admin_user, раскладывает SSH ключ.
# После этого все playbook работают по ключу без пароля.
# Подключается с начальными логин/пароль из vault (host_vars/<node>/vault.yml).
#
# Использование:
# make bootstrap
# make bootstrap NODE=master01 — только одна нода
# Выполняет:
# 1. Создаёт всех пользователей из cluster_service_users (sudo, SSH dir)
# 2. Раскладывает SSH ключ Ansible runner в k3s_admin_user
# После этого все playbook работают по ключу без пароля.
#
# Требования vault (в host_vars/<node>/vault.yml для каждой ноды):
# bootstrap_user: ubuntu # начальный пользователь
# bootstrap_password: "секрет" # пароль SSH
# bootstrap_sudo_password: "секрет" # пароль sudo (часто тот же)
# k3s_admin_user — должен быть одним из cluster_service_users (см. group_vars).
# По умолчанию: devops
#
# Требования (host_vars/<node>/vault.yml для каждой ноды):
# bootstrap_user: ubuntu
# bootstrap_password: "пароль"
# ─────────────────────────────────────────────────────────────────────────────
- name: Bootstrap cluster nodes
# ── Фаза 1: Создать всех пользователей из cluster_service_users ──────────────
- name: "Bootstrap phase 1: create service users"
hosts: "{{ node_to_bootstrap | default('k3s_cluster') }}"
gather_facts: false
gather_facts: true
serial: 1
vars:
# Подключаемся с первоначальными credentials из vault каждой ноды
ansible_user: "{{ bootstrap_user }}"
ansible_password: "{{ bootstrap_password }}"
ansible_become_password: "{{ bootstrap_sudo_password | default(bootstrap_password) }}"
@@ -34,23 +34,57 @@
-o PubkeyAuthentication=no
pre_tasks:
- name: Validate bootstrap credentials are defined
- name: Validate bootstrap credentials
ansible.builtin.assert:
that:
- bootstrap_user is defined
- bootstrap_user | length > 0
- bootstrap_password is defined
- bootstrap_password | length > 0
- bootstrap_user is defined and bootstrap_user | length > 0
- bootstrap_password is defined and bootstrap_password | length > 0
fail_msg: >
Для {{ inventory_hostname }} не заданы bootstrap credentials.
Создай host_vars/{{ inventory_hostname }}/vault.yml с полями:
Создай host_vars/{{ inventory_hostname }}/vault.yml:
bootstrap_user: ubuntu
bootstrap_password: "пароль"
Зашифруй файл: ansible-vault encrypt host_vars/{{ inventory_hostname }}/vault.yml
Зашифруй: ansible-vault encrypt host_vars/{{ inventory_hostname }}/vault.yml
- name: Validate k3s_admin_user is in cluster_service_users
ansible.builtin.assert:
that:
- cluster_service_users | selectattr('name', 'equalto', k3s_admin_user) | list | length > 0
fail_msg: >
k3s_admin_user="{{ k3s_admin_user }}" не найден в cluster_service_users.
Добавь пользователя в список или измени k3s_admin_user в group_vars.
- name: Test initial SSH connection
ansible.builtin.ping:
register: ping_result
tasks:
- name: Create user {{ item.name }}
ansible.builtin.include_role:
name: k8s-user
tasks_from: create_user.yml
vars:
k8s_service_user: "{{ item.name }}"
k8s_service_user_comment: "{{ item.comment | default(item.name) }}"
k8s_service_user_shell: "{{ item.shell | default('/bin/bash') }}"
k8s_service_user_sudo: "{{ item.sudo | default(true) }}"
k8s_service_user_ssh_dir: "{{ item.ssh_dir | default('.ssh') }}"
loop: "{{ cluster_service_users }}"
loop_control:
label: "{{ item.name }}"
# ── Фаза 2: Задеплоить SSH ключ Ansible runner в k3s_admin_user ──────────────
- name: "Bootstrap phase 2: deploy Ansible runner SSH key"
hosts: "{{ node_to_bootstrap | default('k3s_cluster') }}"
gather_facts: false
serial: 1
vars:
ansible_user: "{{ bootstrap_user }}"
ansible_password: "{{ bootstrap_password }}"
ansible_become_password: "{{ bootstrap_sudo_password | default(bootstrap_password) }}"
ansible_ssh_common_args: >-
-o StrictHostKeyChecking=no
-o UserKnownHostsFile=/dev/null
-o PasswordAuthentication=yes
-o PubkeyAuthentication=no
roles:
- role: bootstrap