- name: Ensure user exists
  ansible.builtin.user:
    name: "{{ bootstrap_user }}"
    shell: /bin/bash
    groups: sudo
    append: true
    create_home: true
    state: present

# docker group создаётся только после установки Docker.
# Добавление происходит в роли docker, не здесь.

- name: Add SSH authorized keys
  ansible.posix.authorized_key:
    user: "{{ bootstrap_user }}"
    key: "{{ item }}"
    state: present
  loop: "{{ bootstrap_ssh_public_keys }}"
  when: bootstrap_ssh_public_keys | length > 0

- name: Gather service facts
  ansible.builtin.service_facts:

- name: Ensure Docker config directory exists
  ansible.builtin.file:
    path: /etc/docker
    state: directory
    mode: "0755"

- name: Configure Docker registry mirrors
  ansible.builtin.copy:
    dest: /etc/docker/daemon.json
    content: "{{ {'registry-mirrors': docker_registry_mirrors} | to_nice_json }}\n"
    mode: "0644"
  register: docker_daemon_config
  when: docker_registry_mirrors | length > 0

- name: Restart Docker after daemon config change
  ansible.builtin.service:
    name: docker
    state: restarted
  when:
    - docker_daemon_config is changed
    - "'docker.service' in ansible_facts.services"

# Команды, которые реально нужны без пароля:
#   apt / apt-get  — обновление пакетов
#   systemctl      — управление сервисами
#   ufw            — фаервол
#   resticprofile  — установка systemd-таймеров бэкапа
#
# Ansible become НЕ входит в этот список намеренно:
# для плейбуков запускать с -K. Это сознательный компромисс
# между удобством и тем, чтобы не давать python3 NOPASSWD (= root).
- name: Configure sudoers — NOPASSWD for specific commands
  ansible.builtin.copy:
    dest: /etc/sudoers.d/{{ bootstrap_user }}
    content: |
      {{ bootstrap_user }} ALL=(ALL) NOPASSWD: /usr/bin/apt, /usr/bin/apt-get
      {{ bootstrap_user }} ALL=(ALL) NOPASSWD: /usr/bin/systemctl
      {{ bootstrap_user }} ALL=(ALL) NOPASSWD: /usr/bin/ufw
      {{ bootstrap_user }} ALL=(ALL) NOPASSWD: /usr/local/bin/resticprofile
    validate: /usr/sbin/visudo -cf %s
    mode: "0440"

# Drop-in конфиг — не трогаем основной sshd_config.
# Требует Debian 12+ (OpenSSH 8.9+).
- name: Harden SSH
  ansible.builtin.copy:
    dest: /etc/ssh/sshd_config.d/99-hardening.conf
    content: |
      PasswordAuthentication no
      PermitRootLogin no
      PubkeyAuthentication yes
    mode: "0644"
  notify: restart sshd

- name: Ensure sshd_config.d is included
  ansible.builtin.lineinfile:
    path: /etc/ssh/sshd_config
    line: Include /etc/ssh/sshd_config.d/*.conf
    state: present
    insertbefore: BOF
    validate: /usr/sbin/sshd -t -f %s
  notify: restart sshd
