自分のinit.elや.zshenvはGitHubのPrivateリポジトリで管理しています。
masutaka.netでも同じ設定を使いたかったので、Chef経由(実際はKnife
Solo経由)でgit cloneしようとしたら結構ハマったので、メモしておきます。
ぶっちゃけmasutaka.netに秘密鍵をおけば、ハマることはないです。でも
セキュリティ的にあんまりなので、sshのforward agent機能を使い、ロー
カルの公開鍵をリモートでも使うようにします。
(1) sshのforward agentを設定する
やり方は簡単で、ローカルの~/.ssh/configに以下を追加し、ローカルで
ssh-addコマンドを実行するだけ。
Host masutaka.net
ForwardAgent yes
この状態でmasutaka.netにsshログインし、git cloneすることが出来まし
た。ssh-add -l
コマンドでローカルの公開鍵が使われていることを確認
できます。
検証環境にVagrantを使っているので、Vagrantfileにも追加しました
(~/.ssh/configに設定しても構いません)。
config.ssh.forward_agent = true
(2) sudo時に公開鍵を引き継ぐ
Chefからgit cloneするため、内部的にはsudo経由でgit cloneすることに
なります。
Ubuntu 12.04.2 LTSのデフォルト設定は以下のとおり、sudo時に環境変数
は引き継ぎません(実際sudo git clone
すると失敗するはず)。
# /etc/sudoers
Defaults env_reset
環境変数SSH_AUTH_SOCKだけ引き継ぐようにします(レシピを書きました)。
# /etc/sudoers
Defaults env_reset
Defaults env_keep += "SSH_AUTH_SOCK"
sudo ssh-add -l
コマンドでローカルの公開鍵が使われていることを確認
できます。
(3) ~/.ssh/known_hostsに書き込むか尋ねさせない
これで大丈夫だろうとChefのレシピを実行したところ、以下のプロンプト
が。でもyesと打っても一向に再開されません。
The authenticity of host 'masutaka.net (XXX.XXX.XXX.XXX)' can't be established.
RSA key fingerprint is (省略).
Are you sure you want to continue connecting (yes/no)?
yes
がリモートに届かないようなので、そもそも尋ねさせないようにしま
した。リモートの~/.ssh/configに以下を追加するレシピを書きました。
Host github.com
StrictHostKeyChecking no
(4) (2)とgit cloneのレシピは別で実行する
こんどこそ大丈夫だろうとChefのレシピを実行したところ、まだgit
cloneに失敗します。ただいろいろ試すと、成功することもありました。
どうやら、(2)の/etc/sudoersのレシピと、git cloneのレシピは別で実行
する必要があるようです。Chefは1回のsudoで複数のレシピを実行するみた
いですね。とりあえずうまくいきました。やった!
謝辞
以下の記事にお世話になりました。ありがとうございます。
vagrantのchefによるprovisioningでgitのprivte repositoryを扱う - あんこの成長記録
/etc/sudoersのenv_resetオプションについて少し勉強してみた - ぱちブログ
~/.ssh/ 以下に書き込めない環境で ssh したとき known_hosts に書き込めないエラーを抑制する - Qiita [キータ]
もちろん『入門Chef Solo』には毎回お世話になっております。Kindleで買っ
てよかった。