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,23 +1,17 @@
---
# ─── Bootstrap — создание пользователя и деплой SSH ключа ────────────────────
# Пользователь, который будет создан для управления кластером
k3s_admin_user: ansible
k3s_admin_shell: /bin/bash
k3s_admin_comment: "K3S Ansible Admin"
# Дополнительные группы для k3s_admin_user (sudo добавляется отдельно)
k3s_admin_groups: []
# ─── Bootstrap — деплой SSH ключа Ansible runner ─────────────────────────────
# Пользователь создаётся роль k8s-user (cluster_service_users), здесь только
# добавляется SSH ключ Ansible-машины в authorized_keys k3s_admin_user.
# Путь к SSH публичному ключу внутри контейнера (монтируется из ~/.ssh)
# Поддерживает несколько ключей — укажи список файлов или строк
# Поддерживает несколько ключей — укажи список файлов
k3s_admin_ssh_public_key_files:
- /root/.ssh/id_ed25519.pub
# Дополнительные публичные ключи (строки) — добавляются помимо файлов выше
# Дополнительные публичные ключи строками (из vault, для нескольких инженеров)
k3s_admin_ssh_additional_keys: []
# Отключить вход по паролю для SSH после деплоя ключа (рекомендуется)
# Отключить вход по паролю для SSH после деплоя ключа (рекомендуется в prod)
k3s_admin_disable_password_auth: false
# Перезапустить SSH после изменения конфигурации

View File

@@ -1,8 +1,9 @@
---
# ─────────────────────────────────────────────────────────────────────────────
# Bootstrap — создание пользователя для управления кластером + деплой SSH ключа
# Запускается один раз с первоначальными credentials (логин/пароль из vault)
# После этого все playbook работают через SSH ключ без пароля
# Bootstrap — деплой SSH ключа Ansible runner → k3s_admin_user
#
# Пользователь k3s_admin_user уже создан на предыдущем шаге (k8s-user role).
# Эта задача только добавляет публичный ключ Ansible-машины в authorized_keys.
# ─────────────────────────────────────────────────────────────────────────────
- name: Gather minimal facts
@@ -10,41 +11,7 @@
gather_subset:
- min
- name: Create admin group (if not exists)
ansible.builtin.group:
name: "{{ k3s_admin_user }}"
state: present
become: true
- name: Create k3s admin user
ansible.builtin.user:
name: "{{ k3s_admin_user }}"
comment: "{{ k3s_admin_comment }}"
shell: "{{ k3s_admin_shell }}"
groups: "{{ ([k3s_admin_user] + k3s_admin_groups) | unique }}"
append: true
create_home: true
state: present
become: true
- name: Configure passwordless sudo for admin user
ansible.builtin.copy:
dest: /etc/sudoers.d/{{ k3s_admin_user }}
content: "{{ k3s_admin_user }} ALL=(ALL) NOPASSWD:ALL\n"
mode: '0440'
validate: visudo -cf %s
become: true
- name: Ensure .ssh directory exists
ansible.builtin.file:
path: "/home/{{ k3s_admin_user }}/.ssh"
state: directory
owner: "{{ k3s_admin_user }}"
group: "{{ k3s_admin_user }}"
mode: '0700'
become: true
- name: Deploy SSH public keys from files
- name: Deploy SSH public keys from files to {{ k3s_admin_user }}
ansible.posix.authorized_key:
user: "{{ k3s_admin_user }}"
key: "{{ lookup('file', item) }}"
@@ -55,7 +22,7 @@
label: "{{ item | basename }}"
ignore_errors: true
- name: Deploy additional SSH public keys (from vault strings)
- name: Deploy additional SSH public keys (from vault strings) to {{ k3s_admin_user }}
ansible.posix.authorized_key:
user: "{{ k3s_admin_user }}"
key: "{{ item }}"
@@ -75,7 +42,7 @@
when: k3s_admin_disable_password_auth | bool
notify: Restart sshd
- name: Ensure PermitRootLogin is disabled
- name: Disable root SSH login
ansible.builtin.lineinfile:
path: /etc/ssh/sshd_config
regexp: "^#?PermitRootLogin"
@@ -103,15 +70,12 @@
failed_when: false
when: k3s_admin_ssh_public_key_files | length > 0
- name: Show bootstrap result
- name: Bootstrap result for {{ inventory_hostname }}
ansible.builtin.debug:
msg: >
Нода {{ inventory_hostname }}:
Пользователь '{{ k3s_admin_user }}' создан.
SSH ключ задеплоен.
{{ inventory_hostname }}: SSH ключ задеплоен для '{{ k3s_admin_user }}'.
{% if ssh_test is defined and ssh_test.rc == 0 %}
✓ SSH вход по ключу подтверждён.
{% else %}
⚠ SSH вход по ключу не проверен (возможно, ключ ещё не в ssh-agent).
⚠ SSH ключ задеплоен, проверь вход вручную: ssh {{ k3s_admin_user }}@{{ ansible_host | default(inventory_hostname) }}
{% endif %}
Добавь в inventory: ansible_user={{ k3s_admin_user }}