はじめに
- 当記事は、前回の記事「Ansibleを使用してNW機器設定を自動化する(FortiGate-アドレスグループ編①)」からの改善となります。
設定情報がベタ書きで使い勝手が悪い点 を 設定情報をまとめてINPUT(JSON)できる使い勝手の良い仕組みとしました!!
これにより、Anibleとの連携ができるようになりますので、ご参考になれば幸いです。
※前回記事:https://blog.usize-tech.com/ansible-automation-fortigate-addressgroup-1/ - 当記事は、日常の運用業務(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 に保持される
事前設定2:設定情報をまとめてINPUT(JSON)できるように、「Survey」を活用
- テンプレートが読み込むことができる変数(Survey)を設定する。※今回は、各設定のデフォルト値に値を設定する。

- 実際の値(JSON)
・input_addgrp1: {"name":"test_addgroup001","member":[{"name": "test_add001"}]} ・input_addgrp2: {"name":"test_addgroup001","member":[{"name": "test_add002"}]} ・input_addgrp3: {"name":"test_addgroup001","member":[{"name": "test_add001"},{"name": "test_add002"}]}
Playbook作成(YAML)
使用モジュール
- fortinet.fortios.fortios_firewall_addrgrp を使用。
※参考ページ:https://docs.ansible.com/projects/ansible/latest/collections/fortinet/fortios/fortios_firewall_addrgrp_module.html
変数(Survey)の値取得
- vars で 各変数(Survey)の値取得。
※各変数(Survey)の値は、構造化データのように見えて「文字列」なので、ディクショナリ(構造化データ)として正しく扱えるように、from_json フィルターを使用すること!!vars: wk_input1: '{{ input_addgrp1 | from_json}}' wk_input2: '{{ input_addgrp2 | from_json}}' wk_input3: '{{ input_addgrp3 | from_json}}'
Objects-アドレスグループの登録 ★変数(Survey)の値をそのまま使用した場合…エラーとなる
- 接続情報と アドレスグループとアドレスの関連付け を指定して登録(state: ‘present’)を行う。 ※Survey:input_address1を使用
- name: Add AddressGroup(NEW) fortios_firewall_addrgrp: vdom: "root" state: "present" firewall_addrgrp: name: '{{ input_addgrp1.name }}' ← アドレスグループ member: '{{ input_addgrp1.member }}' ← アドレスグループに関連付けするアドレス register: wk_result - 実行結果:構造化データではないので、オブジェクトに項目が無いというエラーとなる。 ※Ansibleの実行結果を抜粋
"failed": true, "msg" : "The task includes an option with an undefined variable.. 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'name' ...
Objects-アドレスグループの登録 ※アドレスグループの新規作成の場合
- 接続情報と アドレスグループとアドレスの関連付け を指定して登録(state: ‘present’)を行う。 ※ディクショナリ(構造化データ)のwk_input1を使用
- name: Add AddressGroup(NEW) fortios_firewall_addrgrp: vdom: "root" state: "present" firewall_addrgrp: name: '{{ wk_input1.name }}' ← アドレスグループ member: '{{ wk_input1.member }}' ← アドレスグループに関連付けするアドレス register: wk_result - 実行結果:対象のアドレスグループが登録された。 ※登録後のアドレスグループを抜粋
"msg": { "meta": { "results": [ { "name": "test_addgroup001", "member": [ {"name": "test_add001"} ] } ], "status": "success", "vdom": "root" } }
Objects-アドレスグループの登録 ※アドレスグループが既に存在する場合
- 接続情報と アドレスグループとアドレスの関連付け を指定して登録(state: ‘present’)を行う。 ※アドレスグループが既に存在する場合は、既存設定の置き換えとなる ※ディクショナリ(構造化データ)のwk_input2を使用
- name: Change AddressGroup(ADD) fortios_firewall_addrgrp: vdom: "root" state: "present" firewall_addrgrp: name: '{{ wk_input2.name }}' ← アドレスグループ member: '{{ wk_input2.member }}' ← アドレスグループに関連付けするアドレス register: wk_result - 実行結果:既存のアドレスグループが上書き更新された。 ※登録後のアドレスグループを抜粋
"msg": { "meta": { "results": [ { "name": "test_addgroup001", "member": [ {"name": "test_add002"} ] } ], "status": "success", "vdom": "root" } }
Objects-アドレスグループの変更 ※関連付けするアドレスを変更したい場合
- 接続情報と アドレスグループとアドレスの関連付け を指定して登録(state: ‘present’)を行う。 ※アドレスグループが既に存在する場合は、既存設定の置き換えとなる ※ディクショナリ(構造化データ)のwk_input3を使用
- name: Change AddressGroup(ADD2) fortios_firewall_addrgrp: vdom: "root" state: "present" firewall_addrgrp: name: '{{ wk_input3.name }}' ← アドレスグループ member: '{{ wk_input3.member }}' ← アドレスグループに関連付けするアドレス register: wk_result - 実行結果:既存のアドレスグループが上書き更新された。 ※登録後のアドレスグループを抜粋
"msg": { "meta": { "results": [ { "name": "test_addgroup001", "member": [ {"name": "test_add002"},{"name": "test_add001"} ] } ], "status": "success", "vdom": "root" } }
- fortinet.fortios.fortios_firewall_addrgrpには、登録処理(state: ‘present’)と削除処理(state: ‘absent’)しか ありません。その為、変更したい場合は、登録処理を活用して上書き更新を行うこととなります!!
Objects-アドレスグループの削除 ※変更のつづき
- 接続情報と アドレスグループと関連付いているアドレス を指定して、削除(state: ‘absent’)を行う。 (注意:関連付いているアドレスが削除されるのではなく、アドレスグループが削除される!!) ※ディクショナリ(構造化データ)のwk_input1を使用
- name: Delete AddressGroup fortios_firewall_addrgrp: vdom: "root" state: "absent" firewall_addrgrp: name: '{{ wk_input1.name }}' ← アドレスグループ ※アドレスグループが削除される register: wk_result - 実行結果:対象のアドレスグループが削除された。 ※削除後のアドレスグループ情報なし
最後に
- 今回、変数(Survey)を活用したことで、AnsibleにINPUT(JSON)を設定できるようになりました。
設定情報がYAMLにベタ書きではなくなったので、使い勝手は増しましたが、
都度 変数(Survey)のデフォルト値に値を設定しての実行の為、まだまだ 使い勝手が悪い。。。今後 外部からAnsibleのINPUT(JSON)に値を連携し実行させる仕組みを試みたいと思います。
