- 当記事は、前回の記事「Ansibleを使用してNW機器設定を自動化する(PaloAlto-アドレスグループ編①)」からの改善となります。
設定情報がベタ書きで使い勝手が悪い点 を 設定情報をまとめてINPUT(JSON)できる使い勝手の良い仕組みとしました!!
これにより、Anibleとの連携ができるようになりますので、ご参考になれば幸いです。
※前回記事:Ansibleを使用してNW機器設定を自動化する(PaloAlto-アドレスグループ編①) – TechHarmony - 当記事は、日常の運用業務(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_addressgroup1: {"name":"test_addressgroup001","static_value":"test_address001"} ・input_addressgroup2: {"name":"test_addressgroup001","static_value":"test_address002"} ・input_addressgroup3: {"name":"test_addressgroup001","static_value":["test_address001","test_address003"]} ・input_addressgroup4: {"name":"test_addressgroup001","static_value":"test_address003"} ・input_addressgroup5: {"name":"test_addressgroup001","static_value":"test_address003"}
Playbook作成(YAML)
使用モジュール
- paloaltonetworks.panos.panos_address_group を使用。
※参考ページ:
Ansible Galaxy
接続情報(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_addressgroup1 | from_json}}' wk_input2: '{{ input_addressgroup2 | from_json}}' wk_input3: '{{ input_addressgroup3 | from_json}}' wk_input4: '{{ input_addressgroup4 | from_json}} wk_input5: '{{ input_addressgroup5 | from_json}}
Objects-アドレスグループの登録 ★変数(Survey)の値をそのまま使用した場合…エラーとなる
- 接続情報と アドレスグループとアドレスの関連付け(Survey:input_addressgroup1)を指定して登録(state: ‘present’)を行う。
- name: Present AddressGroup1_input_addressgroup1 paloaltonetworks.panos.panos_address_group: provider: '{{ provider }}' name: '{{ input_addressgroup1.name }}' ← アドレスグループ static_value: '{{ input_addressgroup1.static_value }}' ← アドレスグループに関連付けするアドレス state: 'present' register: wk_result
- 実行結果:構造化データではないので、オブジェクトに項目が無いというエラーとなる。 ※Ansibleの実行結果(diff)を抜粋
"msg": "The task includes an option with an undefined variable. The error was: 'ansible.utils.unsafe_proxy.AnsibleUnsafeText object' has no attribute 'name'. ...
Objects-アドレスグループの登録 ※アドレスグループの新規作成の場合
- 接続情報と アドレスグループとアドレスの関連付け(ディクショナリ:wk_input)を指定して登録(state: ‘present’)を行う。
- name: Present AddressGroup1_wk_input paloaltonetworks.panos.panos_address_group: provider: '{{ provider }}' name: '{{ wk_input1.name }}' ← アドレスグループ static_value: '{{ wk_input1.static_value }}' ← アドレスグループに関連付けするアドレス state: 'present' register: wk_result
- 実行結果:対象のアドレスグループが登録された。 ※Ansibleの実行結果(diff)を抜粋
"before": "", "after" : "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_addressgroup001\">\n\t<static>\n\t\t<member>test_address001</member>\n\t</static>\n</entry>\n"
Objects-アドレスグループの登録 ※アドレスグループが既に存在する場合
- 接続情報と アドレスグループとアドレスの関連付け を指定して登録(state: ‘present’)を行う。 ※アドレスグループが既に存在する場合は、既存設定の置き換えとなる(state: ‘replaced’と同様)
- name: Present AddressGroup1 paloaltonetworks.panos.panos_address_group: provider: '{{ provider }}' name: '{{ wk_input2.name }}' ← アドレスグループ static_value: '{{ wk_input2.static_value }}' ← アドレスグループに関連付けするアドレス state: 'present' register: wk_result
- 実行結果:既存のアドレスグループが上書き更新された。 ※Ansibleの実行結果(diff)を抜粋
"before": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_addressgroup001\">\n\t<static>\n\t\t<member>test_address001</member>\n\t</static>\n</entry>\n", "after" : "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_addressgroup001\">\n\t<static>\n\t\t<member>test_address002</member>\n\t</static>\n</entry>\n"
Objects-アドレスグループの変更 ※登録のつづき(新たなアドレスを関連付けする)
- 接続情報と アドレスグループとアドレスの関連付け を指定して、アドレスグループの変更(state: ‘replaced’)を行う。 ※replacedの場合は、既存設定の置き換えとなる (注意:関連付け後の状態を指定すること!!)
- name: Replaced AddressGroup1 paloaltonetworks.panos.panos_address_group: provider: '{{ provider }}' name: '{{ wk_input3.name }}' static_value: '{{ wk_input3.static_value }}' ← 関連付け後の状態を指定すること!! state: 'replaced' register: wk_result
- 実行結果:既存のアドレスグループが上書き更新された。 ※Ansibleの実行結果(diff)を抜粋
"before": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_addressgroup001\">\n\t<static>\n\t\t<member>test_address002</member>\n\t</static>\n</entry>\n", "after" : "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_addressgroup001\">\n\t<static>\n\t\t<member>test_address001</member>\n\t\t<member>test_address003</member>\n\t</static>\n</entry>\n"
- 接続情報と アドレスグループとアドレスの関連付け を指定して、アドレスグループの変更(state: ‘merged’)を行う。 ※mergedの場合は、既存設定を維持した更新(Append)となる。その為、特定アドレスの関連付け解除はできない (注意:アドレスの関連付け解除をしたい場合は state: ‘replaced’ を使用する必要がある!!)
- name: Merged AddressGroup1 paloaltonetworks.panos.panos_address_group: provider: '{{ provider }}' name: '{{ wk_input4.name }}' static_value: '{{ wk_input4.static_value }}' ← 関連付けしたいアドレスのみ指定すること!! state: 'merged' register: wk_result
- 実行結果:既存のアドレスグループが更新(Append)された。既存設定が維持されていることを確認。 ※Ansibleの実行結果(diff)を抜粋
"before": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_addressgroup001\">\n\t<static>\n\t\t<member>test_address002</member>\n\t</static>\n</entry>\n", "after" : "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_addressgroup001\">\n\t<static>\n\t\t<member>test_address002</member>\n\t\t<member>test_address003</member>\n\t</static>\n</entry>\n"
Objects-アドレスグループの情報収集 ※変更のつづき
- 接続情報と アドレスグループ を指定して情報収集(state: ‘gathered’)を行う。
- name: gathered AddressGroup1 paloaltonetworks.panos.panos_address_group: provider: '{{ provider }}' name: '{{ wk_input1.name }}' state: 'gathered' register: wk_result
実行結果:対象アドレスグループの情報が取得できた。 ※Ansibleの実行結果(gathered_xml)を抜粋
"gathered_xml": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_addressgroup001\">\n\t<static>\n\t\t<member>test_address001</member>\n\t\t<member>test_address003</member>\n\t</static>\n</entry>\n",
Objects-アドレスグループの削除 ※変更のつづき
- 接続情報と アドレスグループと関連付いているアドレス を指定して、削除(state: ‘absent’)を行う。 (注意:関連付いているアドレスが削除されるのではなく、アドレスグループが削除される!!)
- name: Absent AddressGroup1 paloaltonetworks.panos.panos_address_group: provider: '{{ provider }}' name: '{{ wk_input5.name }}' ← アドレスグループ ※アドレスグループが削除される static_value: '{{ wk_input5.static_value }}' ← アドレスグループに関連付いているアドレス ※指定の必要なし state: 'absent' register: wk_result
- 実行結果:対象のアドレスグループが削除された。 ※Ansibleの実行結果(diff)を抜粋
"before": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<entry name=\"test_addressgroup001\">\n\t<static>\n\t\t<member>test_address001</member>\n\t\t<member>test_address003</member>\n\t</static>\n</entry>\n", "after" : ""
最後に
- 今回、変数(Survey)を活用したことで、AnsibleにINPUT(JSON)を設定できるようになりました。
設定情報がYAMLにベタ書きではなくなったので、使い勝手は増しましたが、
都度 変数(Survey)のデフォルト値に値を設定しての実行の為、まだまだ 使い勝手が悪い。。。今後 外部からAnsibleのINPUT(JSON)に値を連携し実行させる仕組みを試みたいと思います。