らくがきちょう

なんとなく

Cisco ACI を Ansible 2.4 で設定してみる

Cisco ACI から Ansible を操作する手順については Ansible (ACI) のページに記載がありました。 ですが、Ansible 2.4 以降は ACI 関連モジュールが Ansible に取り込まれた為、現在はこちらのページにアクセスしても以下の表示があるだけです。

THIS REPO HAS BEEN DEPRECATED. ALL MODULES CAN NOW BE FOUND IN ANSIBLE CORE 2.4.

Ansible Core に取り込まれたことにより、ACI 関連モジュールのドキュメントは Docs > Network Modules から参照出来るようになりました。 今回は Ansible を使って Cisco ACI を設定する手順をメモしておこうと思います。

検証環境

検証には以下を利用しました。

  • Cisco ACI 3.0(1f)
  • Ansible 2.4.0

サポートされているモジュール

現時点 (Ansible 2.4.0) では以下のモジュールがリリースされていました。

Module Description
aci_aep Manage attachable Access Entity Profile (AEP) on Cisco ACI fabrics (infra:AttEntityP)
aci_ap Manage top level Application Profile (AP) objects on Cisco ACI fabrics (fv:Ap)
aci_bd Manage Bridge Domains (BD) on Cisco ACI Fabrics (fv:BD)
aci_bd_subnet Manage Subnets on Cisco ACI fabrics (fv:Subnet)
aci_bd_to_l3out Bind Bridge Domain to L3 Out on Cisco ACI fabrics (fv:RsBDToOut)
aci_config_rollback Provides rollback and rollback preview functionality for Cisco ACI fabrics (config:ImportP)
aci_config_snapshot Manage Config Snapshots on Cisco ACI fabrics (config:Snapshot, config:ExportP)
aci_contract Manage contract resources on Cisco ACI fabrics (vz:BrCP)
aci_contract_subject Manage initial Contract Subjects on Cisco ACI fabrics (vz:Subj)
aci_contract_subject_to_filter Bind Contract Subjects to Filters on Cisco ACI fabrics (vz:RsSubjFiltAtt)
aci_epg Manage End Point Groups (EPG) on Cisco ACI fabrics (fv:AEPg)
aci_epg_monitoring_policy Manage monitoring policies on Cisco ACI fabrics (mon:EPGPol)
aci_epg_to_contract Bind EPGs to Contracts on Cisco ACI fabrics (fv:RsCons and fv:RsProv)
aci_epg_to_domain Bind EPGs to Domains on Cisco ACI fabrics (fv:RsDomAtt)
aci_filter Manages top level filter objects on Cisco ACI fabrics (vz:Filter)
aci_filter_entry Manage filter entries on Cisco ACI fabrics (vz:Entry)
aci_intf_policy_fc Manage Fibre Channel interface policies on Cisco ACI fabrics (fc:IfPol)
aci_intf_policy_l2 Manage Layer 2 interface policies on Cisco ACI fabrics (l2:IfPol)
aci_intf_policy_lldp Manage LLDP interface policies on Cisco ACI fabrics (lldp:IfPol)
aci_intf_policy_mcp Manage MCP interface policies on Cisco ACI fabrics (mcp:IfPol)
aci_intf_policy_port_channel Manage port channel interface policies on Cisco ACI fabrics (lacp:LagPol)
aci_intf_policy_port_security Manage port security on Cisco ACI fabrics (l2:PortSecurityPol)
aci_l3out_route_tag_policy Manage route tag policies on Cisco ACI fabrics (l3ext:RouteTagPol)
aci_rest Direct access to the Cisco APIC REST API
aci_taboo_contract Manage taboo contracts on Cisco ACI fabrics (vz:BrCP)
aci_tenant Manage tenants on Cisco ACI fabrics (fv:Tenant)
aci_tenant_action_rule_profile Manage action rule profiles on Cisco ACI fabrics (rtctrl:AttrP)
aci_tenant_ep_retention_policy Manage End Point (EP) retention protocol policies on Cisco ACI fabrics (fv:EpRetPol)
aci_tenant_span_dst_group Manage SPAN destination groups on Cisco ACI fabrics (span:DestGrp)
aci_tenant_span_src_group Manage SPAN source groups on Cisco ACI fabrics (span:SrcGrp)
aci_tenant_span_src_group_to_dst_group Manage SPAN source group to destination group bindings on Cisco ACI fabrics (span:SpanLbl)
aci_vrf Manage VRF (private networks aka. contexts) on Cisco ACI fabrics (fv:Ctx)

Ansible 2.4 環境を用意する

Ansible Core に統合された ACI のネットワークモジュールを利用しますので、何れかの手段で Ansible 2.4 環境を用意します。 「pip でインストールする」「Docker イメージを使う」等が簡単だと思います。 ソースコードからインストールしても良いですが、少し手間なので今回は省略しました。

  1. pip でインストールする
  2. Docker イメージを使う

pip でインストールする

pip が使えるのであれば、殆どの場合は簡単にインストール出来ると思います。 現時点では 2.4.0 がインストールされました。

pip install ansible

Docker イメージを使う

先日、Ansible 2.4 の Docker イメージを作ったので、これを使います。

docker run -it --name docker-ansible sig9/docker-ansible

Playbook 等を用意する

Ansible 2.4 環境が用意出来たら Playbook や hosts ファイルを用意します。

hosts

hosts ファイルは以下の内容で作成しました。 今回はあくまで検証 なので、ユーザ名とパスワードは平文でべた書きしました。

[apic]
10.0.0.1

[apic:vars]
user = admin
pass = password

Playbook

