Cisco ACI では通信させたい EPG 同士を Contract で接続するのが基本です。 しかし、Contract へ接続していても、例外設定をすることで指定した EPG を「Contract 制御の対象外」にすることが出来ます。 今回は 5.0(2h) で検証を実施しました。
尚、今回は Contract に例外設定をしていますが、Subject に例外設定を行うことも可能です。 また、今回の検証では EPG 名で例外設定を行っていますが、Tag を活用して例外設定を行った方がメリットがあるケースもあろうかと思われます (Contract 例外設定に限らず、Tag の設定は「Tag を理解し、活用出来る設計になっている」必要があります)。
また、後述しますが vzAny と Contract 例外設定を組み合わせることは出来ないようです。 これが可能であれば、より有益な機能だと思われるのですが…
検証の前提
下記の設定を前提に検証しています。
tenant Tenant1
access-list Any
match raw Entry1
exit
contract Contract1
subject Subject1
access-group Any both
exit
exit
vrf context Vrf1
exit
bridge-domain Bd11
arp flooding
vrf member Vrf1
exit
bridge-domain Bd21
arp flooding
vrf member Vrf1
exit
bridge-domain Bd22
arp flooding
vrf member Vrf1
exit
bridge-domain Bd31
arp flooding
vrf member Vrf1
exit
application Ap1
epg Epg11
bridge-domain member Bd11
contract consumer Contract1
set qos-class level3
exit
epg Epg21
bridge-domain member Bd21
contract provider Contract1
set qos-class level3
exit
epg Epg22
bridge-domain member Bd22
contract provider Contract1
set qos-class level3
exit
epg Epg31
bridge-domain member Bd31
contract provider Contract1
set qos-class level3
exit
exit
interface bridge-domain Bd11
ip address 10.0.1.254/24 scope public
exit
interface bridge-domain Bd21
ip address 10.0.2.254/24 scope public
exit
interface bridge-domain Bd22
ip address 10.0.3.254/24 scope public
exit
interface bridge-domain Bd31
ip address 10.0.4.254/24 scope public
exit
exit
例外無しパターン
例外を設定しない、通常の状態を確認します。
この場合、Zoning-rule は下記のように表示されます。 例外設定をしていない為、Epg11 から Epg21, 22, 31 宛の全ての Permit ルールが存在することが分かります。
leaf# contract_parser.py --sepg tn-Tenant1/ap-Ap1/epg-Epg11
Key:
[prio:RuleId] [vrf:{str}] action protocol src-epg [src-l4] dst-epg [dst-l4] [flags][contract:{str}] [hit=count]
[9:4152] [vrf:Tenant1:Vrf1] permit any tn-Tenant1/ap-Ap1/epg-Epg11(16388) tn-Tenant1/ap-Ap1/epg-Epg22(16389) [contract:uni/tn-Tenant1/brc-Contract1] [hit=0]
[9:4134] [vrf:Tenant1:Vrf1] permit any tn-Tenant1/ap-Ap1/epg-Epg11(16388) tn-Tenant1/ap-Ap1/epg-Epg31(16390) [contract:uni/tn-Tenant1/brc-Contract1] [hit=0]
[9:4135] [vrf:Tenant1:Vrf1] permit any tn-Tenant1/ap-Ap1/epg-Epg11(16388) tn-Tenant1/ap-Ap1/epg-Epg21(49156) [contract:uni/tn-Tenant1/brc-Contract1] [hit=?]
ひとつの EPG を例外にするパターン
次は「ひとつの EPG だけ、例外にする」パターンを考えます。
Contract にある Contract Exception
に例外とするルールの設定を行います。 Type
には DN
、VRF
、Tenant
、EPG
、Tag
などを選択可能です。 Consumer Regex
と Provider Regex
には、各々 Consumer / Provider 側になる設定を行います。 この際、「空欄は何れにも一致しない」 を意味する点に留意します。 ここでは「Epg11 → Epg21 は例外にする (Contract 処理をしない)」という設定にしました。
この設定を実施した上で Zoning-rule を確認すると「Epg11 → Epg21」が存在しなくなっていることが分かります。
leaf# contract_parser.py --sepg tn-Tenant1/ap-Ap1/epg-Epg11
Key:
[prio:RuleId] [vrf:{str}] action protocol src-epg [src-l4] dst-epg [dst-l4] [flags][contract:{str}] [hit=count]
[9:4152] [vrf:Tenant1:Vrf1] permit any tn-Tenant1/ap-Ap1/epg-Epg11(16388) tn-Tenant1/ap-Ap1/epg-Epg22(16389) [contract:uni/tn-Tenant1/brc-Contract1] [hit=0]
[9:4134] [vrf:Tenant1:Vrf1] permit any tn-Tenant1/ap-Ap1/epg-Epg11(16388) tn-Tenant1/ap-Ap1/epg-Epg31(16390) [contract:uni/tn-Tenant1/brc-Contract1] [hit=0]
複数の EPG を例外にするパターン
例外設定には正規表現を利用出来る為、「ひとつのルールで複数の EPG (等) を例外設定する」ことが可能です。
例えば Provider 側に「Epg2 で始まるものを除外する (例. Epg21, Epg22, Epg23…) という場合、Provider Regex
に Epg2.*
と設定します。
この設定を実施した上で Zoning-rule を確認すると「Epg11 → Epg21」と「Epg11 → Epg22」が存在しなくなっていることが分かります。
leaf# contract_parser.py --sepg tn-Tenant1/ap-Ap1/epg-Epg11
Key:
[prio:RuleId] [vrf:{str}] action protocol src-epg [src-l4] dst-epg [dst-l4] [flags][contract:{str}] [hit=count]
[9:4134] [vrf:Tenant1:Vrf1] permit any tn-Tenant1/ap-Ap1/epg-Epg11(16388) tn-Tenant1/ap-Ap1/epg-Epg31(16390) [contract:uni/tn-Tenant1/brc-Contract1] [hit=0]
vzAny と組み合わせることは出来ない
仮に Contract の例外設定を vzAny と組み合わせた場合を考えます。
vzAny 設定なので、VRF には以下のように Contract が設定されているものとします。
この際、vzAny による Zoning-rule は以下のように設定されます。
[16:4140] [vrf:Tenant1:Vrf1] permit arp epg:any epg:any [contract:implicit] [hit=0]
[21:4151] [vrf:Tenant1:Vrf1] permit any epg:any epg:any [contract:uni/tn-Tenant1/brc-Contract1] [hit=0]
この Zoning-rule を見ると分かるのですが、vzAny は (当然と言えば当然ですが) EPG 名を特定せず、any
として設定されています。 この影響なのか、Contract の例外設定で EPG 名を指定しても例外として扱うことが出来ません。 今回は EPG 名で例外設定しようとしたのですが、例えば Tag で例外設定しようとしても「vzAny では例外に出来ない」という点は変わらないようです。
コメント