Проблема: 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)
91 lines
4.2 KiB
YAML
91 lines
4.2 KiB
YAML
---
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
# Bootstrap — первичная настройка нод
|
||
#
|
||
# Запускать ОДИН РАЗ перед make install.
|
||
# Подключается с начальными логин/пароль из vault (host_vars/<node>/vault.yml).
|
||
#
|
||
# Выполняет:
|
||
# 1. Создаёт всех пользователей из cluster_service_users (sudo, SSH dir)
|
||
# 2. Раскладывает SSH ключ Ansible runner в k3s_admin_user
|
||
# После этого все playbook работают по ключу без пароля.
|
||
#
|
||
# k3s_admin_user — должен быть одним из cluster_service_users (см. group_vars).
|
||
# По умолчанию: devops
|
||
#
|
||
# Требования (host_vars/<node>/vault.yml для каждой ноды):
|
||
# bootstrap_user: ubuntu
|
||
# bootstrap_password: "пароль"
|
||
# ─────────────────────────────────────────────────────────────────────────────
|
||
|
||
# ── Фаза 1: Создать всех пользователей из cluster_service_users ──────────────
|
||
- name: "Bootstrap phase 1: create service users"
|
||
hosts: "{{ node_to_bootstrap | default('k3s_cluster') }}"
|
||
gather_facts: true
|
||
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
|
||
|
||
pre_tasks:
|
||
- name: Validate bootstrap credentials
|
||
ansible.builtin.assert:
|
||
that:
|
||
- 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:
|
||
bootstrap_user: ubuntu
|
||
bootstrap_password: "пароль"
|
||
Зашифруй: 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:
|
||
|
||
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
|