はじめに
- 当記事は、日常の運用業務(NW機器設定)の自動化により、運用コストの削減 および 運用品質の向上 を目標に
「Ansible」を使用し、様々なNW機器設定を自動化してみようと 試みた記事です。 - Ansibleは、OSS版(AWX)+OSS版(Ansible)を使用しております。
Fortigateの「Objects-サービス」の登録/変更/削除を実施してみた
事前設定
- Templateを作成し、インベントリーと認証情報を設定する。
- インベントリー:対象機器(ホスト)の接続先/接続方法/使用プラグインを設定する
--- ansible_host: xxx.xxx.xxx.xxx ← 接続先IPを指定 ansible_connection: httpapi ← FortiGateは、デフォルト接続方式(ssh)ではなく、HTTP/HTTPS(API)を使用 ansible_httpapi_use_ssl: yes ← HTTP/HTTPS(API)を使用する際、HTTPSを使用 ansible_httpapi_validate_certs: no ← HTTP/HTTPS(API)を使用する際、証明書のチェックを無視(証明書が信頼できないエラーを回避) ansible_network_os: fortinet.fortios.fortios ← 接続方式(httpapi)を使用する場合、使用するプラグインを指定
- 認証情報:対象機器へのログイン情報(ユーザ名/パスワード)を設定。
ユーザ名は 変数:ansible_user に保持される パスワードは 変数:ansible_password に保持される
Playbook作成(YAML)
使用モジュール
- fortinet.fortios.fortios_firewall_service_custom を使用。
※参考ページ:https://docs.ansible.com/projects/ansible/latest/collections/fortinet/fortios/fortios_firewall_service_custom_module.html
Objects-サービスの登録
- 接続情報とサービス情報を指定して登録(state: ‘present’)を行う。
- name: Add Service fortios_firewall_service_custom: vdom: "root" state: "present" firewall_service_custom: name: "test_ser001" protocol: "TCP/UDP/UDP-Lite/SCTP" tcp_portrange: "100-110" ← Destination Port(TCP)を範囲指定で登録 udp_portrange: "200-210" ← Destination Port(UDP)を範囲指定で登録 sctp_portrange: "300-310" ← Destination Port(SCTP)を範囲指定で登録 comment: "ADD" category: "General" register: wk_result - 実行結果:対象のサービスが登録された。 ※登録後のサービス情報を抜粋
"msg": { "meta": { "results": [ { "name": "test_ser001", "protocol": "TCP/UDP/UDP-Lite/SCTP", "tcp-portrange": "100-110", ← 範囲指定で登録される "udp-portrange": "200-210", ← 範囲指定で登録される "sctp-portrange": "300-310", ← 範囲指定で登録される "comment": "ADD", "category": "General" } ], "status": "success", "vdom": "root" } }
Objects-サービスの登録 ※登録のつづき
- 接続情報とサービス情報を指定して登録(state: ‘present’)を行う。
- name: Add Service fortios_firewall_service_custom: vdom: "root" state: "present" firewall_service_custom: name: "test_ser002" protocol: "TCP/UDP/UDP-Lite/SCTP" tcp_portrange: "100-100" ← Destination Port(TCP)を単一ポート指定で登録 udp_portrange: "200-200" ← Destination Port(UDP)を単一ポート指定で登録 sctp_portrange: "300-300" ← Destination Port(SCTP)を単一ポート指定で登録 comment: "ADD" category: "General" register: wk_result - 実行結果:対象のサービスが登録された。 ※登録後のサービス情報を抜粋
"msg": { "meta": { "results": [ { "name": "test_ser002", "protocol": "TCP/UDP/UDP-Lite/SCTP", "tcp-portrange": "100", ← 単一ポートで登録される "udp-portrange": "200", ← 単一ポートで登録される "sctp-portrange": "300", ← 単一ポートで登録される "comment": "ADD", "category": "General" } ], "status": "success", "vdom": "root" } }
Objects-サービスの変更 ※登録のつづき
- 接続情報とサービス情報を指定して 登録されたサービスの変更を行う。 ※state: ‘present’にて上書きとなる
- name: Add Service fortios_firewall_service_custom: vdom: "root" state: "present" firewall_service_custom: name: "test_ser001" protocol: "TCP/UDP/UDP-Lite/SCTP" tcp_portrange: "100-111 150-160" ← Destination Port(TCP)の既存ポートの変更+範囲指定の追加 udp_portrange: "200-211" ← Destination Port(UDP)の既存ポートの変更 sctp_portrange: "300-311" ← Destination Port(SCTP)の既存ポートの変更 comment: "CHANGE" category: "General" register: wk_result - 実行結果:対象のサービスが変更された。 ※変更後のサービス情報を抜粋
"msg": { "meta": { "results": [ { "name": "test_ser002", "protocol": "TCP/UDP/UDP-Lite/SCTP", "tcp-portrange": "100-111 150-160", ← 対象範囲が更新される "udp-portrange": "200-211", ← 対象範囲が更新される "sctp-portrange": "300-311", ← 対象範囲が更新される "comment": "CHANGE", "category": "General" } ], "status": "success", "vdom": "root" } }
- 接続情報とサービス情報を指定して 登録されたサービスの変更を行う。 ※state: ‘present’にて上書きとなる
- name: Add Service fortios_firewall_service_custom: vdom: "root" state: "present" firewall_service_custom: name: "test_ser001" protocol: "TCP/UDP/UDP-Lite/SCTP" tcp_portrange: "100-111 150-160" ← Destination Port(TCP)の既存ポートの変更+範囲指定の追加 udp_portrange: "" ← Destination Port(UDP)の既存ポートの削除 sctp_portrange: "300-311" ← Destination Port(SCTP)の既存ポートの変更 comment: "CHANGE" category: "General" register: wk_result - 実行結果:対象のサービスが一部変更されない!! ※変更後のサービス情報を抜粋
"msg": { "meta": { "results": [ { "name": "test_ser002", "protocol": "TCP/UDP/UDP-Lite/SCTP", "tcp-portrange": "100-111 150-160", ← 対象範囲が更新される "udp-portrange": "200-210", ← 対象範囲が更新(削除)されない!! 既存設定のまま。。。 "sctp-portrange": "300-311", ← 対象範囲が更新される "comment": "CHANGE", "category": "General" } ], "status": "success", "vdom": "root" } }
- 現状のモジュールでは、一度指定したDestination Portのプロトコル指定を削除することができないことが分かりました。。。
その為、一度サービス自体を削除してから サービスを再登録するようにしましょう!
Objects-サービスの削除
- 接続情報とサービスを指定して削除(state: ‘absent’)を行う。
- name: Delete Service fortios_firewall_service_custom: vdom: "root" state: "absent" firewall_service_custom: name: "test_ser001" register: wk_result - 実行結果:対象のサービスが削除された。 ※削除後のサービス情報なし
最後に
- 「Ansible」の「fortinet.fortios.fortios_firewall_service_custom」を使用し、「Objects-サービス」の登録/変更/削除 ができたことは良かった。しかし、現状 設定情報がベタ書きで使い勝手が悪いので、今後 設定内容をINPUTする仕組みを試みたいと思います。これに伴い、何らかの変更申請の仕組みと連携することができ、より設定変更の自動化が活用できるようになると思います。
