Przejdź do treści

VSCODE - Developowanie projektów terraform z użyciem kontenera

Niniejszy wpis stanowi kontynuację poprzedniego artykułu: VS Code – Automatyczne uruchamianie kontenera MkDocs przy starcie projektu

Info

W tym materiale omówiono, jak skonfigurować środowisko Visual Studio Code do pracy z projektami Terraform w kontenerze Docker, w tym:

  • automatyczne pobieranie tagów obrazu Dockera z GitLab Container Registry,
  • uruchamianie planów Terraform z poziomu kontenera,
  • bezpieczne uwierzytelnianie przy użyciu klucza SSH i dostępu do prywatnych modułów.

🎯 Założenia

Skrypty dodane repozytorium proxmox

Główne założenia to:

  • Uruchamianie taska, który zrobi terraform validate
  • Uruchamianie taska, który zrobi terraform plan
  • Uruchamianie taska, który zrobi terraform apply

⚙️ Konfiguracja pliku tasks.json

W folderze .vscode projektu należy utworzyć (lub edytować) plik tasks.json o następującej zawartości:

{
  "version": "2.0.0",
  "tasks": [
    {
      "label": "Update Docker Tags",
      "type": "shell",
      "command": "bash ${workspaceFolder}/scripts/vscode_tasks_update_docker_tags.bash",
      "runOptions": {
        "runOn": "folderOpen"
      },
      "problemMatcher": []
    },
    {
      "label": "terraform validate",
      "type": "shell",
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "--name",
        "terraform-dev",
        "-u",
        "root",
        "-v",
        "${workspaceFolder}:/terraform",
        "-v",
        "~/.ssh/gitlab-runner:/root/.ssh/gitlab-runner",
        "-v",
        "~/.profile:/root/.profile",
        "-v",
        "~/.gitconfig:/root/.gitconfig",
        "${input:dockerImage}",
        "bash",
        "-c",
        "cd /terraform && bash /terraform/scripts/terraform_validate.sh"
      ],
      "problemMatcher": [],
      "presentation": {
        "echo": true,
        "reveal": "always",
        "focus": true,
        "panel": "shared"
      }
    },
    {
      "label": "terraform plan",
      "type": "shell",
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "--name",
        "terraform-dev",
        "-u",
        "root",
        "-v",
        "${workspaceFolder}:/terraform",
        "-v",
        "~/.ssh/gitlab-runner:/root/.ssh/gitlab-runner",
        "-v",
        "~/.profile:/root/.profile",
        "-v",
        "~/.gitconfig:/root/.gitconfig",
        "${input:dockerImage}",
        "bash",
        "-c",
        "cd /terraform && bash /terraform/scripts/terraform_plan.sh"
      ],
      "problemMatcher": [],
      "presentation": {
        "echo": true,
        "reveal": "always",
        "focus": true,
        "panel": "shared"
      }
    },
    {
      "label": "terraform apply",
      "type": "shell",
      "command": "docker",
      "args": [
        "run",
        "--rm",
        "--name",
        "terraform-dev",
        "-u",
        "root",
        "-v",
        "${workspaceFolder}:/terraform",
        "-v",
        "~/.ssh/gitlab-runner:/root/.ssh/gitlab-runner",
        "-v",
        "~/.profile:/root/.profile",
        "-v",
        "~/.gitconfig:/root/.gitconfig",
        "${input:dockerImage}",
        "bash",
        "-c",
        "cd /terraform && bash /terraform/scripts/terraform_apply.sh"
      ],
      "problemMatcher": [],
      "presentation": {
        "echo": true,
        "reveal": "always",
        "focus": true,
        "panel": "shared"
      }
    }
  ],
  "inputs": [
    {
      "id": "dockerImage",
      "type": "pickString",
      "description": "Wybierz obraz Dockera",
      "options": [
        "registry.gitlab.com/pl.rachuna-net/containers/terraform:1.0.0",
        "registry.gitlab.com/pl.rachuna-net/containers/terraform:1.0.1"
      ],
      "default": "registry.gitlab.com/pl.rachuna-net/containers/terraform:1.0.1"
    }
  ]
}


📟 Skrypty

Przykładowy skrypt scripts/terraform_validate.sh

#!/bin/bash
source .env
source ~/.profile

CI_SERVER_URL="https://gitlab.com"
CI_PROJECT_ID="69335832"
CI_USERNAME="${GITLAB_USER}"
CI_JOB_TOKEN="${GITLAB_TOKEN}"
TF_STATE_NAME="default"

# Terraform init
echo "🔗 Terraform init"
terraform init \
  -backend-config="address=${CI_SERVER_URL}/api/v4/projects/${CI_PROJECT_ID}/terraform/state/${TF_STATE_NAME}" \
  -backend-config="lock_address=${CI_SERVER_URL}/api/v4/projects/${CI_PROJECT_ID}/terraform/state/${TF_STATE_NAME}/lock" \
  -backend-config="unlock_address=${CI_SERVER_URL}/api/v4/projects/${CI_PROJECT_ID}/terraform/state/${TF_STATE_NAME}/lock" \
  -backend-config="username=${CI_USERNAME}" \
  -backend-config="password=${CI_JOB_TOKEN}" \
  -backend-config="lock_method=POST" \
  -backend-config="unlock_method=DELETE" \
  -backend-config="retry_wait_min=5"

echo "🕵 terraform fmt"
terraform fmt -recursive

echo "✅ terraform validate"
terraform validate