画像
画像

自分の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で買っ
てよかった。

入門Chef Solo - Infrastructure as Code amazon.co.jp