vagrantのchefによるprovisioningでgitのprivte repositoryを扱う

いろいろと要求と制限があったけど、わりときれいに解決したのでめも。

まずはssh forward agentの設定

# ~/.ssh/config
Host *
    ForwardAgent yes

$ eval `ssh-agent`
$ ssh-add ~/.ssh/id_rsa

Vagrantfileにもforward agentの設定を書く。

# Vagrantfile
Vagrant.configure("2") do |config|
  # ...
  config.ssh.forward_agent = true
  # ...

あとは、こんな感じにsudoersにSSH_AUTH_SOCKを設定してgit repositoryをsyncするrecipeを書いて、それをprovisionに指定すればOK。provision走らせると、githubのprivate repositoryからVMの中にちゃんと持ってくることができる。Defaultsのうしろの\tの入力に注意。

deploy_user = node["git_repository_to_deploy"]["deploy_user"]

file "/etc/sudoers.d/root_ssh_agent" do
  mode 0440
  owner 'root'
  group 'root'
  content "Defaults\tenv_keep += \"SSH_AUTH_SOCK\""
end

git "/home/#{deploy_user}/deploy/" do
  repository "git@github.com:some/repo.git"
  reference "master"
  action :sync
  user deploy_user
  group deploy_user
end