技術を楽しもう!

IT(ネットワーク)業界を中心に、仕事や趣味等、色々な技術を記録します。

AnsibleでTracerouteの経路を確認する

f:id:takashi-tobey:20201020175024p:plain

それぞれのネットワーク機器からTracerouteで経路を確認することも多いですが、 最終的には端末から確認した方が顧客目線の動作確認だと言えます。

ネットワーク障害試験を行う際は何度も実施しますが、 宛先と想定結果が決まっていて何度も行う場合は、自動化するのも手です。

所定のクライアントからTracerouteを確認するAnsibleモジュールが見つけられなかったため、 playbookを作成したので共有します。

Tracerouteの経路確認は以下の要素で成り立っています。

  • 確認用端末(今回はCentOSで実施しました。)
  • 宛先アドレス
  • 経由アドレス
  • 想定結果

これらの値を先に書いておいて、 操作や確認はAnsibleにやらせてしまおう
という考えです。

■traceroute.yml
大抵の場合、最初のいくつかホップを確認できれば、 試験範囲としては充分だと思いますので、result.stdout_linesは3行までとしています。 繰り返す要素を確認するには「assert」「that」を使います。
また、今回は片方向ですが、場合によっては送信元端末を変えて双方向で確認した方が良いです。 環境に合わせてアレンジしてみてください。

---
- hosts: PC
  gather_facts: no
  vars_files:
    - auth.yml
    - variable.yml

  tasks:
    - name: Traceroute
      shell: "traceroute {{ dest_ip }} -q 1 -n"
      changed_when: False
      register: result

    - name: Check Result
      ignore_errors: True

      assert:
        that:
          - "'{{ trace_1 }}' in '{{ result.stdout_lines[1] }}'"
          - "'{{ trace_2 }}' in '{{ result.stdout_lines[2] }}'"
          - "'{{ trace_3 }}' in '{{ result.stdout_lines[3] }}'"

    - debug:
        msg: "{{ result.stdout_lines }}"

■auth.yml
認証情報を定義したファイルです。

ansible_user: admin
ansible_ssh_pass: password

■variable.yml
宛先のIPアドレスと、経由するIPアドレスを書いたファイルです。 実際は障害ポイントなどに応じた想定結果を書いておく感じになります。

たくさん書くの大変だなぁ、と思うかもしれませんが、 Excel等の試験項目の確認内容として書くのか、ymlファイルに書くのかといった違いだけです。

dest_ip: 8.8.8.8
trace_1: 192.168.1.253
trace_2: 172.16.1.254
trace_3: 10.0.0.1

■実行結果

# ansible-playbook traceroute.yml

PLAY [PC] ********************************************************************************************************************************************************************

TASK [Traceroute] *****************************************************************************************************************************************************************
ok: [PC1]

TASK [Check Result] ***************************************************************************************************************************************************************
ok: [PC1] => {
    "changed": false,
    "msg": "All assertions passed"
}

TASK [debug] **********************************************************************************************************************************************************************
ok: [PC1] => {
    "msg": [
        "traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 60 byte packets",
        " 1  192.168.1.253  0.106 ms",
        " 2  172.16.1.254  0.607 ms",
        " 3  10.0.0.1  0.295 ms",
        " 4  *",
        " 5  *",
(--snip--)

PLAY RECAP ************************************************************************************************************************************************************************
PC                    : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0