別記事でも書きましたが、現状では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日