これは、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 を実行するモジュールがあれば、あったらぜひ教えていただきたいです。