今までサーバー内に入ってgit pullしてデプロイメントをしていたんだけれど、とても21世紀とは思えないのでcapistranoを導入しました。ついでにロードバランサーを設けてアプリケーションサーバー2台の構成にしてみたんですがssh-key周りが気になりました。
これまでサーバ内でssh-keygenして公開鍵をgithubのdeploy_keyに置いていたんだけどこの方法だとサーバ台数が増える度にgithub上の公開鍵の数も増えていくし管理もクソもあったもんではないと思いググっていたらどうやらssh-agentという方法があるらしい。
ssh-agentを使用すると、capistranoコマンドを叩く開発者のssh-keyを使ってデプロイをしてくれる。
まずcapistranoのコードは以下のようになる。
server '○○○.×××.○○.××',
user: "hogehoge",
roles: %w{web app},
port: 12345
set :rails_env, 'production'
set :stage, :production
set :branch, :master
set :unicorn_rack_env, "production"
set :ssh_options, {
# capistranoコマンド実行者の秘密鍵
keys: %w(~/.ssh/id_rsa),
forward_agent: true,
auth_methods: %w(publickey)
}
これでcapistranoはコマンド実行者のssh-keyを使ってデプロイをしてくれる。
でもこれだけだとgithubからソースコードを取ってこれないのでgithubの方にも自分の公開鍵を置く必要がある。さらに自分のssh-keyをssh-agentで使用する場合は以下のコマンドをローカル環境で実行する必要がある。
ssh-add ~/.ssh/id_rsa
ssh-agent用に鍵が登録されているかどうかは以下のコマンドで確認することができる。
ssh-add -l
githubに公開鍵が置いてあって、サーバ内のauthorized_keysのpermmisionも600になっているのに、capistranoがgit ls-remoteとかでストップした時にはssh-agentに登録されていない可能性がデカい気がする。この方法ならサーバー台数が数十とかあってもgithubにデプロイ担当者の公開鍵を1度置けば良いので楽だと思った。
ただしデプロイする人が複数人いる場合は、各々の秘密鍵のディレクトリや名称を合わせる必要がありそうなのと、全てのサーバのauthorized_keysにそれぞれの公開鍵をchefなどのプロビジョニングツールで配布する必要がありそう。