- hosts: all become: yes vars: # Имя провижнера на сервере step-ca, который имеет право подписывать хосты step_host_provisioner: "ssh-host-provisioner" # Путь к файлу с паролем от этого провижнера на вашей Ansible-машине step_provisioner_password_file: "/etc/step-ca/host_provisioner_password.txt" tasks: - name: Создание временной папки на Ansible-машине для генерации ключей хоста delegate_to: localhost become: no file: path: "/tmp/ssh_host_certs/{{ inventory_hostname }}" state: directory mode: '0755' - name: Локальная генерация временной пары ключей на Ansible-машине delegate_to: localhost become: no openssh_keypair: path: "/tmp/ssh_host_certs/{{ inventory_hostname }}/ssh_host_ed25519_key" type: ed25519 state: present - name: Удаленный выпуск Хост-сертификата силами step-ca delegate_to: localhost become: no shell: > step ssh certificate {{ inventory_hostname }} /tmp/ssh_host_certs/{{ inventory_hostname }}/ssh_host_ed25519_key.pub --host --sign --provisioner "{{ step_host_provisioner }}" --password-file "{{ step_provisioner_password_file }}" --ca-url root-ca.guaranteedstruggle.host --root /usr/local/share/ca-certificates/pmc314_root-ca.crt --principal "{{ inventory_hostname }}" --principal "{{ ansible_host }}" --force # step создаст два файла: сам публичный ключ и файл сертификата с суффиксом -cert.pub # Нам нужно забрать получившийся сертификат и положить его на целевую ноду - name: Копирование сгенерированного ЗАКРЫТОГО ключа хоста на целевую виртуалку copy: src: "/tmp/ssh_host_certs/{{ inventory_hostname }}/ssh_host_ed25519_key" dest: /etc/ssh/ssh_host_ed25519_key owner: root group: root mode: '0600' # Закрытый ключ должен быть строго 0600 - name: Копирование сгенерированного публичного ключа хоста на целевую виртуалку copy: src: "/tmp/ssh_host_certs/{{ inventory_hostname }}/ssh_host_ed25519_key.pub" dest: /etc/ssh/ssh_host_ed25519_key.pub owner: root group: root mode: '0644' - name: Копирование сгенерированного Хост-сертификата на целевую виртуалку copy: src: "/tmp/ssh_host_certs/{{ inventory_hostname }}/ssh_host_ed25519_key-cert.pub" dest: /etc/ssh/ssh_host_ed25519_key-cert.pub owner: root group: root mode: '0640' # Сертификат может быть 0640 - name: Add SSH Host CA to global known_hosts known_hosts: path: /etc/ssh/ssh_known_hosts name: "*.guaranteedstruggle.host" key: "@cert-authority *.guaranteedstruggle.host,192.168.0.* ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAINBFlDSADidBfwn3aDJiZM6Yg14bTjDTY6FxNsnBmT2B" state: present become: true - name: Configure SSH HostKeys for Proxmox compatibility blockinfile: path: /etc/ssh/sshd_config # Или укажите путь к дроп-ину в sshd_config.d/, если используете их block: | # Coexistence with Proxmox internal clustering (Plain Keys fallback) HostKey /etc/ssh/ssh_host_rsa_key marker: "# {mark} ANSIBLE MANAGED HOST RSA KEY BLOCK #" create: true mode: '0600' validate: /usr/sbin/sshd -t -f %s when: "'proxmoxes' in group_names" notify: Restart SSH - name: Настройка sshd_config для отдачи Хост-сертификата клиентам blockinfile: path: /etc/ssh/sshd_config block: | HostKey /etc/ssh/ssh_host_ed25519_key HostCertificate /etc/ssh/ssh_host_ed25519_key-cert.pub marker: "# {mark} ANSIBLE MANAGED HOST CERTIFICATE BLOCK #" notify: Restart SSH - name: Configure ROOT ACCESS for proxmoxes blockinfile: path: /etc/ssh/sshd_config # Или укажите путь к дроп-ину в sshd_config.d/, если используете их block: | Match User root Address 127.0.0.1,::1,192.168.0.71,192.168.0.72,192.168.0.73,192.168.0.74,192.168.0.75,192.168.0.89 PermitRootLogin yes PubkeyAuthentication yes # Включаем root в белый список только для условий этого матча: AllowUsers root marker: "# {mark} ANSIBLE MANAGED ROOT ACCESS for proxmoxes BLOCK #" create: true mode: '0600' validate: /usr/sbin/sshd -t -f %s when: "'proxmoxes' in group_names" notify: Restart SSH - name: Очистка временных файлов на Ansible-машине delegate_to: localhost become: no file: path: "/tmp/ssh_host_certs/{{ inventory_hostname }}" state: absent handlers: - name: Restart SSH service: name: sshd state: restarted