it-swarm.com.ru

Копирование ssh-ключа с одного хоста на другой

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

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

enter image description here

40
beydogan

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

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

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

Эскиз пьесы:

---
- 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
28
el.atomo

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

26
Jonas Libbrecht

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

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

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

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

  2. Временно перенесите ключ и используйте параметр ssh_optsgit module , чтобы использовать открытый ключ пользователя развертывания.

1
jarv

Я создал параметризованную роль, чтобы убедиться, что пара ключей 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 }}"
0
Nicholas Sushkin