itamaeで自分のMac環境を作る その2

itamaeで自分のMac環境を作る その1の続きです。

今回はログの表示とか、commandを実行してみた、Gitからリポジトリをとってきた辺りまでやりました。

前回、rbenvをGitでcloneするところで詰まっていました。

cook(なんて呼べばいいのだろう)はできたっぽそうだけど、.rbenvというファイルとかができていない…。

コマンドは実行できていたのだけど、ディレクトリができなかった。
そこで、会社の人に相談してみたら、

「問題を切り分けて、考えるといいよ」

と言われ、細かく問題を切り分けて作業をしてみて、原因を探ることにしました。
まず、vagrant上でgit cloneができるかやってみる。

1
2
3
4
$ vagrant ssh
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
$ ls -a
. .. .bash_history .bash_logout .bash_profile .bashrc .rbenv .ssh .vbox_version

cloneはできているみたいですね。
じゃあきっと問題はitamae側の書き方だ…!

でも、ログを見ると成功しているっぽいんですよね。
ただし、ログも詳細に出せるらしいので、ちょっと調べてみた。
多分ログを指定できる種類って一般的に決まっていることが多い。

http://www.adminweb.jp/apache/log/index4.html
ここのサイトを参考に、debugを指定してみる。

itamaeのhelpを見ると、

1
2
3
4
5
6
7
8
9
10
11
12
13
$ itamae -h
Commands:
itamae docker RECIPE [RECIPE...] --image=IMAGE # Create Docker image
itamae help [COMMAND] # Describe available commands or one specific c...
itamae local RECIPE [RECIPE...] # Run Itamae locally
itamae ssh RECIPE [RECIPE...] # Run Itamae via ssh
itamae version # Print version
Options:
-l, [--log-level=LOG_LEVEL]
# Default: info
[--color], [--no-color]
# Default: true

Optionsに親切に-lでログを指定できるよと書いてある。

1
$ itamae ssh -h default --vagrant ruby.rb --log-level=debug

すると…?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
INFO : Starting Itamae...
DEBUG : Executing `mkdir -p /tmp/itamae_tmp`...
DEBUG : exited with 0
DEBUG : Executing `chmod 777 /tmp/itamae_tmp`...
DEBUG : exited with 0
INFO : Recipe: /Users/nakano/projects/itamae-vagrant/ruby.rb
DEBUG : execute[install rbenv from Git]
DEBUG : execute[install rbenv from Git] action: run
DEBUG : (in pre_action)
DEBUG : (in set_current_attributes)
DEBUG : (in show_differences)
INFO : execute[install rbenv from Git] executed will change from 'false' to 'true'
DEBUG : Executing `echo 'eval "$(rbenv init -)"' >> ~/.bash_profile`...
DEBUG : exited with 0
DEBUG : This resource is updated.
DEBUG : This resource is updated.

よく見ると、最後に評価されたコマンドしか実行されていない!!
ブロック内ではコマンドは返り値(?)にあたるものしか実行されないのかな?

じゃあまた切り分けで、cloneだけするように書けばどうだろうか

1
2
3
execute "install rbenv from Git" do
command "git clone https://github.com/sstephenson/rbenv.git ~/.rbenv"
end

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ itamae ssh -h default --vagrant rbenv.rb --log-level=debug
INFO : Starting Itamae...
DEBUG : Executing `mkdir -p /tmp/itamae_tmp`...
DEBUG : exited with 0
DEBUG : Executing `chmod 777 /tmp/itamae_tmp`...
DEBUG : exited with 0
INFO : Recipe: /Users/nakano/projects/itamae-vagrant/rbenv.rb
DEBUG : execute[install rbenv from Git]
DEBUG : execute[install rbenv from Git] action: run
DEBUG : (in pre_action)
DEBUG : (in set_current_attributes)
DEBUG : (in show_differences)
INFO : execute[install rbenv from Git] executed will change from 'false' to 'true'
DEBUG : Executing `git clone https://github.com/sstephenson/rbenv.git ~/.rbenv`...
ERROR : Command `git clone https://github.com/sstephenson/rbenv.git ~/.rbenv` failed. (exit status: 128)
ERROR : stdout | fatal: destination path '/root/.rbenv' already exists and is not an empty directory.
ERROR : execute[install rbenv from Git] Failed.

