koh’s blog

Sys Admin who loves automation

telnetで疎通確認みたいなことをAnsibleでやる

DNSやrouting、firewallまわりの設定が正しくできているかの確認として、telnetやncコマンドで疎通確認するみたいな作業はインフラエンジニアにはよくある光景だと思います。
しかしどちらのコマンドも必ずサーバにインストールされているとは限らないですし、何よりAnsibleで使うには相性が悪そうです。
そんなときにはwait_forモジュールが便利です。

wait_forモジュールとは

docs.ansible.com

このモジュールの主なユースケースとしては

  • 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
  • 1つ目のタスクはgithub.comに22ポートで疎通できるかの確認
  • 2つ目のタスクは192.168.33.12に25ポートで疎通できるか、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実行ノードとターゲットノードとの疎通の話しか出てこなかったのでちょっと手こずりました。

参考

devops.stackexchange.com