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 イメージを使う」等が簡単だと思います。 ソースコードからインストールしても良いですが、少し手間なので今回は省略しました。
- pip でインストールする
- 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 によって作成された」ことが明確に分かるよう、MARKDOWN_HASHd7778d0c64b6ba21494c97f77a66885aMARKDOWNHASH
名の先頭には「Ansible」を付与しています。
- Ansible_DNS
- 53/UDP
- Ansible_ICMP
- ICMPv4
- Ansible_SSH
- 22/TCP
- Ansible_WEB
- 80/TCP
- 443/TCP
具体的な 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 から確認すると以下のように表示されました。
コメント