■ 1. はじめに
Ansible のネットワークモジュールは基本的に動作中の機器に対して操作を行います。
ただし、一部のモジュールでは実機ではなくコンフィグファイルを操作できるモジュールもあります。
この記事では fortios_address
モジュールを利用して、Fortigate のコンフィグファイル中のアドレスオブジェクトを操作してみます。
(最後に記述しますが一部残課題があります。)
fortios_* 系モジュールの file_mode オプション
Ansible 2.4 で追加された fortios_config
などの fortios_*
系モジュールにある
file_mode
を yes
にすると、実機ではなく config_file
オプションで指定したコンフィグファイルを操作します。
モジュール例
fortios_address - Manage fortios firewall address objects — Ansible Documentation
■ 2. 準備
モジュール のインストール
実行には pyFG
と netaddr
というモジュールが必要なので、インストールしておきます。
pip install pyfg netaddr
コンフィグファイルの準備
あらかじめ、実機からダウンロードするなどしてコンフィグファイルを準備しておきます。
ここでは config.txt
というファイル名と仮定します。
なお、試した限りですと、操作対象の階層が含まれる部分的なコンフィグファイルでも大丈夫そうです。
例えば fortios_address
モジュールで、アドレスオブジェクトを操作する場合、以下の部分的なコンフィグファイルで動作しました。
config firewall address end
この方法であれば、実機不要で試すことができます。
■ 3. playbookの作成
以下のようなplaybookを作成します。
ここでは、公式ドキュメントの例にあるような、 google_dns
というアドレスオブジェクトが
定義されている状態にするplaybookにします。
--- - hosts: localhost # 実機を対象としない。ここではダミー的に localhost とする gather_facts: no connection: local tasks: - name: Register google DNS fortios_address: state: present name: "google_dns" type: ipmask value: 8.8.8.8 file_mode: yes # 実機ではなくコンフィグファイルを操作対象とするモード config_file: forti.config # 操作したいコンフィグファイル
■ 4. 実行
事前確認
実行前の config.txt
は以下の内容です。
~(略)~ config firewall address edit "all" next end ~(略)~
実行
[vagrant@centos7 vagrant]$ ansible-playbook forti.yml PLAY [localhost] ****************************************************************************************************************************** TASK [Register google DNS] ******************************************************************************************************************** changed: [localhost] PLAY RECAP ************************************************************************************************************************************ localhost : ok=1 changed=1 unreachable=0 failed=0
事後確認
以下のコンフィグファイルの内容になりました。
~(略)~ config firewall address edit all next edit google_dns set subnet 8.8.8.8 255.255.255.255 next end ~(略)~
冪統制確認
もう一度、同じplaybookを実行してみます。
[vagrant@centos7 vagrant]$ ansible-playbook forti.yml PLAY [localhost] ****************************************************************************************************************************** TASK [Register google DNS] ******************************************************************************************************************** ok: [localhost] PLAY RECAP ************************************************************************************************************************************ localhost : ok=1 changed=0 unreachable=0 failed=0
すでに google_dns
というアドレスオブジェクトがあるため、 changed=0
となりました。
デモ動画
左上がplaybook、右上が部分的なコンフィグファイル、下がコンソールです
右上の部分的なコンフィグファイルが書き換わります。
■ 5.残課題
事前事後のコンフィグファイルを比較すると分かるのですが、意図したアドレスオブジェクトの定義のほかに、全体的に以下の2点の変更がされました。
- インデント追加
- ダブルクォーテーションの削除
他にも意図しない変更があったためか、変更後のコンフィグファイルを実機にリストアしようとしても、エラーになってしまいました。 内部の動作を細かく見れていませんが、少なくとも私の環境(v5.0系)では現状は限定的な利用にとどめておいた方がよさそうです。