LoginSignup
0
0

More than 5 years have passed since last update.

ChefTips: recipeの中で何かを確認して、NGだったらCookbook実行を止める方法

Last updated at Posted at 2018-04-25

Cookbookの中で、何かを確認してそのような状況になっていなかった場合に、Cookbookをエラーで停止させる方法を説明します。

解決したい課題

手順書の中で、なにかの設定をする前に

  • 『XXサーバのXX番ポートにConnectできること』
  • 『OpenSSHとかSudoコマンドが導入されていること』

を確認が必要なケースがあります。

この手の確認は前提条件として予め確認しておいたり、Serverspecなどのテストツールで確認することが望ましいです。ですが、予め確認するにしても手で確認するのは面倒ですし、他のテストツールを用意してその使い方を覚えるのも骨が折れるものです。

ここでは、Chefを使って確認して、正常な状態でなかったらErrorでCookbook実行を止める方法をご紹介します。

ここでは、Linux上で特定のサーバの特定ポートと疎通できるか確認し、疎通できたら後続の処理を流す、疎通できなかったらエラーで止める、という処理の実装例をご紹介します。

実装例

ポート接続確認をする際は、古くは、telnet www.yahoo.co.jp:80 とかで書くことが多かったです。しかし、最近のLinuxには telnetが入っていません。そこで、Defaultでインストールされている curl で実装します。

result = shell_out('echo | curl -v telnet://www.yahoo.co.jp:81 --connect-timeout 1 --max-time 1')
if result.exitstatus != 0
  raise 'can\'t connect to www.yahoo.co.jp:81!!'
end

出力例

以下のようなエラーで停止します。そのまんまですね。


 RuntimeError
 ------------
 can't connect to www.yahoo.co.jp:81!!

(中略)

 Relevant File Content:
 ----------------------
(中略)
   9:
  10:  result = shell_out('echo | curl -v telnet://www.yahoo.co.jp:81 --connect-timeout 1 --max-time 1')
  11:  if result.exitstatus != 0
  12>>   raise 'can\'t connect to www.yahoo.co.jp:81!!'
  13:  end

その他

上記の実装例は、shell_out(xxxx)の部分を、NGだったら0以外を返すシェルコマンドに置き換えてあげるだけで、様々な確認にしようできます。

Chef Cookbookで、エラー停止させたい場合はraise 、コマンド実行したい時は shell_outを使います。便利ですので覚えておいてください。

また、ポート確認をWindowsで実施したい場合、curlでなく、powershell で実装可能そうです。
telnetコマンドのないWindowsでのTCPポート確認

参考

【初心者向け】各OSのTCP通信チェックコマンド入門
Chefのshell_outshell_out!、違いと使い分け
[Chef]recipe中でchef-clientの実行を中止する

0
0
2

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
0
0