てくなべ

インフラ、ネットワーク、自動化などの技術的なことを書いていきます。

【実機不要】 Ansible の FortiOSモジュールでコンフィグファイルの操作を試す(残課題あり)

f:id:akira6592:20171005113718p:plain

■ 1. はじめに

Ansible のネットワークモジュールは基本的に動作中の機器に対して操作を行います。 ただし、一部のモジュールでは実機ではなくコンフィグファイルを操作できるモジュールもあります。 この記事では fortios_address モジュールを利用して、Fortigate のコンフィグファイル中のアドレスオブジェクトを操作してみます。

(最後に記述しますが一部残課題があります。)

fortios_* 系モジュールの file_mode オプション

Ansible 2.4 で追加された fortios_config などの fortios_* 系モジュールにある file_modeyes にすると、実機ではなく config_file オプションで指定したコンフィグファイルを操作します。

モジュール例

fortios_address - Manage fortios firewall address objects — Ansible Documentation

■ 2. 準備

モジュール のインストール

実行には pyFGnetaddr というモジュールが必要なので、インストールしておきます。

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、右上が部分的なコンフィグファイル、下がコンソールです 右上の部分的なコンフィグファイルが書き換わります。 f:id:akira6592:20171005120517g:plain

■ 5.残課題

事前事後のコンフィグファイルを比較すると分かるのですが、意図したアドレスオブジェクトの定義のほかに、全体的に以下の2点の変更がされました。

  • インデント追加
  • ダブルクォーテーションの削除

他にも意図しない変更があったためか、変更後のコンフィグファイルを実機にリストアしようとしても、エラーになってしまいました。 内部の動作を細かく見れていませんが、少なくとも私の環境(v5.0系)では現状は限定的な利用にとどめておいた方がよさそうです。