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_out
とshell_out!
、違いと使い分け
[Chef]recipe中でchef-clientの実行を中止する