5
6

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.

itamaeのrun_commandで例外をスローしたくない

Last updated at Posted at 2015-08-28

(8/30記事修正)

記事前半の記述についてご指摘をいただきました。
動作確認したところuserリソースは存在しない場合のみ作成してくれますね。
後半のrun_commandの例外スローについての記事としてお読みくださいm(_ _)m

itamaeでレシピをチマチマと作っているんですが、
同じレシピを2回目以降実行した際に、データが重複したりエラーになったりしないようにしなくてはいけません。
そこで、だいたい下記のようなイメージで条件分岐をいれてやることになると思います。

unless "ユーザーが既に存在しているか?" 
  user "me" do
    action :create
  end
end

さて、その条件分岐のために使えるのがrun_commandです。
こんな風に書きます。

run_command("cat /etc/passwd | grep me")

その名の通り、引数で渡されたコマンドをシェルで実行し、その結果を返すメソッドです。
実行結果を判定して処理の判定に使えば良さそうですね。
ただ上記のコードの場合、meユーザーがいない状態で実行すると例外が発生して以降のレシピが中断されてしまいます。


run_command("cat /etc/passwd | grep me")

例えば、meユーザーのいない状態で↑のようなレシピを実行すると下記のような例外が投げられて以降の処理が中断してしまいます。

ERROR :   Command `cat /etc/passwd | grep me` failed. (exit status: 1)

以下のようにerrorオプションを渡してやることで例外としてスローされることなく、run_commandの戻り値を取得することができます。

result = run_command("cat /etc/passwd | grep me", error: false)
result.stdout #=> ""
result.stderr  #=> ""
result.exit_status #=> 1
5
6
3

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
5
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?