telnetで疎通確認みたいなことをAnsibleでやる
DNSやrouting、firewallまわりの設定が正しくできているかの確認として、telnetやncコマンドで疎通確認するみたいな作業はインフラエンジニアにはよくある光景だと思います。
しかしどちらのコマンドも必ずサーバにインストールされているとは限らないですし、何よりAnsibleで使うには相性が悪そうです。
そんなときにはwait_for
モジュールが便利です。
wait_forモジュールとは
このモジュールの主なユースケースとしては
- Javaなどのアプリをstartしてから実際にポートがLISTEN状態になるまで待つ
- ログを確認して特定の文字列が書かれるまで待つ
など、非同期なタスクをシーケンシャルに実施したいときに役立ちます。
しかしタイムアウトを短くして使用すればポートレベルの疎通確認ができます。
使用例
※Ansible 2.9.0を使用しています
例として下記のようなPlaybookを作成しました。
% cat test.yml --- - hosts: Vag1 gather_facts: False tasks: - name: check if github.com:22 is accessible wait_for: host: github.com port: 22 state: started delay: 0 timeout: 1 - name: check if 192.168.33.12:25 is accessible wait_for: host: 192.168.33.12 port: 25 state: started delay: 0 timeout: 1 search_regex: Postfix
実際に実行してみます。
[koh@kohs-MBP] ~/vag_test % ansible-playbook test.yml PLAY [Vag1] ***************************************************************************************** TASK [check if github.com:22 is accessible] ********************************************************* ok: [Vag1] TASK [check if 192.168.33.12:25 is accessible] ****************************************************** ok: [Vag1] PLAY RECAP ****************************************************************************************** Vag1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 [koh@kohs-MBP] ~/vag_test %
疎通に問題がなければ結果はいずれもok
になります。
次に192.168.33.12(仮メールサーバ)にてfirewalldを起動してアクセスをブロックします。
[vagrant@Vag2] ~ % hostname -I 10.0.2.15 192.168.33.12 [vagrant@Vag2] ~ % sudo systemctl start firewalld [vagrant@Vag2] ~ %
再度実行してみます。
[koh@kohs-MBP] ~/vag_test % ansible-playbook test.yml PLAY [Vag1] ***************************************************************************************** TASK [check if github.com:22 is accessible] ********************************************************* ok: [Vag1] TASK [check if 192.168.33.12:25 is accessible] ****************************************************** fatal: [Vag1]: FAILED! => {"changed": false, "elapsed": 1, "msg": "Timeout when waiting for search string Postfix in 192.168.33.12:25"} PLAY RECAP ****************************************************************************************** Vag1 : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0 zsh: exit 2 ansible-playbook test.yml [koh@kohs-MBP] ~/vag_test %
上記のようにエラーとなり疎通できていないことがわかります。
まとめ
Ansible 疎通確認
などで検索してもAnsible実行ノードとターゲットノードとの疎通の話しか出てこなかったのでちょっと手こずりました。