インフラ環境試験の自動化を考える
お疲れ様です。伊藤です。
本日は少々趣向を変えてインフラ試験について書きたいと思います。ただ、こちらの内容は私自身も現在調査中で、あいまいな内容が多いので間違いや勘違いがあるかもしれませんのでご了承ください。
という前置きをして、タイトルの件です。
インフラ試験の自動化と言ってもあまり大層なことはできないですね。基本的には
- 設定値確認
- OSの設定
- 機能のインストール
- 機能の設定
- 動作確認
- 正常系動作
- 異常系動作
と大まかにこんな感じだと思います。まあそのほかに総合試験的なものもあるかと思います。
その中で自動化できるのは設定値確認、特に設定した値を確認する箇所ぐらいかなと。
まあその中でもどこを自動化するか、というのは重要なところかと思います。結局単発の試験や試行錯誤が必要な試験は手動でやった方が早いです。動作確認などでサーバをフェールオーバさせて待機系が正常終了するか、なんてのは自動化がとても難しいと思うので準備しているうちに期間が過ぎてしまいます。
効率化のために自動化をしようとしているので、自動化して手間が増えた、というのではちょっと本末転倒ですね。
というわけで自動化に向いているのは設定した値が正しくなっているかを確認する項目ぐらいになるかな、というところです。特に一度構築した後に何度も手を入れるような設定をやっていると、毎回設計書通りに値が設定されているかを確認する必要があるので、そこを自動化しておくとよろしいかと。
で、テスト系のツールです。私も今どのツールにしようか検討しているところですので、その情報を記載しておきます。
- Serverspec
王道だと思います。rubyベースのテストツールです。ほとんどのテスト系ツールはserverspecを基にしたり、参考にしているように感じます(主観
ただし、rubyを導入するのに敷居が高い場合がありますので、すべての場合に適用できるわけではありません。ansibleに合わせてpythonベースのものがあればいいのですが。。基本的には設定値の確認など中からのテストが得意。
- Infrataster
インフラテスターではありません。インフラテイスター。クックパッドの人が作ったからそうなったっぽい。こちらもRubyベースですが、動作確認系が得意です。Httpで外からアクセスしたり、外部からDBにアクセスしたり、ping飛ばしたり。今回はちょっと用途が違うので外します。
- TestInfta
ちょっと名前がダサいですが、こちらはServerspecのpython版の位置づけのツールのようです。そう!こういうのを探してた!でも、、、日本語のドキュメントがすごく少ないです。とりあえずこちらを導入して使えるものかどうか調べていきます。
というわけで当ブログではTestInfraを採用して動作検証していきます。どこまでできるかわかりませんが期待せずにお待ちください。
以上です、お疲れ様でした。
Ansibleのエラーメッセージ
お疲れ様です。伊藤です。
ちょっとModuleの説明(というか公式の翻訳情報ですが。。。)が続いたのでちょっと趣向を変えてplaybook実行時のエラーについて書きます。
というのもAnsibleのエラーメッセージは英語で分かりづらくネットにも情報がほとんど上がっていないので多少なりとも上げていきたいと。。そういう感じです。
基本的なエラーメッセージの見方ですが、"msg":の後がメッセージになっているのでその部分を拾っていけばOKです。後は\n\rとか改行記号が入っていたりするのでそのせいで読み辛くなってたりします。
- エラーメッセージ
fatal: [xxx.xxx.xxx.xxx]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host xxx.xxx.xxx.xxx port 5986: No route to host\r\n", "unreachable": true} to retry, use: --limit @/try-ansible-best-practices/site.retry
- 対処
Moduleはuserですが、エラー内容は関係ありません。このメッセージが出た場合はWindowsの接続用に通信ポートが5986(WinRM)になっていた状態でLinuxにSSHで接続しようとして繋げないよ、というエラーになっています。この場合は変数にansible_ssh_port=5986の記載があり、変数を設定する場所をミスってLinuxも含め全サーバこの変数が対象になっていたためです。Windowsのみこの変数のが有効になるように宣言をきちんとして正常終了しました。
- エラーメッセージ
fatal: [xxx.xxx.xxx.xxx]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: Host key verification failed.\r\n", "unreachable": true}
- 対処
これもモジュールは関係ありません。SSHの鍵認証の設定がミスっており、ノーパスワードでSSH接続ができない状態になっていた時に発生したものです。鍵認証でSSH接続できるように設定しましょう。
- エラーメッセージ
fatal: [xxx.xxx.xxx.xxx]: FAILED! => {"changed": false, "failed": true, "msg": "value of state must be one of: present,absent, got: resent"}
- 対処
これは単純にPlaybookの記載ミスでstateにpresentと設定すべきところがresentになっていたため発生したものです。これはメッセージがわかりやすいですね。
- エラーメッセージ
fatal: [xxx.xxx.xxx.xxx]: FAILED! => {"changed": false, "failed": true, "msg": "Could not find the requested service iptables: host"}
- 対処
これはRHEL7.3に対してiptablesを再起動するように指示しましたが、RHEL7以降はiptablesというサービスは存在せずにfirewalldになっているため、そんなサービス無いよ、と言われたものです。RHEL6では動きますがRHEL7では動かない、という例です。
- エラーメッセージ
fatal: [xxx.xxx.xxx.xxx]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh: ssh: connect to host 192.168.1.105 port 22: No route to host\r\n", "unreachable": true}
- 対処
こちらは単純に対象のサーバが停止していて接続できなかった場合です。対象サーバが起動していることを確認しましょう。
取り急ぎ以上ですが、またたまったら挙げていきたいと思います。
お疲れ様でした。