はじめに
2021/01/30 に、YouTube Live で「つまずき Ansible 【Part28】ping 系モジュールを試す」という配信をしました。
実際に作業しながら(ときには)エラーと戦って進めるシリーズです。
今回は、ping や ios_ping や win_ping などの ping 系モジュールの違いを確認しながら、試しました。
- 環境
- Ansible 2.10.6
参考: 【Ansible】ping 系モジュールまとめ(ping/win_ping/ios_ping/nxos_ping/net_ping) - てくなべ (tekunabe)
動画
- 0:00 イントロダクション
- 1:37 ping モジュール
- 10:03 win_ping モジュール
- 14:41 ios_ping モジュール
- 21:47 net_ping モジュール
- 22:55 command で ping コマンド
- 28:11 おわりに
■ やったこと
ping
モジュール
ping
モジュールは、ターゲットノードへのAnsible的な接続や認証の正常性を確認する。
ICMP ではなく、通常は SSH を利用する。
[A] --- SSH ---> [linux]
- 実行ログ
$ ansible -i inventory.ini linux -m ping linux01 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
- Playbook の場合
--- - hosts: linux gather_facts: false tasks: - ping:
win_ping
モジュール
win_ping
モジュールは、Windows ターゲットのターゲットノードへのAnsible的な接続や認証の正常性を確認する。
通常は、WinRM を利用する。
[A] -- WinRM --> [Windows]
- 実行ログ
$ ansible -i inventory.ini win -m win_ping win01 | SUCCESS => { "changed": false, "ping": "pong" }
おまけ: うっかり Windows 相手に ping
モジュールを使った場合のエラー
$ ansible -i inventory.ini win -m ping [WARNING]: No python interpreters found for host win01 (tried ['/usr/bin/python', 'python3.7', 'python3.6', 'python3.5', 'python2.7', 'python2.6', '/usr/libexec/platform-python', '/usr/bin/python3', 'python']) win01 | FAILED! => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "module_stderr": "Exception calling \"Create\" with \"1\" argument(s): \"At line:4 char:21\r\n+ def _ansiballz_main():\r\n+ ~\r\nAn expression was expected after '('.\r\nAt line:13 char:27\r\n+ except (AttributeError, OSError):\r\n+ ~\r\nMissing argument in parameter list.\r\nAt line:15 char:29\r\n+ excludes = set(('', '.', scriptdir))\r\n+ ~\r\nMissing expression after ','.\r\nAt line:15 char:30\r\n+ excludes = set(('', '.', scriptdir))\r\n+ ~~~~~~~~~\r\nUnexpected token 'scriptdir' in expression or statement.\r\nAt line:15 char:29\r\n+ excludes = set(('', '.', scriptdir))\r\n+ ~\r\nMissing closing ')' in expression.\r\nAt line:15 char:39\r\n+ excludes = set(('', '.', scriptdir))\r\n+ ~\r\nUnexpected token ')' in expression or statement.\r\nAt line:15 char:40\r\n+ excludes =
ios_ping
モジュール
ios_ping
モジュールは、Cisco IOS 機器から指定した宛先への疎通確認をする。
ターゲットノード「へ」ではなく「から」。
[A] ------------ [ios]--- ICMP ---> [dest先]
- 実行ログ
$ ansible -i inventory.ini ios -m ios_ping -a "dest=192.168.1.1" ios01 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "commands": [ "ping 192.168.1.1" ], "packet_loss": "0%", "packets_rx": 5, "packets_tx": 5, "rtt": { "avg": 1, "max": 2, "min": 1 } }
- Playbook の場合
--- # ios - hosts: ios gather_facts: no tasks: # ansible -i inventory.ini ios -m ios_ping -a "dest=192.168.1.1" - name: ping for ios ios_ping: dest: 192.168.1.1
net_ping モジュール
ios_ping
モジュールは、ios_ping
や junos_ping
モジュールなどを抽象化したもの。
- Playbook
--- # ios - hosts: ios gather_facts: no tasks: - name: ping for ios net_ping: dest: 192.168.1.1
番外編1: ネットワーク機器に ping
モジュールを使ったら?
配信後にご質問をいただきました。
手元にNW機器がなくて試せないのですが、pingモジュールをNW機器に対して実行するとどうなるんでしたっけ。
— xotaki (@xotaki) 2021年1月30日
かなりうろ覚えですが、必ず SUCCESS になるとおっしゃっていたような、、#tekunabe
はい、SUCCESS
になってしまいます。(たしか Ansible 2.9 頃からの仕様)
- 認証情報が誤っていても
SUCCESS
$ ansible -i inventory.ini ios -m ping -e ansible_user=tekitoutekiyou ios01 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
- 接続先が誤っていても
SUCCESS
$ ansible -i inventory.ini ios -m ping -e ansible_host=tekitoudesuuuuuuu ios01 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" }
番外編2:ICMP による ping
[A] ---- ICMP ---> [dest先]
command
モジュール使うくらいしか思い浮かばす・・。
$ ansible -i inventory.ini linux -m command -a "ping {{ ansible_host }} -c 4" -c local linux01 | CHANGED | rc=0 >> PING 192.168.1.145 (192.168.1.145) 56(84) bytes of data. 64 bytes from 192.168.1.145: icmp_seq=1 ttl=64 time=0.176 ms 64 bytes from 192.168.1.145: icmp_seq=2 ttl=64 time=0.212 ms 64 bytes from 192.168.1.145: icmp_seq=3 ttl=64 time=0.198 ms 64 bytes from 192.168.1.145: icmp_seq=4 ttl=64 time=0.264 ms --- 192.168.1.145 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 2999ms rtt min/avg/max/mdev = 0.176/0.212/0.264/0.035 ms
回数を指定する -c
を忘れると無限 ping になって、応答が返ってこない。
ありがとうございます!
ping、デフォルトだと回数無限だから処理が戻らないのかも#tekunabe
— z a k i (@zaki_hmkc) 2021年1月30日
参考: [Ansible] コントロールノードから ICMP ping を実行する(ただしcommandモジュール) - てくなべ (tekunabe)
おわりに
名前がよく似てても性質が結構違ったりするので、少し注意が必要でした。 公式ドキュメントに必要な情報は掲載されているので、やっぱりよく確認すべきですね。
Part29 にむけて
以下のネタを検討中です。気が向いたものをやります。 connpass申込時のアンケートでいただいたものも含めています。