Terraform module for deploying Cisco ACI tenants
Tenant
├── VRFs
├── Bridge domains and subnets
├── Application profiles
├── EPGs
├── Contracts
├── Filter and Filter entries
└── Contract bindings
When executing terraform init, the module will install automatically.
Copy and paste into your Terraform configuration, insert the variables, and run terraform init:
module "tenant" { source = "insobi/tenant/aci" # insert required variables here }
Single tenant deployment
module "aci_tenants" { source = "insobi/tenant/aci" tenant = { name = "tenant3" } vrfs = { TEST1-VRF = {} TEST2-VRF = {} } bridge_domains = { TEST1-BD = { vrf = "TEST1-VRF" } TEST2-BD = { vrf = "TEST1-VRF" } TEST3-BD = { vrf = "TEST2-VRF" } TEST4-BD = { vrf = "TEST2-VRF" } } subnets = { TEST1-SN = { bd = "TEST1-BD", ip = "10.225.3.1/24", scope = ["public"] } TEST2-SN = { bd = "TEST2-BD", ip = "10.225.4.1/24", scope = ["public"] } TEST3-SN = { bd = "TEST3-BD", ip = "10.225.5.1/24", scope = ["public"] } TEST4-SN = { bd = "TEST4-BD", ip = "10.225.6.1/24", scope = ["public"] } } app_profiles = { ap1 = { name = "TEST-AP" } } epgs = { TEST1-EPG = { bd = "TEST1-BD", ap = "TEST-AP", domain = "uni/phys-TEST" } TEST2-EPG = { bd = "TEST2-BD", ap = "TEST-AP", domain = "uni/phys-TEST" } TEST3-EPG = { bd = "TEST3-BD", ap = "TEST-AP", domain = "uni/phys-TEST" } TEST4-EPG = { bd = "TEST4-BD", ap = "TEST-AP", domain = "uni/phys-TEST" } TEST5-EPG = { bd = "TEST4-BD", ap = "TEST-AP", domain = "uni/phys-TEST" } } filters = { any = {} ssh = {} web = {} } filter_entries = { any = { filter_name = "any", name = "any", dest_from_port = "unspecified", dest_to_port = "unspecified", ether_type = "unspecified", protocol = "unspecified" }, # unspecified icmp igmp tcp egp igp udp icmpv6 eigrp ospfigp pim l2tp ssh = { filter_name = "ssh", name = "ssh", dest_from_port = "22", dest_to_port = "22", ether_type = "ipv4", protocol = "tcp" }, web1 = { filter_name = "web", name = "http", dest_from_port = "80", dest_to_port = "80", ether_type = "ipv4", protocol = "tcp" }, web2 = { filter_name = "web", name = "https", dest_from_port = "443", dest_to_port = "443", ether_type = "ipv4", protocol = "tcp" } } contracts = { any = { filter = ["any"] } ssh = { filter = ["ssh"] } http = { filter = ["http", "https"] } } contract_bindings = { TEST1-EPG-P-1 = { epg = "TEST1-EPG", contract_type = "provider", contract = "any" }, TEST2-EPG-P-1 = { epg = "TEST2-EPG", contract_type = "provider", contract = "ssh" }, TEST3-EPG-P-1 = { epg = "TEST3-EPG", contract_type = "provider", contract = "ssh" }, TEST4-EPG-P-1 = { epg = "TEST4-EPG", contract_type = "provider", contract = "ssh" }, TEST5-EPG-P-1 = { epg = "TEST5-EPG", contract_type = "provider", contract = "ssh" }, TEST5-EPG-P-2 = { epg = "TEST5-EPG", contract_type = "provider", contract = "ssh" }, TEST1-EPG-C-1 = { epg = "TEST1-EPG", contract_type = "consumer", contract = "any" }, TEST2-EPG-C-1 = { epg = "TEST2-EPG", contract_type = "consumer", contract = "any" }, TEST3-EPG-C-1 = { epg = "TEST3-EPG", contract_type = "consumer", contract = "any" }, TEST4-EPG-C-1 = { epg = "TEST4-EPG", contract_type = "consumer", contract = "any" }, TEST5-EPG-C-1 = { epg = "TEST5-EPG", contract_type = "consumer", contract = "any" } } }
Multiple tenants deployment
module "aci_tenants" { source = "insobi/tenant/aci" for_each = var.tenants tenant = each.value.tenant vrfs = contains(keys(each.value), "vrfs") ? each.value.vrfs : {} bridge_domains = contains(keys(each.value), "bridge_domains") ? each.value.bridge_domains : {} subnets = contains(keys(each.value), "subnets") ? each.value.subnets : {} app_profiles = contains(keys(each.value), "app_profiles") ? each.value.app_profiles : {} epgs = contains(keys(each.value), "epgs") ? each.value.epgs : {} aci_domain = contains(keys(each.value), "aci_domain") ? each.value.aci_domain : null filters = contains(keys(each.value), "filters") ? each.value.filters : {} filter_entries = contains(keys(each.value), "filter_entries") ? each.value.filter_entries : {} contracts = contains(keys(each.value), "contracts") ? each.value.contracts : {} contract_bindings = contains(keys(each.value), "contract_bindings") ? each.value.contract_bindings : {} }
Example of variable
tenants = {
tn1 = {
tenant = { name = "Tenant1" }
vrfs = { ... }
...
}
tn2 = {
tenant = { name : "Tenant2" }
vrfs = { ... }
...
}
...
}
Name | Version |
---|---|
terraform | >= 0.13.4 |
aci | >= 4.1 |
Name | Version |
---|---|
aci | >= 2.1.0 |
Name | Description | Type | Default | Required |
---|---|---|---|---|
tenant | ACI Tenant | map(object({ |
n/a | yes |
vrfs | VRFs | map(object({ |
{} |
no |
bridge_domains | Bridge domains | map(object({ |
{} |
no |
subnets | Subnets | map(object({ |
{} |
no |
app_profile | Application profiles | map(object({ |
{} |
no |
epgs | EPGs | map(object({ |
{} |
no |
filters | Filters | map(object({ |
{} |
no |
filter_entries | Filter entries | map(object({ |
{} |
no |
contracts | Contracts | map(object({ |
{} |
no |
contract_bindings | Contract bindings | map(object({ |
{} |
no |
Name | Description |
---|---|
tenant | ID of Tenant |
vrf | IDs of VRF |
bd | IDs of Bridge domain |
subnet | IDs of Subnet |
ap | IDs of Application profiles |
epg | IDs of EPG |
filter | IDs of Filter |
entry | IDs of Filter entry |
contract | IDs of Contract |
epg_contract | IDs of Contract binding |
domain | IDs of ACI Domain |
Name | Type |
---|---|
aci_tenant | resource |
aci_vrf | resource |
aci_bridge_domain | resource |
aci_subnet | resource |
aci_application_profile | resource |
aci_application_epg | resource |
aci_filter | resource |
aci_filter_entry | resource |
aci_contract | resource |
aci_epg_to_contract | resource |
aci_epg_to_domain | resource |
Owner
Contributors
Categories
Products
Application Centric Infrastructure (ACI)Programming Languages
HCLLicense
Code Exchange Community
Get help, share code, and collaborate with other developers in the Code Exchange community.View Community