てんこ

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

AnsibleでFortigateの情報取得モジュール(fortios_facts)を試してみた。

AnsibleでのFortigate操作について、fortios_factsモジュールの出力について書いておきます。

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


目的

唯一の情報取得用のモジュールであるfortios_factsが出力できる内容を確認するため

環境

  • ansible: 2.9.0
  • Fortios: 6.0.6
  • ansibleのコネクションプラグイン: local(fortiosapiライブラリ利用)

サンプルPlaybook

別のエントリにも書いてありますが、以下のように記載します。

---
- hosts: localhost 
  gather_facts: false
  vars:
    host: "10.254.254.254"
    username: "admin"
    password: "password"
    vdom: "root"
    ssl_verify: "no"

  tasks:
  - name: Get Facts.
    fortios_facts:
      host: "{{ host }}"
      username: "{{ username }}"
      password: "{{ password }}"
      vdom: "{{ vdom }}"
      ssl_verify: "{{ ssl_verify }}"
      https: "yes"
      gather_subset:
        - fact: 'system_status_select' #ここに欲しい要素の情報を書く
    register: getfact_result

  - name: Debug
    debug: 
      var: getfact_result

fortios_factsで利用可能な要素

利用可能な要素とその概要は以下の通りです。

要素名 概要
system_current-admins_select 管理者ユーザがログインしたイベントのログ
system_firmware_select 利用可能なファームウェアの表示【未確認】
system_fortimanager_status fortimanagerとの接続ステータス【未確認】
system_ha-checksums_select HAのConfigチェックサム状態の表示【未確認】
system_interface_select インターフェースの状態やカウンタの表示
system_status_select 用途不明… 【未確認】
system_time_select FW本体の時刻情報の取得

なにかしら変な値を入れたりすると、以下のようなエラーメッセージが表示され、利用できるのが以下の要素だというのがわかります。(公式のモジュール群説明にも、ソースにも書いてあります)

TASK [Get Facts.] ***********************************************************************************************************
fatal: [localhost]: FAILED! => {"changed": false, "msg": "Subset must be one of [system_current-admins_select, system_firmware_select, system_fortimanager_status, system_ha-checksums_select, system_interface_select, system_status_select, system_time_select], got system_ha_select"}

system_current-admins_select

以下のように、unixtimeでイベントの発生タイミングとログインユーザ、現在のログイン状態などが表示されます。

実際のログはクリックして展開

ok: [localhost] => {
    "getfact_result": {
        "ansible_facts": {
            "ansible_net_gather_network_resources": [], 
            "ansible_net_gather_subset": [], 
            "ansible_network_resources": {
                "system_current-admins_select": {
                    "action": "select", 
                    "build": 272, 
                    "http_method": "GET", 
                    "name": "current-admins", 
                    "path": "system", 
                    "results": [
                        {
                            "admin": "admin", 
                            "disconnect_enabled": true, 
                            "id": 31, 
                            "is_current": false, 
                            "method": "https", 
                            "profile": "super_admin", 
                            "srcaddr": "10.254.254.1", 
                            "time": 1572681512
                        }, 
                        {
                            "admin": "admin", 
                            "disconnect_enabled": true, 
                            "id": 43, 
                            "is_current": false, 
                            "method": "http", 
                            "profile": "super_admin", 
                            "srcaddr": "10.254.254.1", 
                            "time": 1572682842
                        }, 
(略)
                    ], 
                    "serial": "FGTxxxxxxxxxxxxxxx", 
                    "status": "success", 
                    "vdom": "root", 
                    "version": "v6.0.6"
                }
            }
        }, 
        "changed": false, 
        "failed": false
    }
}

system_firmware_select

インターネットから切り離して検証しているのですが、おそらくavailableというところに、オンラインでアップデート可能なファームの情報が出てくるのだと思います。

【12/22追記】別記事で実際にオンラインにしてファーム情報を取得してきましたので、そちらもご参照ください!

実際のログはクリックして展開

(冒頭は省略)
"system_firmware_select": {
    "action": "select", 
    "build": 272, 
    "http_method": "GET", 
    "name": "firmware", 
    "path": "system", 
    "results": {
        "available": [], 
        "current": {
            "branch-point": 272, 
            "build": 272, 
            "id": "current", 
            "major": 6, 
            "minor": 0, 
            "name": "FortiOS", 
            "notes": "http://docs.fortinet.com/d/fortios-6.0.6-release-notes/download", 
            "patch": 6, 
            "platform-id": "FGT60D", 
            "release-type": "GA", 
            "source": "current", 
            "version": "v6.0.6"
        }
    }, 
    "serial": "FGxxxxxxxxxxxxxxxx", 
    "status": "success", 
    "vdom": "root", 
    "version": "v6.0.6"
}

