In my previous ACI automation post, I used Terraform and the credentials were in plain text inside the main.tf file.
I have updated this, so the credentials are stored in GitLab environment variables, which is a much more secure method. The process of the credentials from GitLab to Terraform are as follows;
Create Environment Variables
The environment variables are key/value pairs located under: <Project> >> Settings >> CI/CD >> Variables


Import Variables to GitLab CI File
The .gitlab-ci.yml file will have the variables imported. It will then pass them to each stage by default.
Each variable must be prefixed with TF_VAR_. When passed to Terraform, it will ignore this and just keep the value name.
| 0 1 2 3 4 | variables:   TF_VAR_ACI_PASS: $ACI_PASS   TF_VAR_ACI_USER: $ACI_USER | 
| 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | # To contribute improvements to CI/CD templates, please follow the Development guide at: # https://docs.gitlab.com/ee/development/cicd/templates.html # This specific template is located at: # https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.gitlab-ci.yml include:   - template: Terraform/Base.gitlab-ci.yml  # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Terraform/Base.gitlab-ci.yml   - template: Jobs/SAST-IaC.gitlab-ci.yml   # https://gitlab.com/gitlab-org/gitlab/blob/master/lib/gitlab/ci/templates/Jobs/SAST-IaC.gitlab-ci.yml variables:   TF_VAR_ACI_PASS: $ACI_PASS   TF_VAR_ACI_USER: $ACI_USER stages:   - validate   - test   - build   - deploy   - cleanup fmt:   extends: .terraform:fmt   needs: [] | 
Stages can ignore the variables provided by using a blank variables key. Documentation reference.
| 0 1 2 3 4 5 6 7 8 | variables:   GLOBAL_VAR: "A global variable" job1:   variables: {}   script:     - echo This job does not need any variables | 
Import Variables in Terraform
To import the variables into Terraform, the prefixed TF_VAR_ must be removed and a variable must be declared in terraform.
| 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | terraform {   required_providers {     aci = {       source = "ciscodevnet/aci"     }   } } variable "ACI_USER" {   type = string } variable "ACI_PASS" {   type = string } #configure provider with your cisco aci credentials. provider "aci" {   # cisco-aci user name   username = var.ACI_USER   # cisco-aci password   password = var.ACI_PASS   # cisco-aci url   url      = "https://10.10.20.14"   insecure = true } | 
