これは、Ansible Advent Calendar 2020 (Adventar版) の 21日目の記事です。
はじめに
Ansible には、ping
モジュールという接続確認モジュールがあります。
コントロールノードからターゲットノードへの SSH 接続 + Python 実行までを確認します(ICMPではありません)。
参考: 【Ansible】ping 系モジュールまとめ(ping/win_ping/ios_ping/nxos_ping/net_ping) - てくなべ (tekunabe)
一方で、コントロールノードからターゲットノードへ ICMP による ping を実行するモジュールはないようです。
やり方を考えてみたのですが、コントロールノード上で command
モジュールで ping コマンドを実行する方法鹿思いつきませんでした。
その方法をご紹介します。
[Ansible コントロールノード] ----- ICMP ping -----> [ターゲットノード]
- 環境
- ansible 2.9.14
インベントリ
[sv] 192.168.1.1 192.168.1.2
Playbook
--- - hosts: sv gather_facts: false connection: local tasks: - name: execute ping command: "ping {{ inventory_hostname }} -c 4" register: res_ping - name: debug ping result debug: msg: "{{ res_ping.stdout_lines[] }}"
connection: local
なり、delegate_to: localhost
なりの指定がないと、ターゲットノードからの ping コマンド実行になってしまいます(本記事の目的であるコントロールノードからではなく)。
異常系や結果の見やすさを考えると改良の余地がありそうですが、基本はこのような感じです。今回は ping を 4回実行することにします(-c 4
)。
実行
Playbook を実行します。結果が2個目のタスクで表示されます。
$ ansible-playbook -i inventory.ini ping.yml PLAY [sv] ********************************************************************************************************** TASK [ping] ******************************************************************************************************** changed: [192.168.1.2] changed: [192.168.1.1] TASK [debug ping result] ******************************************************************************************* ok: [192.168.1.1] => { "msg": [ "PING 192.168.1.1 (192.168.1.1): 56 data bytes", "64 bytes from 192.168.1.1: icmp_seq=0 ttl=64 time=1.161 ms", "64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.312 ms", "64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=1.549 ms", "64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.966 ms", "", "--- 192.168.1.1 ping statistics ---", "4 packets transmitted, 4 packets received, 0.0% packet loss", "round-trip min/avg/max/stddev = 0.966/1.247/1.549/0.213 ms" ] } ok: [192.168.1.2] => { "msg": [ "PING 192.168.1.2 (192.168.1.2): 56 data bytes", "64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=1.007 ms", "64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=1.146 ms", "64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=1.305 ms", "64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=2.198 ms", "", "--- 192.168.1.2 ping statistics ---", "4 packets transmitted, 4 packets received, 0.0% packet loss", "round-trip min/avg/max/stddev = 1.007/1.414/2.198/0.465 ms" ] } PLAY RECAP ********************************************************************************************************* 192.168.1.1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0 192.168.1.2 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
ad-hoc コマンドの場合
Playbook を作成せずに、ad-hoc に ansible
コマンドで済ませる場合は以下のようにします。
$ ansible -i inventory.ini sv -m command -a "ping {{ inventory_hostname }} -c 4" -c local 192.168.1.2 | CHANGED | rc=0 >> PING 192.168.1.2 (192.168.1.2): 56 data bytes 64 bytes from 192.168.1.2: icmp_seq=0 ttl=64 time=1.211 ms 64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=2.546 ms 64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=3.181 ms 64 bytes from 192.168.1.2: icmp_seq=3 ttl=64 time=1.948 ms --- 192.168.1.2 ping statistics --- 4 packets transmitted, 4 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 1.211/2.221/3.181/0.728 ms 192.168.1.1 | CHANGED | rc=0 >> PING 192.168.1.1 (192.168.1.1): 56 data bytes 64 bytes from 192.168.1.1: icmp_seq=0 ttl=64 time=1.235 ms 64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=2.254 ms 64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=1.933 ms 64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=2.341 ms --- 192.168.1.1 ping statistics --- 4 packets transmitted, 4 packets received, 0.0% packet loss round-trip min/avg/max/stddev = 1.235/1.941/2.341/0.435 ms
おわりに
もし コントロールノードからターゲットノードへ ICMP による ping を実行するモジュールがあれば、あったらぜひ教えていただきたいです。