3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

適当にGitクライアントを設定するcookbookを書いてみました。対話式コマンドも自動化

Last updated at Posted at 2016-01-08

はじめに

よく仮想マシンを立てたりするので、そのたびにgit config --とか書くのが面倒なので、Chefの経験値を積むためにあえてcookbookを書いてみました。

.gitconfをコピーしたらいいじゃない?という真っ当なご意見を言われるとたぶん泣くのでやめてください!

今回のポイント

一応、オプションでssh-keygenで、SSHの認証鍵を生成するのですが、ここをなんとか入力無しにしたいという思惑がありました。調べてみたところautoexpectexpectというコマンドがあったので、利用してみました。

最初は、一時ファイルを/tmpディレクトリで実行しようとしましたが、foodcriticによると、Chef::Config[:file_cache_path]を使うと良いというので、素直に使用してみました。

参考URL:Chefレシピ逆引きメモ

Chefのスタンドアローン実行

いちいち、Chef serverまでcookbookをアップロードして、実行させるのが面倒なわたしのような方は、`chef-solo'のようにローカルで実行できるのでご安心ください

chef-clientローカルモード
$ 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を実行する
autoexpect ssh-keygen -t rsa -C "your@email.com" -f id_rsa.yourname

それで、生成されたのがscript.expというファイルです。
そして、それをテンプレート化して、erbファイルにしたのが以下のコード(抜粋)です。

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の中で、templateChef::Config[:file_cache_path]ディレクトリに展開し、実行権限を与えて`script.exp'を実行します。
recipeの抜粋はこちらになります。

ssh-keygenを自動実行する
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サイト

ご指摘等ありましたら、よろしくお願いたします。
最後まで、お読みいただきありがとうございました。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?