てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] ACIモジュールでリクエストしたURLを知るには output_level: debug を指定する

■ はじめに

Ansible には多数のACIモジュールがあり、内部で APICREST API を叩く仕様です。

通常時はあまり意識する必要がないかも知れませんが、デバッグ時など細かい情報を知りたい場合「このタスクでどのような REST API の URL をリクエストしたのか」を知りたいことがあります。

リクエストした URL は以下の方法で確認できます。

  • モジュールのオプションに output_level: debug を指定する
  • タスクの実行結果(戻り値)register 変数に格納する
  • register 変数内の urlfilter を確認する

なお、タスクの実行に失敗(failure)したときは、output_level: debug の指定は不要です。

この記事では、正常時にもリクエストした URL を家訓する方法法を、簡単な例をもとに説明します。


■ サンプル Playbook

ここでは、 aci_bd モジュールを利用して、指定した Bridge Domain を query するタスクで試します。

---
- name: query
  hosts: apic
  gather_facts: False

  tasks:
    - name: query db
      aci_bd:
        host: "{{ ansible_host }}"
        username: "{{ username }}"
        password: "{{ password }}"
        validate_certs: False
        tenant: t_test9999
        bd: bd_test9999
        state: query
        output_level: debug   # point!
      register: result

    - name: debug
      debug:
        var: result


■ 実行結果

$ ansible-playbook -i inventory.ini aci_test.yml 

PLAY [query] **************************************************************************************************************

TASK [query db] ***********************************************************************************************************

ok: [apic01]

 ...(略)...

TASK [debug] **************************************************************************************************************
ok: [apic01] => {
    "result": {
        "ansible_facts": {
            "discovered_interpreter_python": "/usr/bin/python"
        },
        "changed": false,
        "current": [
          {
                "fvBD": {
                    "attributes": {
                        "OptimizeWanBandwidth": "no",
                        "annotation": "",
                        "arpFlood": "yes",
                        "bcastP": "225.1.31.64",
                        "childAction": "",
                        "configIssues": "",
                        "descr": "",
                        "dn": "uni/tn-t_test9999/BD-bd_test9999",
 ...(略)...
        ],
        "failed": false,
        "filter_string": "?rsp-subtree-class=fvRsBdToEpRet,fvRsCtx,fvRsIgmpsn,fvRsBDToNdP&rsp-subtree=full",
        "method": "GET",
        "proposed": {},
        "response": "OK (2639 bytes)",
        "sent": {},
        "status": 200,
        "url": "https://apic01.example.com/api/mo/uni/tn-t_test9999/BD-bd_test9999.json",
 ...(略)...

上記結果の urlfilter_string の値から、今回リクエストした URL は以下であることが分かります。

たとえば、このタスクの挙動を再現する場合は、上記URLをGET(state: query なので)して確認します。別途、認証済み cookie が必要です。

(ちなみに、ACI の各モジュールのドキュメントの Return Values には、 filter_string failure or debug とありますが、debug のことを 当初 ansible-plyabook コマンドの -v オプションのことかと勘違いしておりました・・)


■ まとめ

ACI モジュールでリクエストしたURLを知るには、output_level: debug を指定して、タスク実行結果内の urlfilter を参照する、ということをご紹介しました。