Подтвердить что ты не робот

Незаменимая копия ssh-ключа от одного узла к другому

У меня есть 2 сервера приложений с загрузчиком перед ними и 1 сервер базы данных в моей системе. Я предоставляю им использование Ansible. Серверы приложений имеют Nginx + Passenger и работают для приложения Rails. Будет использовать capistrano для развертывания, но у меня есть проблема с ключами ssh. Мой репозиторий git находится на другом сервере, и я должен генерировать открытые ключи ssh на серверах приложений и добавлять их на сервер git (в файл authorized_keys). Как я могу сделать это в незанятой пьесе?

PS: у меня может быть более 2 серверов приложений.

enter image description here

4b9b3361

Ответ 1

Взгляните на author_key module для получения информации о том, как управлять открытыми ключами.

Самое простое решение, о котором я могу думать, это создать новую пару ключей для вашего приложения, чтобы делиться всеми вашими приложениями. Это может иметь последствия для безопасности (вы действительно используете ключи между всеми экземплярами!), но это упростит процесс подготовки.

Вам также потребуется развернуть пользователя на каждом компьютере приложений, который будет использоваться позже во время процесса развертывания. Для каждого пользователя развертывания authorized_keys вам понадобится ваш открытый ключ (или jenkins one).

Эскизная пьеса:

---
- name: ensure app/deploy public key is present on git server
  hosts: gitserver
  tasks:
    - name: ensure app public key
      authorized_key: 
        user: "{{ git_user }}" 
        key: app_keys/id_dsa.pub 
        state: present

- name: provision app servers
  hosts: appservers
  tasks:
    - name: ensure app/deploy user is present
      user: 
        name: "{{ deploy_user }}"
        state: present

    - name: ensure you'll be able to deploy later on
      authorized_key:
        user: "{{ deploy_user }}" 
        key: "{{ path_to_your_public_key }}" 
        state: present

    - name: ensure private key and public one are present
      copy: 
        src: keys/myapp.private 
        dest: "/home/{{ deploy_user }}/.ssh/{{ item }}" 
        mode: 0600
      with_items:
        - app_keys/id_dsa.pub
        - app_keys/id_dsa

Ответ 2

Это делает трюк для меня, он собирает открытые ключи ssh на узлах и распределяет их по всем узлам. Таким образом, они могут общаться друг с другом.

- hosts: controllers
  gather_facts: false
  remote_user: root
  tasks:
    - name: fetch all public ssh keys
      shell: cat ~/.ssh/id_rsa.pub
      register: ssh_keys
      tags:
        - ssh

    - name: check keys
      debug: msg="{{ ssh_keys.stdout }}"
      tags:
        - ssh

    - name: deploy keys on all servers
      authorized_key: user=root key="{{ item[0] }}"
      delegate_to: "{{ item[1] }}"
      with_nested:
        - "{{ ssh_keys.stdout }}"
        - "{{groups['controllers']}}"
      tags:
        - ssh

Информация: Это для пользователя root

Ответ 3

Я бы создал пользователя развертывания, который ограничил доступ к вашим репозиториям. Вы можете либо разрешить это через http, либо есть несколько вариантов сделать это по ssh.

Если вы не заботитесь о том, чтобы ограничить доступ к вашему репо только для чтения, тогда вы можете создать обычного пользователя ssh. После создания пользователя вы можете использовать Ansible для добавления открытого ключа пользователя в авторизованный файл ключа на сервере git, вы можете использовать авторизованный ключевой модуль.

После настройки у вас есть два варианта:

  • Если вы используете ssh, используйте ssh key forwarding, чтобы пользователь, который используется для запуска задачи Ansible, отправляет свой открытый ключ на dev-сервер.

  • Временно переведите ключ и используйте параметр ssh_opts git для использования открытого ключа развертывания.