やりたいこと: capistrano のタスクを vagrant マシンに適用して開発したい。vagrant へのログイン情報を capistrano から取得したい
事前準備
vagrant 内で git clone などすると思うので、ssh agent forward の設定をしておく
Vagrantfile
Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
+ config.ssh.forward_agent = true
end
Mac の keychain に鍵を登録しておく. keychain に入れておくと毎回 ssh-add しなくてすむ。-K オプションを使う。
$ ssh-add -K .ssh/id_rsa
やりかた
vagrant ssh-config で諸々情報が取れる
$ vagrant ssh-config
Host vagrant-centos
HostName 127.0.0.1
User vagrant
Port 2200
UserKnownHostsFile /dev/null
StrictHostKeyChecking no
PasswordAuthentication no
IdentityFile /Users/seo.naotoshi/.vagrant/machines/vagrant-centos/virtualbox/private_key
IdentitiesOnly yes
LogLevel FATAL
ForwardAgent yes
なので、これを capistrano の変数に設定するメソッドをちょろっと書いて利用する
config/deploy.rb
set :application, 'oreno'
set :repo_url, 'git@github.com:sonots/oreno.git'
set :deploy_to, '/var/app/oreno'
def set_vagrant_user
ssh_config = {}
Bundler.with_clean_env do
out = `vagrant ssh-config`
out.split("\n").each do |line|
line.strip!
key, value = line.split(" ", 2)
value.slice!(0) if value.start_with?('"')
value.slice!(-1) if value.end_with?('"')
ssh_config[key] = value
end
end
set :user, ssh_config["User"]
set :ssh_options,
user: ssh_config["User"],
port: ssh_config["Port"],
keys: [ssh_config["IdentityFile"]],
forward_agent: ssh_config["ForwardAgent"] == "yes" ? true : false
end
config/deploy/development.rb
set_vagrant_user
roles :app, ['127.0.0.1']
これで、
$ cap development deploy
で vagrant にログインしてデプロイできる。
ToDo
めっちゃ小さいメソッドだけど gem にしてもいいのかもね。