Ansibleを使用してNW機器設定を自動化する(PaloAlto-アドレス編②)

はじめに

  • 当記事は、前回の記事「Ansibleを使用してNW機器設定を自動化する(PaloAlto-アドレス編①)」からの改善となります。
    設定情報がベタ書きで使い勝手が悪い点 を 設定情報をまとめてINPUT(JSON)できる使い勝手の良い仕組みとしました!!
    これにより、Anibleとの連携ができるようになりますので、ご参考になれば幸いです。
    ※前回記事:https://blog.usize-tech.com/ansible-automation-paloalto-address-1/
  • 当記事は、日常の運用業務(NW機器設定)の自動化により、運用コストの削減 および 運用品質の向上 を目標に
    「Ansible」を使用し、様々なNW機器設定を自動化してみようと 試みた記事です。
  • Ansibleは、OSS版(AWX)+OSS版(Ansible)を使用しております。

 

PaloAltoの「Objects-アドレス」の登録/変更/削除を実施してみた

事前設定

  • Templateを作成し、インベントリーと認証情報を設定する。
  • インベントリー:対象機器(ホスト)の接続先を設定。 ※ホストには以下変数で接続先IPを指定
    ansible_host: xxx.xxx.xxx.xxx
  • 認証情報:対象機器へのログイン情報(ユーザ名/パスワード)を設定。
    ユーザ名は  変数:ansible_user   に保持される
    パスワードは 変数:ansible_password に保持される

 

事前設定2:設定情報をまとめてINPUT(JSON)できるように、「Survey」を活用

  • テンプレートが読み込むことができる変数(Survey)を設定する。※今回は、各設定のデフォルト値に値を設定する。
  • 実際の値(JSON)
    ・input_address1: {"name":"test_address001","address_type":"ip-netmask","value":"192.168.10.0/24","description":"address_ip-netmask","wk_tag":["test"]}
    ・input_address2: {"name":"test_address001","address_type":"ip-netmask","value":"192.168.20.0/24","description":"address_ip-netmask","wk_tag":["test"]}
    ・input_address3: {"name":"test_address001","address_type":"ip-netmask","value":"192.168.30.0/24","description":"address_ip-netmask","wk_tag":["test"]}
    ・input_address4: {"name":"test_address001"}

 

事前設定

  • Templateを作成し、インベントリーと認証情報を設定する。
  • インベントリー:対象機器(ホスト)の接続先を設定。 ※ホストには以下変数で接続先IPを指定
    ansible_host: xxx.xxx.xxx.xxx
  • 認証情報:対象機器へのログイン情報(ユーザ名/パスワード)を設定。
    ユーザ名は  変数:ansible_user   に保持される
    パスワードは 変数:ansible_password に保持される

 

Playbook作成(YAML)

使用モジュール
  • paloaltonetworks.panos.panos_address_object を使用。
    ※参考ページ:https://galaxy.ansible.com/ui/repo/published/paloaltonetworks/panos/content/module/panos_address_object/

 

接続情報(provider)の設定
  • providerには、ip_address/username/password の指定が必要。
    vars:
      provider:
        ip_address: '{{ ansible_host }}'   ← インベントリーのホストで設定
        username: '{{ ansible_user }}'    ← 認証情報で設定
        password: '{{ ansible_password }}'  ← 認証情報で設定

 

変数(Survey)の値取得
  • vars で 各変数(Survey)の値取得。
    ※各変数(Survey)の値は、構造化データのように見えて「文字列」なので、ディクショナリ(構造化データ)として正しく扱えるように、from_json フィルターを使用すること!!    

    vars:
      wk_input1: '{{ input_address1 | from_json}}'
      wk_input2: '{{ input_address2 | from_json}}'
      wk_input3: '{{ input_address3 | from_json}}'
      wk_input4: '{{ input_address4 | from_json}}'

 

Objects-アドレスの登録 ★変数(Survey)の値をそのまま使用した場合…エラーとなる
  • 接続情報とアドレス情報(Survey:input_address1)を指定して登録(state: ‘present’)を行う。
    - name: Add Address1_input_address1
      paloaltonetworks.panos.panos_address_object:
        provider: '{{ provider }}'
        name: '{{ input_address1.name }}'
        address_type: '{{ input_address1.address_type }}'
        value: '{{ input_address1.value }}'
        description: '{{ input_address1.description }}'
        tag: '{{ input_address1.wk_tag }}'
        state: 'present'
      register: wk_result
  • 実行結果:構造化データではないので、オブジェクトに項目が無いというエラーとなる。 ※Ansibleの実行結果を抜粋
    "msg": "The task includes an option with an undefined variable.
            The error was: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'name'.
            ...
