Ansible копировать ssh ключ с одного хоста на другой
У меня есть 2 сервера приложений с loadbalancer перед ними и 1 сервер базы данных в моей системе. Я готовлю их с помощью Ansible. Серверы приложений имеют Nginx + Passenger и работают для приложения Rails. Будет использовать capistrano для развертывания, но у меня есть проблема с ключами ssh. Мой git repo находится на другом сервере, и я должен генерировать открытые ключи ssh на appservers и добавлять их на сервер Git(в файл authorized_keys). Как я могу сделать это в ansible playbook?
PS: у меня может быть больше чем 2 сервера приложений.
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 вы можете использовать уполномоченным ключ модуль.
после установки у вас есть два варианта:
Если вы используете ssh, используйте переадресацию ключей ssh, чтобы пользователь, используемый для запуска задачи Ansible, отправлял свой открытый ключ на сервер dev.
временно передайте ключ и используйте
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 }}"