うさラボ

お勉強と備忘録

CiscoACIのvzAny設定をAnsibleで一気に作る

vzAnyの設定がしたい、したことないからしたい

そんなことを考えながら日々生き抜いていました。

なのでやりました、ホントはrole化してもっと自由に組み合わせられるように作るべきなんですが、めんどくさかったです。(意志弱め)

Playbook作成前に、手動で一通りの作業を実施し、順序や対象設定の確認をしています、いきなりPlaybookをしないで作業のイメージを掴むことは非常に重要だと思っています

AccessPolicyの設定は無視で、Tenantの設定のみ対象にしています。

どんな場面で使うか?それはSandBox環境で俺俺勉強環境を作るくらいでしか思い浮かびません(正直者)

具体的な設定手順は以下の通りです

  1. Tenant作成
  2. VRF作成
  3. Contract作成
  4. Filter作成
  5. Filete Entry作成(permit anyで作成)
  6. ContractとFilterを紐付け
  7. vzAnyのProviderContract設定(aci_rest)
  8. vzAnyのConsumedContract設定(aci_rest)

7,8はモジュールがないため、aci_restで実装しました。

aci_restで利用するパスやコンテンツはShow ACI Inspectorの機能を利用しています f:id:usage_automate:20210121225829p:plain

ACI Inspectorを起動した状態でGUI作業を実施することで対応するURLやCURLDやコンテンツなどの情報が確認できます f:id:usage_automate:20210121230149p:plain

どうやら/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のステータスで冪等性も担保されています。

まぁ、便利!作ってよかったなぁ!(大声)