はじめに
よく仮想マシンを立てたりするので、そのたびにgit config --
とか書くのが面倒なので、Chefの経験値を積むためにあえてcookbookを書いてみました。
.gitconf
をコピーしたらいいじゃない?という真っ当なご意見を言われるとたぶん泣くのでやめてください!
今回のポイント
一応、オプションでssh-keygen
で、SSHの認証鍵を生成するのですが、ここをなんとか入力無しにしたいという思惑がありました。調べてみたところautoexpect
とexpect
というコマンドがあったので、利用してみました。
最初は、一時ファイルを/tmp
ディレクトリで実行しようとしましたが、foodcriticによると、Chef::Config[:file_cache_path]
を使うと良いというので、素直に使用してみました。
参考URL:Chefレシピ逆引きメモ
Chefのスタンドアローン実行
いちいち、Chef serverまでcookbookをアップロードして、実行させるのが面倒なわたしのような方は、`chef-solo'のようにローカルで実行できるのでご安心ください
$ cd ~/chef-repo
$ sudo chef-client --local-mode --override-runlist git-client
package
などrootの操作が必要な場合は、sudo
で実行します。
autoexpect
で対話処理を自動化する
ubuntu 15.10はsudo apt install expect
でインストールできます。
ssh-keygen
を自動化したいわけなので、以下のようなコマンドを実行しました。
autoexpect ssh-keygen -t rsa -C "your@email.com" -f id_rsa.yourname
それで、生成されたのがscript.exp
というファイルです。
そして、それをテンプレート化して、erb
ファイルにしたのが以下のコード(抜粋)です。
# この前の行はコメントだらけなので省略
set timeout -1
spawn ssh-keygen -t rsa -C \"<%= node['git-client']['email'] %>\" -f <%= node['git-client']['ssh-key-filename'] %>
match_max 100000
expect -exact "Generating public/private rsa key pair.\r
Enter passphrase (empty for no passphrase): "
send -- "\r"
expect -exact "\r
Enter same passphrase again: "
send -- "\r"
expect eof
といった感じになります。passphraseを空白で埋めていますが、改造すればなんとかなりそうです。
それで、cookbookのrecipes/default.rb
の中で、template
でChef::Config[:file_cache_path]
ディレクトリに展開し、実行権限を与えて`script.exp'を実行します。
recipeの抜粋はこちらになります。
template "#{Chef::Config[:file_cache_path]}/script.exp" do
source 'script.exp.erb'
owner node['git-client']['unix-user']
group node['git-client']['group']
mode '0750'
action :create
end
if node['git-client']['if-create-ssh-key'] then
execute 'ssh-keygen' do
cwd "#{node['git-client']['home-dir']}/.ssh"
command <<-EOC
/#{Chef::Config[:file_cache_path]}/script.exp
chmod 0400 #{node['git-client']['ssh-key-filename']}
EOC
user node['git-client']['unix-user']
group node['git-client']['group']
end
end
最後に
このcookbookの実質的なメリットは~/.ssh
や秘密鍵の権限変更を忘れずしてくれることかも知れません…
GitHubサイト
ご指摘等ありましたら、よろしくお願いたします。
最後まで、お読みいただきありがとうございました。