読者です 読者をやめる 読者になる 読者になる

MItamaeでのrun_commandの挙動が気になる

プロビジョニングとしては業務でも個人でもItamaeを使っていたが最近はMItamaeを使っている

github.com

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'])に出会った