てんこ

ブログ名は愛猫(てん)の愛称です。中身は個人のIT系学習記録です。

AnsibleでFortigateのポリシー情報をGETしてみた

別記事でも書きましたが、現状では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側に統一していくべきですね…