Ansible копировать ssh ключ с одного хоста на другой

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

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

enter image description here

4 ответов


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

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

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

эскиз playbook:

---
- 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

это делает трюк для меня, он собирает открытые ключи 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

Info: для


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

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

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

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

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


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

Вы можете вызвать эту роль во вложенном цикле исходной и целевой списки хостов, как показано внизу:

---
#****h* ansible/ansible_roles_ssh_authorize_user
# NAME
#   ansible_roles_ssh_authorize_user - Authorizes user via ssh keys
#
# FUNCTION
#
#   Copies user's SSH public key from a source user in a source host
#   to a target user in a target host
#
# INPUTS
#
#   * ssh_authorize_user_source_user
#   * ssh_authorize_user_source_host
#   * ssh_authorize_user_target_user
#   * ssh_authorize_user_target_host
#****
#****h* ansible_roles_ssh_authorize_user/main.yml
# NAME
#   main.yml - Main playbook for role ssh_authorize_user
# HISTORY
#   $Id: $
#****

- assert:
    that:
      - ssh_authorize_user_source_user != ''
      - ssh_authorize_user_source_host != ''
      - ssh_authorize_user_target_user != ''
      - ssh_authorize_user_target_host != ''
  tags:
    - check_vars
- name: Generate SSH Keypair in Source
  user:
    name: "{{ ssh_authorize_user_source_user }}"
    state: present
    ssh_key_comment: "ansible-generated for {{ ssh_authorize_user_source_user }}@{{ ssh_authorize_user_source_host }}"
    generate_ssh_key: yes
  delegate_to: "{{ ssh_authorize_user_source_host }}"
  register: source_user
- name: Install SSH Public Key in Target
  authorized_key:
    user: "{{ ssh_authorize_user_target_user }}"
    key: "{{ source_user.ssh_public_key }}"
  delegate_to: "{{ ssh_authorize_user_target_host }}"
- debug:
    msg: "{{ ssh_authorize_user_source_user }}@{{ ssh_authorize_user_source_host }} authorized to log in to {{ ssh_authorize_user_target_user }}@{{ ssh_authorize_user_target_host }}"

вызов роли в цикле:

- name: Authorize User
  include_role:
    name: ssh_authorize_user
  vars:
    ssh_authorize_user_source_user: "{{ git_user }}"
    ssh_authorize_user_source_host: "{{ item[0] }}"
    ssh_authorize_user_target_user: "{{ git_user }}"
    ssh_authorize_user_target_host: "{{ item[1] }}"
  with_nested:
    - "{{ app_server_list }}"
    - "{{ git_server_list }}"