続いて Playbook を用意します。 今回は common テナントに複数の Filter を作成する、というサンプルにします。 具体的には以下の Filter を作成します。 あくまでテストなので「Ansible によって作成された」ことが明確に分かるよう、Filter 名の先頭には「Ansible_」を付与しています。

  1. Ansible_DNS
  2. Ansible_ICMP
    • ICMPv4
  3. Ansible_SSH
  4. Ansible_WEB

具体的な Playbook の内容は以下の通りです。 今回は playbook.yml というファイル名にしました。

---

- name: Playbook to create common filters.
  hosts: apic
  connection: local
  gather_facts: no

  tasks:
    - aci_filter:
        name={{ item }}
        tenant=common
        host={{ inventory_hostname }}
        username={{ user }}
        password={{ pass }}
        validate_certs=False
      with_items:
        - Ansible_DNS

    - aci_filter_entry:
        tenant=common
        filter=Ansible_DNS
        name=DNS
        ether_type=ip
        ip_protocol=udp
        dst_port=53
        state=present
        host={{ inventory_hostname }}
        username={{ user }}
        password={{ pass }}
        validate_certs=False

    - aci_filter:
        name={{ item }}
        tenant=common
        host={{ inventory_hostname }}
        username={{ user }}
        password={{ pass }}
        validate_certs=False
      with_items:
        - Ansible_ICMP

    - aci_filter_entry:
        tenant=common
        filter=Ansible_ICMP
        name=ICMPv4
        ether_type=ip
        ip_protocol=icmp
        state=present
        host={{ inventory_hostname }}
        username={{ user }}
        password={{ pass }}
        validate_certs=False

    - aci_filter:
        name={{ item }}
        tenant=common
        host={{ inventory_hostname }}
        username={{ user }}
        password={{ pass }}
        validate_certs=False
      with_items:
        - Ansible_SSH

    - aci_filter_entry:
        tenant=common
        filter=Ansible_SSH
        name=SSH
        ether_type=ip
        ip_protocol=tcp
        dst_port=22
        state=present
        host={{ inventory_hostname }}
        username={{ user }}
        password={{ pass }}
        validate_certs=False
        
    - aci_filter:
        name={{ item }}
        tenant=common
        host={{ inventory_hostname }}
        username={{ user }}
        password={{ pass }}
        validate_certs=False
      with_items:
        - Ansible_WEB

    - aci_filter_entry:
        tenant=common
        filter=Ansible_WEB
        name=HTTP
        ether_type=ip
        ip_protocol=tcp
        dst_port=80
        state=present
        host={{ inventory_hostname }}
        username={{ user }}
        password={{ pass }}
        validate_certs=False

    - aci_filter_entry:
        tenant=common
        filter=Ansible_WEB
        name=HTTPS
        ether_type=ip
        ip_protocol=tcp
        dst_port=443
        state=present
        host={{ inventory_hostname }}
        username={{ user }}
        password={{ pass }}
        validate_certs=False

Playbook を dry-run してみる

hosts と Playbook が用意出来たら (実際の設定変更はせずに) 仮実行してみます。 所謂、dry-run です。

# ansible-playbook --check -i hosts playbook.yml

PLAY [Playbook to create common filters.] ***********************************************************************

TASK [aci_filter] ***********************************************************************************************
changed: [10.0.0.1] => (item=Ansible_DNS)

TASK [aci_filter_entry] *****************************************************************************************
changed: [10.0.0.1]

TASK [aci_filter] ***********************************************************************************************
changed: [10.0.0.1] => (item=Ansible_ICMP)

TASK [aci_filter_entry] *****************************************************************************************
changed: [10.0.0.1]

TASK [aci_filter] ***********************************************************************************************
changed: [10.0.0.1] => (item=Ansible_SSH)

TASK [aci_filter_entry] *****************************************************************************************
changed: [10.0.0.1]

TASK [aci_filter] ***********************************************************************************************
changed: [10.0.0.1] => (item=Ansible_WEB)

TASK [aci_filter_entry] *****************************************************************************************
changed: [10.0.0.1]

TASK [aci_filter_entry] *****************************************************************************************
changed: [10.0.0.1]

PLAY RECAP ******************************************************************************************************
10.0.0.1               : ok=9    changed=9    unreachable=0    failed=0

エラーが発生することも無く、完了しました。

Playbook を実行する

dry-run が上手くいったので、いよいよ実行 (設定変更) してみます。 以下のように実行します。

ansible-playbook -i hosts playbook.yml

実際の実行例は以下の通りです。

# ansible-playbook -i hosts playbook.yml

PLAY [Playbook to create common filters.] ******************************************************************

TASK [aci_filter] ******************************************************************************************
changed: [10.0.0.1] => (item=Ansible_DNS)

TASK [aci_filter_entry] ************************************************************************************
changed: [10.0.0.1]

TASK [aci_filter] ******************************************************************************************
changed: [10.0.0.1] => (item=Ansible_ICMP)

TASK [aci_filter_entry] ************************************************************************************
changed: [10.0.0.1]

TASK [aci_filter] ******************************************************************************************
changed: [10.0.0.1] => (item=Ansible_SSH)

TASK [aci_filter_entry] ************************************************************************************
changed: [10.0.0.1]

TASK [aci_filter] ******************************************************************************************
changed: [10.0.0.1] => (item=Ansible_WEB)

TASK [aci_filter_entry] ************************************************************************************
changed: [10.0.0.1]

TASK [aci_filter_entry] ************************************************************************************
changed: [10.0.0.1]

PLAY RECAP *************************************************************************************************
10.0.0.1               : ok=9    changed=9    unreachable=0    failed=0

作成された Filter

作成された Filter を Web UI から確認すると以下のように表示されました。

f:id:sig9:20170921110754p:plain

参考