vzAnyの設定がしたい、したことないからしたい
そんなことを考えながら日々生き抜いていました。
なのでやりました、ホントはrole化してもっと自由に組み合わせられるように作るべきなんですが、めんどくさかったです。(意志弱め)
Playbook作成前に、手動で一通りの作業を実施し、順序や対象設定の確認をしています、いきなりPlaybookをしないで作業のイメージを掴むことは非常に重要だと思っています
AccessPolicyの設定は無視で、Tenantの設定のみ対象にしています。
どんな場面で使うか?それはSandBox環境で俺俺勉強環境を作るくらいでしか思い浮かびません(正直者)
具体的な設定手順は以下の通りです
- Tenant作成
- VRF作成
- Contract作成
- Filter作成
- Filete Entry作成(permit anyで作成)
- ContractとFilterを紐付け
- vzAnyのProviderContract設定(aci_rest)
- vzAnyのConsumedContract設定(aci_rest)
7,8はモジュールがないため、aci_restで実装しました。
aci_restで利用するパスやコンテンツはShow ACI Inspector
の機能を利用しています
ACI Inspectorを起動した状態でGUI作業を実施することで対応するURLやCURLDやコンテンツなどの情報が確認できます
どうやら/api/node/mo/uni/tn-テナント名/ctx-VRF名/any.json
のURLに対して、コンテンツvzRsAnyToCons/vzRsAnyToProvでContractを指定して送ることで設定ができることが確認できました。
出来上がったPlaybookがこちらです。
--- - hosts: APIC gather_facts: false connection: local vars_files: vars/sample.yml vars: aci_auth: - &aci_auth host: "{{ inventory_hostname }}" username: "{{ username }}" password: "{{ password }}" validate_certs: false tasks: - name: add a new Tenant aci_tenant: <<: *aci_auth tenant: "{{ tenant.name }}" state: present - name: add a new VRF aci_vrf: <<: *aci_auth tenant: "{{ tenant.name }}" vrf: "{{ vrf.name }}" policy_control_preference: enforced policy_control_direction: ingress state: present - name: add vzAny Contract aci_contract: <<: *aci_auth tenant: "{{ tenant.name }}" scope: context dscp: unspecified priority: unspecified contract: "{{ vzAny_contract }}" state: present - name: add all permit filter aci_filter: <<: *aci_auth tenant: "{{ tenant.name }}" filter: all_permit state: present - name: add all permit filter entry aci_filter_entry: <<: *aci_auth tenant: "{{ tenant.name }}" filter: all_permit entry: all_permit ether_type: unspecified ip_protocol: unspecified dst_port: unspecified stateful: no state: present - name: add subject to vzAny Contract aci_contract_subject: <<: *aci_auth tenant: "{{ tenant.name }}" subject: all_permit contract: "{{ vzAny_contract }}" state: present - name: add vzAny Contracts(Provided) aci_rest: <<: *aci_auth path: /api/node/mo/uni/tn-{{ tenant.name }}/ctx-{{ vrf.name }}/any.json method: post content: vzRsAnyToProv: attributes: tnVzBrCPName: "{{ vzAny_contract }}" - name: add vzAny Contracts(Consumed) aci_rest: <<: *aci_auth path: /api/node/mo/uni/tn-{{ tenant.name }}/ctx-{{ vrf.name }}/any.json method: post content: vzRsAnyToCons: attributes: tnVzBrCPName: "{{ vzAny_contract }}"
テナント単位で設定ファイルを用意し、このファイルを見れば大体構成わかるよね?という状態を目指しています。なのでこのような構成でAnsibleを作ってブログに載せることも多いかと思います。 sample.yml(今回はAP/BD/EPGの設定部分は利用していません)
tenant: name: sample_tenant ap: name: sample_ap epgs: - { name: sample_epg, bd: sample_bd, vlan: 100 } vrf: name: sample_vrf bds: - { name: sample_bd, ip: 10.0.0.1, mask: 28 } vzAny_contract: vzAny_contract
一応実行ログ
PLAY [APIC] ************************************************************************************************************************************************************ TASK [add a new Tenant] ************************************************************************************************************************************************ [WARNING]: Platform darwin on host sandboxapicdc.cisco.com is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information. changed: [sandboxapicdc.cisco.com] TASK [add a new VRF] *************************************************************************************************************************************************** changed: [sandboxapicdc.cisco.com] TASK [add vzAny Contract] ********************************************************************************************************************************************** changed: [sandboxapicdc.cisco.com] TASK [add all permit filter] ******************************************************************************************************************************************* changed: [sandboxapicdc.cisco.com] TASK [add all permit filter entry] ************************************************************************************************************************************* changed: [sandboxapicdc.cisco.com] TASK [add subject to vzAny Contract] *********************************************************************************************************************************** changed: [sandboxapicdc.cisco.com] TASK [add vzAny Contracts(Provided)] *********************************************************************************************************************************** changed: [sandboxapicdc.cisco.com] TASK [add vzAny Contracts(Consumed)] *********************************************************************************************************************************** changed: [sandboxapicdc.cisco.com] PLAY RECAP ************************************************************************************************************************************************************* sandboxapicdc.cisco.com : ok=8 changed=8 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
実行も正常に完了し、2回流すと全てOKのステータスで冪等性も担保されています。
まぁ、便利!作ってよかったなぁ!(大声)