てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] Palo Alto ファイアウォールから Automation Controller のジョブテンプレートを実行する(EDA Controller なし)

はじめに

前回の記事(以下、EDAありの記事)で、EDA Controller を使い、Palo Alto ファイアウォールの設定変更したらコンフィグを git にバックアップする仕組みを作ってみました。

作っている途中、EDA Controller を経由しなくても同等のことが実現できるのではないかと思いました。違いを体感するため、EDA Controller なしのパターンでも作ってみます。

  • 環境
    • paloaltonetworks.panos コレクション 2.17.3
    • Automation Controller 4.4 (AAP 2.4)

作るもの

Palo Alto 側で設定変更してコミットすると、Automation Controller のジョブテンプレートを実行され、Palo Alto のコンフィグを取得して git push するものです。

EDAありの記事と大きく異なるのは、EDA Controller を経由しないことです。Palo Alto から HTTP のログを飛ばす際に、 Automation Controller の REST API の形式に合わせてあげるのもポイントです。

流れ

■ Palo Alto 側の設定

まず、ログの発生源である Palo Alto 側の設定をします。EDAありの記事と同じの部分も多いです。

HTTP サーバープロファイルの作成

Palo Alto から HTTP でログを出力させるために、まず HTTP サーバープロファイル を設定します。

画面上部の DEVICE タブをクリックし、左メニューの サーバープロファイル 配下の HTTP をクリックします。HTTP サーバープロファイル一覧画面で (+) 追加 ボタンをクリックします。

HTTP サーバープロファイル作成画面が開きます。

HTTP サーバープロファイル作成画

HTTP サーバープロファイルの名前は ac-profile とします。

サーバー タブで、今回は以下の内容で追加します。

項目 今回の値 補足
名前 ac-server
アドレス (Automation Controllerのアドレス)
プロトコル HTTPS
ポート 443
TLS バージョン 1.2
証明書プロファイル None
HTTP 方式 POST
ユーザー名 (未指定)
パスワード abc 実際には不要だが必須のため適当な値

ユーザー名とパスワードの入力は、対象サーバーに対しての Basic 認証か何かに利用されるのかと予想しましたが、試した限りそうではありませんでした。そのため、Automation Controller への認証情報は、後述の Authorization ヘッダーで別途指定します。

続いて、ペイロードの形式 タブをクリックします。今回は、コンフィグのコミット完了のログを取れるログタイプ システム をクリックします。ペイロードの設定画面が表示されます。

ペイロード設定

今回は、以下のように設定します。

項目 今回の値 補足
名前 ac-system-payload
URI の形式 /api/v2/job_templates/11/launch/ 11 は今回実行したいジョブテンプレートのID、実際はジョブテンプレート作成してからこの設定をする
HTTP ヘッダー ヘッダー: Content-Type、値: application/json 指定しないと 415 Unsupported Media Type になる
ヘッダー: Authorization、値: Bearer トークン トークンは予め取得した OAuth 2 のトークンを利用する
ペイロード *1

*1 ペイロード:

{
  "extra_vars": {
    "device_name": "$device_name",
    "receive_time": "$receive_time",
    "opaque": "$opaque"
  }
} 

このペイロードには、ジョブテンプレートで必要な値を中心に詰め込みます。EDAありの記事と異なるのは、各変数を extra_vars 配下にした点です。

全体的に REST API リファレンス

POST /api/v2/job_templates/{id}/launch/ Launch a Job Template

の方式に合わせています。

ログ設定

先ほどはプロファイルを作成しただけなので、今度はそれをどう割り当てるかという設定です。

左メニューから ログ設定 をクリックします。設定 セクションの (+) 追加 ボタンをクリックします。

ログタイプ「設定」の設定

ログ設定画面が開きます。

ログ設定

今回は、以下のように設定します。

項目 今回の値 補足
名前 ac-log-system
フィルタ (description contains 'Commit job succeeded') コミットしたときのログのみにフィルターする
HTTP ac-profile (+) 追加 で先ほど作成した HTTP サーバープロファイルを選択

ここまでで Palo Alto 側の設定ができました。コミットを忘れずにしておきます。

■ Automation Controller 側の設定