Objects-アドレスの登録
  • 接続情報とアドレス情報(Survey:input_address1)を指定して登録(state: ‘present’)を行う。
    - name: Add Address1_wk_input
      paloaltonetworks.panos.panos_address_object:
        provider: '{{ provider }}'
        name: '{{ wk_input1.name }}'
        address_type: '{{ wk_input1.address_type }}'
        value: '{{ wk_input1.value }}'
        description: '{{ wk_input1.description }}'
        tag: '{{ wk_input1.wk_tag }}'
        state: 'present'
      register: wk_result
  • 実行結果:対象のアドレスが登録された。 ※Ansibleの実行結果(diff)を抜粋
    "before": "",
    "after" : "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_address001\">\n\t<ip-netmask>192.168.10.0/24</ip-netmask>\n\t<description>address_ip-netmask</description>\n\t<tag>\n\t\t<member>test</member>\n\t</tag>\n</entry>\n"

 

Objects-アドレスの変更 ※登録のつづき
  • 接続情報とアドレス情報を指定して 登録されたアドレスの変更(state: ‘replaced’)を行う。 ※replacedの場合は、既存設定の置き換えとなる
    - name: Change Address1
      paloaltonetworks.panos.panos_address_object:
        provider: '{{ provider }}'
        name: '{{ wk_input2.name }}'
        address_type: '{{ wk_input2.address_type }}'
        value: '{{ wk_input2.value }}'
        description: '{{ wk_input2.description }}'
    #    tag: '{{ wk_input2.wk_tag }}'
        state: 'replaced'
      register: wk_result
  • 実行結果:登録時のtag指定ありのアドレスが、Rreplaedによりtag指定なしのアドレスに変更された。 ※Ansibleの実行結果(diff)を抜粋
    "before": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_address001\">\n\t<ip-netmask>192.168.10.0/24</ip-netmask>\n\t<description>address_ip-netmask</description>\n\t<tag>\n\t\t<member>test</member>\n\t</tag>\n</entry>\n",
    "after" : "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_address001\">\n\t<ip-netmask>192.168.20.0/24</ip-netmask>\n\t<description>address_ip-netmask</description>\n</entry>\n"
 
  • 接続情報とアドレス情報を指定して 登録されたアドレスの変更(state: ‘merged’)を行う。 ※mergedの場合は、既存設定の上書きとなる
    - name: Change Address2
      paloaltonetworks.panos.panos_address_object:
        provider: '{{ provider }}'
        name: '{{ wk_input1.name }}'
        address_type: '{{ wk_input3.address_type }}'
        value: '{{ wk_input3.value }}'
    #    description: '{{ wk_input3.description }}'
        tag: '{{ wk_input3.wk_tag }}'
        state: 'merged'
    register: wk_result
  • 実行結果:上記変更時のtag指定なしのアドレスが、mergedによりtag指定ありのアドレスに変更された。また、アドレス情報にdescriptionを指定しなくても、既存設定が維持されていることを確認。 ※Ansibleの実行結果(diff)を抜粋
    "before": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_address001\">\n\t<ip-netmask>192.168.20.0/24</ip-netmask>\n\t<description>address_ip-netmask</description>\n</entry>\n",
    "after" : "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_address001\">\n\t<ip-netmask>192.168.30.0/24</ip-netmask>\n\t<description>address_ip-netmask</description>\n\t<tag>\n\t\t<member>test</member>\n\t</tag>\n</entry>\n"
 
Objects-アドレスの情報収集 ※変更のつづき
  • 接続情報とアドレスを指定して情報収集(state: ‘gathered’)を行う。
    - name: Get Address Info
      paloaltonetworks.panos.panos_address_object:
        provider: '{{ provider }}'
        name: '{{ wk_input4.name }}'
        state: 'gathered'
      register: wk_result
  • 実行結果:対象アドレスの情報が取得できた。 ※Ansibleの実行結果(gathered_xml)を抜粋
    "gathered_xml": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_address001\">\n\t<ip-netmask>192.168.30.0/24</ip-netmask>\n\t<description>address_ip-netmask</description>\n\t<tag>\n\t\t<member>test</member>\n\t</tag>\n</entry>\n",

 

Objects-アドレスの削除 ※変更のつづき
  • 接続情報とアドレスを指定して削除(state: ‘absent’)を行う。
    - name: Delete Address1
      paloaltonetworks.panos.panos_address_object:
        provider: '{{ provider }}'
        name: '{{ wk_input4.name }}'
        state: 'absent'
      register: wk_result
  • 実行結果:対象のアドレスが削除された。 ※Ansibleの実行結果(diff)を抜粋
    "before": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_address001\">\n\t<ip-netmask>192.168.30.0/24</ip-netmask>\n\t<description>address_ip-netmask</description>\n\t<tag>\n\t\t<member>test</member>\n\t</tag>\n</entry>\n",
    "after" : ""

最後に

  • 今回、変数(Survey)を活用したことで、AnsibleにINPUT(JSON)を設定できるようになりました。
    設定情報がYAMLにベタ書きではなくなったので、使い勝手は増しましたが、
    都度 変数(Survey)のデフォルト値に値を設定しての実行の為、まだまだ 使い勝手が悪い。。。
        

    今後 外部からAnsibleのINPUT(JSON)に値を連携し実行させる仕組みを試みたいと思います。

タイトルとURLをコピーしました