2台のアプリサーバーの前にロードバランサーがあり、システムに1台のデータベースサーバーがあります。 Ansibleを使用してプロビジョニングしています。アプリサーバーにはNginx + Passengerがあり、Railsアプリを実行しています。展開にcapistranoを使用しますが、sshキーに関する問題があります。私のgitリポジトリは別のサーバーにあり、ssh publicキーをappserversに追加し、Gitサーバーに追加します(authorized_keysファイルへ)。
PS:アプリサーバーが2つ以上ある場合があります。
公開鍵の管理方法に関する情報を取得するには、 authorized_key module をご覧ください。
私が考えることができる最も簡単な解決策は、アプリケーションの新しいキーペアを生成し、すべてのアプリインスタンスで共有することです。 これはセキュリティに影響する可能性があります(実際にすべてのインスタンス間でキーを共有しています!)が、プロビジョニングプロセスを大幅に簡素化します。
また、展開プロセス中に後で使用するために、各アプリマシンにユーザーを展開する必要があります。各デプロイユーザーのauthorized_keys
に公開鍵(またはjenkinsのもの)が必要です。
スケッチプレイブック:
---
- 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
情報:これはユーザーroot
用です
リポジトリへのプルアクセスに制限されているデプロイユーザーを作成します。これは、httpまたは sshを介して行うオプションがいくつかあります で許可できます。
ユーザーをリポジトリへの読み取り専用アクセスに制限する必要がない場合は、通常のsshユーザーを作成できます。ユーザーが作成されたら、Ansibleを使用してユーザーの公開キーをgitサーバー上の承認済みキーファイルに追加できます。 authorized key module を使用できます。
セットアップが完了したら、次の2つのオプションがあります。
Sshを使用する場合は、sshキー転送を使用して、Ansibleタスクの実行に使用されるユーザーが自分の公開キーをdevサーバーに送信するようにします。
キーを一時的に転送し、ssh_opts
gitモジュールオプション デプロイユーザーの公開キーを使用します。
ソースリモートホストのソースユーザーで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 }}"