てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] コントロールノードから ICMP ping を実行する(ただしcommandモジュール)

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