プロビジョニングとしては業務でも個人でもItamaeを使っていたが最近はMItamaeを使っている
MItamaeについては作者のk0kubunさんのItamaeのmruby実装「MItamae」が大体いい感じになった話 - k0kubun's blogをご覧ください
今日はそんなMItameのrun_commandについて
run_command
はserver上で指定されたコマンドを実行して Specinfra::CommandResult
のインスタンスを作成してstdoout
, stderr
, exit_status
を返してくれる
> result = run_command('date') > puts result.stdout # => 2017年 5月 1日 月曜日 11時17分31秒 JST > puts result.stderr # => > puts result.exit_status # => 0
このrun_command
の引数には文字列の他に run_command(['which', 'which'])
などのように配列で渡すことも出来る 処理はこのへん
文字列でも配列のどちらで渡す場合もコマンドが有効であれば良いが fuga
などのように存在しないコマンドを実行しようとする異なる挙動をする
# run_command('fuga') の場合 $ ./bin/mitamae local recipe.rb INFO : Starting MItamae... ERROR : stderr | /bin/sh: fuga: command not found ERROR : Command `fuga` failed. (exit status: 127) # run_command(['fuga']) の場合 INFO : Starting MItamae...
run_command('fuga')
の場合はfuga
が存在しないのでERRORになる
これは想定される動き。ただ run_comamnd(['fuga'])
の場合はレスポンスが返ってこなくなる
ちなみにitamaeでは起きない
GWに時間があるのでここらへん見ていって意図しないものの場合は治したい
その時のためにそれを発見する過程を下に書いておく
この挙動を確認するまでの過程
Packerを使ってamazonlinuxのdokcer imageをベースにGitHub - k0kubun/itamae-plugin-recipe-rbenv: Itamae plugin to install ruby with rbenvを使ってrubyをいれたイメージを作ろうとした
その時のmanifestファイルの一部
{ "builders":[{ "type": "docker", "image": "amazonlinux", "export_path": "image.tar", }], "provisioners": [ ~~~ { "type": "shell", "inline": [ "./bin/mitamae-x86_64-linux local roles/ruby/default.rb", ] } ], "post-processors": [ [ { "type": "docker-import", "repository": "hatappi/ruby", "tag": "latest" } ] ] }
$ packer build ruby.manifest.json ~~ docker: INFO : git[/usr/local/pyenv] exist will change from 'false' to 'true'
このgit cloneする処理がどんだけ待っても終わらない
# Packerでdebug logを出してみる ref: https://www.packer.io/docs/other/debugging.html#debugging-packer $ PACKER_LOG=1 packer build worker.manifest.json ~~ docker: INFO : git[/usr/local/pyenv] exist will change from 'false' to 'true' 2017/05/01 8:41:35 ui: docker: INFO : git[/usr/local/pyenv] exist will change from 'false' to 'true'
特にそれらしいのは出ない
MItamaeのログレベルをdefaultのinfoから --log-level=debug
でdebugも出すようにする
$ PACKER_LOG=1 packer build worker.manifest.json ~~ docker: INFO : git[/usr/local/pyenv] exist will change from 'false' to 'true' docker: DEBUG : Executing `which git`...
which git
でとまっている…
dockerのcontainerに入って which git
をしてみると
$ which
bash: which: command not found
whichコマンドが見つからないとな
このwhich git
をしている箇所を探す
mitamae/git.rb at 78ae12b3dfd270b03286b032f786ae7e2dbf51cd · k0kubun/mitamae · GitHub
そしてrun_command(['which', 'git'])
に出会った