てくなべ (tekunabe)

ansible / network / automation / 学習の記録

[Ansible] 「つまずき Ansible 【Part28】ping 系モジュールを試す」ふりかえり

はじめに

2021/01/30 に、YouTube Live で「つまずき Ansible 【Part28】ping 系モジュールを試す」という配信をしました。

実際に作業しながら(ときには)エラーと戦って進めるシリーズです。

今回は、pingios_ping や win_ping などの ping 系モジュールの違いを確認しながら、試しました。

tekunabe.connpass.com

  • 環境
    • Ansible 2.10.6

参考: 【Ansible】ping 系モジュールまとめ(ping/win_ping/ios_ping/nxos_ping/net_ping) - てくなべ (tekunabe)


動画

youtu.be

■ やったこと

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_pingjunos_ping モジュールなどを抽象化したもの。

  • Playbook
---
# ios
- hosts: ios
  gather_facts: no

  tasks:
    - name: ping for ios
      net_ping:
        dest: 192.168.1.1

番外編1: ネットワーク機器に ping モジュールを使ったら?

配信後にご質問をいただきました。

はい、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 になって、応答が返ってこない。

ありがとうございます!

参考: [Ansible] コントロールノードから ICMP ping を実行する(ただしcommandモジュール) - てくなべ (tekunabe)


おわりに

名前がよく似てても性質が結構違ったりするので、少し注意が必要でした。 公式ドキュメントに必要な情報は掲載されているので、やっぱりよく確認すべきですね。


Part29 にむけて

以下のネタを検討中です。気が向いたものをやります。 connpass申込時のアンケートでいただいたものも含めています。

  • Ansible 2.10 関連
  • connection: local ななにか
  • Jinja2、フィルター
  • Windows
  • ESXi で VM作成
  • モジュールのテスト
  • AWXとの共存を念頭に入れたDirectory構成