I blogg #6 av CCIE Automation-reisen tar jeg i bruk Terraform, Vault og GitLab CI for å automatisere utrulling av Cisco ACI. Ved å kombinere infrastructure as code, sikker håndtering av secrets og pipeline-basert orkestrering bygges en repeterbar og tilstandsbasert løsning for nettverksprovisjonering.
![<span id="hs_cos_wrapper_name" class="hs_cos_wrapper hs_cos_wrapper_meta_field hs_cos_wrapper_type_text" style="" data-hs-cos-general-type="meta_field" data-hs-cos-type="text" >[Min reise mot CCIE Automation #6] Automatisering av Cisco ACI-utrulling med Terraform, Vault og GitLab CI</span>](https://sicra.no/hs-fs/hubfs/two_guys_working_on_a_computer.jpg?width=1024&height=576&name=two_guys_working_on_a_computer.jpg)
(Denne artikkelen var tidligere en del av Bluetree.no. Siden Sicra og Bluetree har slått seg sammen, er nå innhold fra Bluetree overført til Sicra.)
[Min reise mot CCIE Automation #6] Automatisering av Cisco ACI-utrulling med Terraform, Vault og GitLab CI er del av en serie som dokumenterer min reise mot CCIE Automation. I forrige innlegg jobbet jeg med pipelines for verifisering og utrulling av nettverksendringer. I dette innlegget fokuserer jeg på å automatisere Cisco ACI-utrulling ved hjelp av Terraform og Vault.
Etter å ha jobbet med pyATS og CI/CD i blogg #5 ønsket jeg å gå dypere inn i infrastructure as code ved hjelp av Terraform, og integrere dette med GitLab CI.
Denne gangen utforsket jeg Terraform for å utrulle og administrere Cisco ACI fabric-ressurser på en tilstandsbasert og repeterbar måte, og integrerte Vault for å håndtere secrets i Nautix-applikasjonen min.
Terraform lar oss beskrive infrastruktur deklarativt. Det er godt egnet til blant annet:
Administrasjon av ACI tenants, VRF-er og EPG-er som kode
Automatisk håndtering av avhengigheter mellom ressurser
Sporing av state for å vite nøyaktig hva som er utrullet
Bruk av løkker og variabler for repeterbare, parameteriserte utrullinger
Sikker håndtering av secrets (Vault)
I stedet for å pushe konfigurasjon manuelt, lar Terraform koden forstå og administrere nettverkets tilstand.
Vault gir en sikker måte å håndtere secrets og legitimasjon i automatiseringspipelines.
I dette prosjektet brukes Vault til å:
Lagre ACI-brukernavn og passord sikkert
Levere legitimasjon dynamisk til Terraform uten hardkoding
Rotere secrets uten å måtte endre kode
Kontrollere tilgang til sensitiv informasjon per miljø eller tjeneste
I stedet for å lagre legitimasjon i .tfvars eller Git, sørger Vault for at secrets ikke lekker, samtidig som automatiseringspipelines får tilgang til det de trenger.
Jeg opprettet et Terraform-prosjekt for å utrulle ACI-ressurser, integrert i GitLab CI:
Variables (aci.auto.tfvars) – sentraliserte definisjoner for tenants, VRF-er, applikasjonsprofiler og endpoint groups
GitLab CI (.gitlab-ci.yml) – orkestrerer Terraform-kjøringer i en pipeline
Vault-tjeneste – Docker Compose-fil som starter Vault og andre nødvendige tjenester lokalt
Med nødvendige JOB_METHOD- og miljøvariabler.

Kjøres automatisk hvis JOB_METHOD er satt til "terraform".
Initialiserer Terraform
Genererer en plan-fil (tfplan) som viser hva som skal opprettes eller oppdateres


Denne stegdelte tilnærmingen sikrer trygge utrullinger og gir mulighet til å gjennomgå endringer før de tas i bruk.
Mappestrukturen ser slik ut:
pipelines/jobs/setup_aci/
main.tf – Terraform-ressurser, løkker og avhengigheter
aci.auto.tfvars – variabler og legitimasjon for ACI-utrulling
I tillegg er følgende filer oppdatert:
.gitlab-ci.yml – orkestrerer Terraform i CI/CD-pipelinen
docker-compose.yml – starter Vault og andre tjenester for lokal testing
La oss gå gjennom det steg for steg.
Filen .gitlab-ci.yml binder arbeidsflyten sammen og bestemmer hvilke steg som kjøres basert på JOB_METHOD-variabelen.




Prosjektet består av main.tf og aci.auto.tfvars.





Endpoint groups
VRF-er
En ny Vault-tjeneste er lagt til i Docker Compose-filen for å levere sikker legitimasjon til Nautix, uten å eksponere den i kode.

I stedet for å konfigurere ACI manuelt får vi nå:
Repeterbare og versjonskontrollerte utrullinger
Enkel skalering ved hjelp av løkker og variabler
Beskyttede secrets med Vault
Automatisk håndtering av avhengigheter mellom tenants, VRF-er og EPG-er
Sikker infrastrukturadministrasjon med Terraform og GitLab CI
.webp?width=1243&height=1246&name=image-png-Sep-18-2025-08-11-55-2259-AM%20(1).webp)
I blogg #7 vil jeg fokusere på model-driven telemetry:
Blueprint item 3.4 Designe en model-driven telemetry-løsning basert på gitte forretningsmessige og tekniske krav ved bruk av gNMI dial-in, gRPC dial-out og NETCONF dial-in
Blueprint item 3.5 Opprette YANG model-driven telemetry-abonnementer
3.5.a Identifisere modelelementer og kadens
3.5.b On-change eller event-drevet
3.5.c Optimalisere frekvens
3.5.d Dial-out abonnement
3.5.e Sikre telemetry-strømmer
3.5.f Bekrefte datatransmisjon
3.5.g Identifisere nettverksproblemer og gjøre endringer
[Min reise mot CCIE Automation #1] Introduksjon + bygging av en Python CLI-applikasjon
[Min reise mot CCIE Automation #2] Inventory REST API og mikrotjenestearkitektur
[Min reise mot CCIE Automation #3] Orchestration API og NETCONF
[Min reise mot CCIE Automation #9] Anvendelse av OWASP Secure Coding Practices
[Min reise mot CCIE Automation #10] Fra Docker Compose til Kubernetes