system_fortimanager_status

fortimanager使ってないのでどんな情報が出るのが正しいのかわかりません…

実際のログはクリックして展開

"system_fortimanager_status": {
    "action": "status", 
    "build": 272, 
    "http_method": "GET", 
    "name": "fortimanager", 
    "path": "system", 
    "results": {},  # ここに何か出てくるはず…
    "serial": "FGxxxxxxxxxxxxx", 
    "status": "success", 
    "vdom": "root", 
    "version": "v6.0.6"
}, 

system_ha-checksums_select

おそらく、HAを組んでいればHAを組んだ対抗同士の設定情報のリビジョン番号などが出るのかなと思いますが、1台しかないので確認できず…

【12/22追記】取得してみました。各パーティション毎の、自分自身と対抗側のチェックサムを表示してくれるようですね。

実際のログはクリックして展開

"system_ha-checksums_select": {
    "action": "select",
    "build": 303,
    "http_method": "GET",
    "name": "ha-checksums",
    "path": "system",
    "results": [
        {
            "checksum": {
                "all": "8d840039e887d0ae71395107a396adb7",
                "global": "2bdb9a96e1e3afe9870b15d4339c20b7",
                "root": "a0f21470df97822589f0a2801dd9c915"
            },
            "is_manage_master": 1,
            "is_root_master": 1,
            "serial_no": "FGT60*******"
        },
        {
            "checksum": {
                "all": "8d840039e887d0ae71395107a396adb7",
                "global": "2bdb9a96e1e3afe9870b15d4339c20b7",
                "root": "a0f21470df97822589f0a2801dd9c915"
            },
            "is_manage_master": 0,
            "is_root_master": 0,
            "serial_no": "FGT60*******"
        }
    ],
    "revision": "149586697367309",
    "serial": "FGT60D******", #アクセスした側のホストのSerial
    "status": "success",
    "vdom": "root",
    "version": "v6.0.8"
}

system_interface_select

インターフェースのカウンタなどが表示されます。

…あれ?今気が付きましたが、スイッチモードになってるinternalのは表示されてませんね。インターフェース分離すれば個別のインターフェースになって表示されるんでしょうか…

実際のログはクリックして展開

"system_interface_select": {
    "action": "select", 
    "build": 272, 
    "http_method": "GET", 
    "name": "interface", 
    "path": "system", 
    "results": {
        "dmz": {
            "alias": "", 
            "duplex": 1, 
            "id": "dmz", 
            "ip": "10.10.10.1", 
            "link": true, 
            "mac": "00:00:00:00:00:00", 
            "mask": 24, 
            "name": "dmz", 
            "rx_bytes": 3112840, 
            "rx_errors": 0, 
            "rx_packets": 5276, 
            "speed": 1000.0, 
            "tx_bytes": 240, 
            "tx_errors": 0, 
            "tx_packets": 4
        }, 
        "modem": {
(略)
        }, 
        "wan1": {
(略)
        }, 
        "wan2": {
(略)
        }
    }, 
    "revision": "1572684445.19228", 
    "serial": "FGTxxxxxxxxxxxxxxxxxxx", 
    "status": "success", 
    "vdom": "root", 
    "version": "v6.0.6"
}, 

system_status_select

何が出るんだろう…

【12/22追記】HA組んでも表示されるものは変わりませんでした。うーん?

実際のログはクリックして展開

"system_status_select": {
    "action": "select", 
    "build": 272, 
    "http_method": "GET", 
    "name": "status", 
    "path": "system", 
    "results": {},  #ここになにかでるはず…
    "serial": "FGxxxxx", 
    "status": "success", 
    "vdom": "root", 
    "version": "v6.0.6"
}, 

system_time_select

本体の時刻の情報がUnixtime形式で取得できるようです。

実際のログはクリックして展開

"system_time_select": {
    "action": "select", 
    "build": 272, 
    "http_method": "GET", 
    "name": "time", 
    "path": "system", 
    "results": {
        "time": 1572684445
    }, 
    "serial": "FGTxxxxxx", 
    "status": "success", 
    "vdom": "root", 
    "version": "v6.0.6"
}

他の使いかた

複数要素を同時に出力させ、フィルターをかけることで該当する要素(ポート指定だけとか)もできるようです。

2019/11/6時点では未確認です。

感想

これだけしか取れないか‥‥という感想です(T_T)

現在の設定情報(アドレスオブジェクトやユーザオブジェクト、ポリシーなど)が取れないかと期待もしたのですが…

「現状の設定を確認」→「想定通りでなければ設定」のような処理を実装しようと思うと、fortiosモジュール単体では実現できず、自分で処理をくみ上げる必要がある、ということだと理解しました。

むう、実用化への道のりは長い…か…?