別記事でも書きましたが、現状ではfortios用のモジュールに、GETのモジュールは無いように思えます。
なので、パケットキャプチャで取得したHTTPの情報から、uriモジュールを利用してGETリクエストが発行できるPlaybookを書いてみました。
Ansible関連の実践記事一覧はこちら。
目的
fortios系モジュールには無いと思われる、現在の情報取得をPlaybookで実現するため
環境
やってみたいと思ったこと
現在の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側に統一していくべきですね…