Playbook の作成

ジョブテンプレートで実行する Playbook は以下のとおりです。

---
- name: Config Backup
  hosts: pan
  gather_facts: false

  tasks:
    # コンフィグバックアップリポジトリの clone
    - name: Execute git clone
      ansible.builtin.git:
        repo: git@example.com/pan-config-backup.git
        dest: pan-config-backup

    # Palo Alto から コンフィグエクスポート
    - name: Export a configuration
      paloaltonetworks.panos.panos_export:
        provider: "{{ provider }}"
        category: configuration
        filename: pan-config-backup/export.xml  # ほぼ改行無し
    
    # XML のフォーマット(改行)
    - name: Pretty prrint XML
      ansible.builtin.xml:
        xmlstring: "{{ lookup('file', 'pan-config-backup/export.xml') }}"
        pretty_print: true
      register: res_xml

    # フォーマット済み XML の書き出し
    - name: Write a pretty XML 
      ansible.builtin.copy:
        content: "{{ res_xml.xmlstring }}"
        dest: pan-config-backup/export.xml

    # git commit
    - name: Execute git commit
      ansible.builtin.command:
        cmd: "{{ item }}"
        chdir: pan-config-backup
      loop:
        - git add .
        - git commit -m "{{ opaque }}"    # EDA Controller ありと異なる点
        - git push

EDAありの記事と異なるのは、git commit する際のメッセージの変数名の指定のみです。EDA Controller を経由した場合は、ansible_eda 配下にさまざまな値が入りますが、今回はフラットな extra vars として渡ってきます。そのため単に opaque という変数の指定にしています。これは Palo Alto 側のでペイロードをそのように指定したためです。

Automation Controller 側の設定

先ほど作成した Playbook の実行するジョブテンプレートの名前を paloalto_config_backup_ac とします。

ジョブテンプレートでAPI 経由で追加変数を受け付けるように、追加変数の「起動プロンプト」を有効にしておきます。

忘れずに起動プロンプトを有効にする

ほか、インベントリや認証情報の設定も Automation Controller 上で設定しておきます。

■ 動作確認

準備ができたので、一連の流れを試します。流れは以下の通りです。

  1. (人の操作) Palo Alto 側で設定変更(今回はオブジェクト追加)してコミット
  2. Palo Alto から Automation Controller へ HTTPSREST API 形式)でログが飛び、ジョブテンプレートを実行
  3. Automation Controller からPalo Alto のコンフィグを取得して git push

設定変更して

設定変更

コミットすると

コミット

ジョブが動いて

バックアップジョブの実行

git push される

git push 結果

コミット時のみログが飛ぶようにフィルターを設定してあるので、ほかのログの時には特に何も起こりません。

EDA Controller 有無の比較

同じような仕組みを、EDA Controller ありなしのパターンの両方で試せたので、主観ですが感じた特徴をまとめます。あくまで私がブログに書いた処理内容での範囲です。

EDA Controller あり EDA Controller なし 補足
ログのフィルター・ルールの柔軟性 ○: Rulebook 側でもルールを指定可 △: Palo Alto 側でフィルターする必要がある
アクションの柔軟性 ○: 1ログにつき複数のアクション(リクエストなど) △: 1ログにつき1リクエス
ジョブテンプレートの実行 ○: Rulebook 内で名前で指定して実行 △: エンドポイント内でID で指定して実行
ワークフロージョブテンプレートの実行 ✗: 不可(ansible-rulebook 1.0.0 時点) △: エンドポイント内でID で指定して実行

もちろん、不要なのであれば無い方がメンテナンス対象が少ないことからくる運用上のメリットはあると思います。

おわりに

Palo Alto の設定変更をすると EDA 経由で、コンフィグを git push する仕組みを EDA Controller なしで試してみました。

Palo Alto 側の HTTP サーバープロファイルの設定の柔軟性のおかげで、EDA Controller なしでもできないこともないな、という感想です。作っている最中は ジョブテンプレートを名前ではなく ID で指定する必要がある点が、ややむずむずしました。もっと複雑な処理を作ろうとすると、EDA Controller ありなしの差分が他にも色々出てきそうな気もします。

参考