(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