別記事でも書きましたが、現状ではfortios用のモジュールに、GETのモジュールは無いように思えます。

なので、パケットキャプチャで取得したHTTPの情報から、uriモジュールを利用してGETリクエストが発行できるPlaybookを書いてみました。

Ansible関連の実践記事一覧はこちら。


目的

fortios系モジュールには無いと思われる、現在の情報取得をPlaybookで実現するため

環境

  • OS: CentOS Linux release 7.7.1908 (Core)
  • Ansible : 2.9.0
  • Python: 2.7.6 / 3.6.8
  • Fortios: 6.0.6

やってみたいと思ったこと

現在のPolicyの情報を、json形式で取得したい

作成したPlaybook

ユーザ名やらパスワードやらは、inventoryだったりgroup_varsだったりに書いています。

---
- hosts: fortigate
  gather_facts: false
  connection: local # httpapiでも利用可能でした。
  vars:
    host : "{{ ansible_host }}"
  tasks:
  - name: Login
    uri:
      url: https://{{ host }}/logincheck
      validate_certs: no
      method : "POST"
      force_basic_auth: yes
      body_format: "form-urlencoded"
      url_username: "{{ ansible_user }}"
      url_password: "{{ ansible_password }}"
      body:
        - [ username, "{{ ansible_user }}" ]
        - [ secretkey, "{{ ansible_password }}" ]
        - [ ajax, "1" ]
    register: http_response
  - name: debug
    debug:
      var: http_response
  - name: GET Policy
    uri:
      url: https://{{ host }}/api/v2/cmdb/firewall/policy
      validate_certs: no
      method: "GET"
      headers:
        Cookie: "{{ http_response.set_cookie }}"
      return_content: yes
    register: get_policy
  - name: debug2
    debug:
      var: get_policy.json

結果(debug2の部分)

  fw01 ok: {
    "changed": false,
    "get_policy.json": {
        "build": 272,
        "http_method": "GET",
        "http_status": 200,
        "name": "policy",
        "path": "firewall",
        "results": [
            {
                "action": "accept",
                (略)
                "dstaddr": [
                    {
                        "name": "all",
                        "q_origin_key": "all"
                    }
                ],
                "dstaddr-negate": "disable",
                "dstintf": [
                    {
                        "name": "wan1",
                        "q_origin_key": "wan1"
                    }
                ],
                (略)
                "ippool": "disable",
                "ips-sensor": "",
                "label": "",
                "learning-mode": "disable",
                "logtraffic": "disable",
                "logtraffic-start": "disable",
                "match-vip": "disable",
                "name": "",
                "nat": "disable",
                (略)
                "policyid": 1,
                "poolname": [],
                "profile-group": "",
                "profile-protocol-options": "default",
                "profile-type": "single",
                "q_origin_key": 1,
                "radius-mac-auth-bypass": "disable",
                "redirect-url": "",
                "replacemsg-override-group": "",
                "rsso": "disable",
                "rtp-addr": [],
                "rtp-nat": "disable",
                "scan-botnet-connections": "disable",
                "schedule": "always",
                "schedule-timeout": "disable",
                "send-deny-packet": "disable",
                "service": [
                    {
                        "name": "SSH",
                        "q_origin_key": "SSH"
                    }
                ],
                "service-negate": "disable",
                "session-ttl": 0,
                "spamfilter-profile": "",
                "srcaddr": [
                    {
                        "name": "all",
                        "q_origin_key": "all"
                    }
                ],
                "srcaddr-negate": "disable",
                "srcintf": [
                    {
                        "name": "internal",
                        "q_origin_key": "internal"
                    }
                ],
                (略)
                "status": "enable",
                (略)
            },
            {
                (略)
                "policyid": 2,
            (略)            }
        ],
        "revision": "80.0.0.661485498.1572955273",
        "serial": "FGT6xxxxxxxxxxxx",
        "status": "success",
        "vdom": "root",
        "version": "v6.0.6"
    }
}

書き忘れ

VDOM指定を書き忘れました…これでも取れるんですが、VDOM指定したい場合どうすればいいか、調べてまた修正します。

どうやら、2個目のurlの末尾に、?vdom=<vdom_name>とつけると対象のVDOM指定ができるようです。

感想

思いのほか、手軽に現在のポリシー情報のGETが実現できました。

やってることとしては、キャプチャを取った結果に従って、単純に実装するだけなのでそれほど難しいことはやっていないかと思いますが、これでAPIのエンドポイントさえわかれば、簡単に情報が取得できそうです。

ここでは結局、コネクションプラグインはlocalを使っているので、httpapiよりもfortiosapiのほうが一式で考えると相性がいいのかな…?

と、httpapi使えない頃の自分は考えていましたが、httpapiでも問題なく利用可能でした。

そう考えると、やはりhttpapi側に統一していくべきですね…


https://tenko.hatenablog.jp/entry/2019/11/10/172119

バックアップ日時: 2026年11月11日