あら、失敗した。実際にもう既にフォルダがあると実行されないのかも。
あと、Gitからcloneとかするだけなら、リソースがあって、そっちを使った方がいいらしい。
なので以下のように変更する。

1
2
3
git '/home/vagrant/.rbenv' do
repository "git://github.com/sstephenson/rbenv.git"
end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
$ itamae ssh -h default --vagrant rbenv.rb --log-level=debug
INFO : Starting Itamae...
DEBUG : Executing `mkdir -p /tmp/itamae_tmp`...
DEBUG : exited with 0
DEBUG : Executing `chmod 777 /tmp/itamae_tmp`...
DEBUG : exited with 0
INFO : Recipe: /Users/nakano/projects/itamae-vagrant/rbenv.rb
DEBUG : git[/home/vagrant/.rbenv]
DEBUG : git[/home/vagrant/.rbenv] action: sync
DEBUG : (in pre_action)
DEBUG : (in set_current_attributes)
DEBUG : Executing `test -d /home/vagrant/.rbenv`...
DEBUG : exited with 0
DEBUG : (in show_differences)
DEBUG : git[/home/vagrant/.rbenv] exist will not change (current value is 'true')
DEBUG : Executing `which git`...
DEBUG : exited with 0
DEBUG : stdout | /usr/bin/git
DEBUG : Executing `test -d /home/vagrant/.rbenv`...
DEBUG : exited with 0
DEBUG : Executing `cd /home/vagrant/.rbenv && git fetch origin`...
DEBUG : exited with 0
DEBUG : Executing `cd /home/vagrant/.rbenv && git ls-remote origin HEAD | cut -f1`...
DEBUG : exited with 0
DEBUG : stdout | 7ad01b2b485fb635d7a96daef33f6a733e5b1c80
DEBUG : Executing `cd /home/vagrant/.rbenv && git rev-list HEAD | head -n1`...
DEBUG : exited with 0
DEBUG : stdout | 7ad01b2b485fb635d7a96daef33f6a733e5b1c80

こうするとエラーが出なくなりました。やったね!
多分、コマンドで実行するなら

1
2
3
4
execute "install rbenv from Git" do
command "git clone https://github.com/sstephenson/rbenv.git ~/.rbenv"
not_if "ls -a | grep rbenv"
end

not_ifと書いて、「もしrbenvというディレクトリがなかったら実行する」みたいな感じにする必要があると思います。

よし、じゃあrbenvコマンドを使えるようにPATHに追加する。

1
2
3
4
5
6
7
8
9
execute "set PATH rbenv" do
command %Q(echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> /home/vagrant/.bash_profile)
not_if "cat /home/vagrant/.bash_profile | grep '$HOME/.rbenv/bin:$PATH'"
end
execute "set rbenv init to bash_profile" do
command %q(echo 'eval "$(rbenv init -)"' >> /home/vagrant/.bash_profile)
not_if "cat /home/vagrant/.bash_profile | grep 'rbenv init'"
end

cook(みたいなこと)をして、ログインして確認してみる

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$ v ssh
mkdir: ディレクトリ `/home/vagrant/.rbenv/shims' を作成できません: 許可がありません
mkdir: ディレクトリ `/home/vagrant/.rbenv/versions' を作成できません: 許可がありません
$ ls -a
. .. .bash_history .bash_logout .bash_profile .bashrc .rbenv .ssh .vbox_version
$ cat ~/.bash_profile
# .bash_profile
# Get the aliases and functions
if [ -f ~/.bashrc ]; then
. ~/.bashrc
fi
# User specific environment and startup programs
PATH=$PATH:$HOME/bin
export PATH
export PATH="$HOME/.rbenv/bin:$PATH"
eval "$(rbenv init -)"

…あれ?
.rbenvのファイルはできているし、環境変数への追加もできていそう。
ユーザ関係なのかな。
ちょっとハマってしまったところで今日はタイムアップ
(最近やればやるほどserverkitいいなぁと思い始めています。タイトルの目的を達成するという意味でも)