Przejdź do treści

VSCODE - Developowanie projektów packer 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 Packer 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 ubuntu

Główne założenia to:

  • Uruchamianie taska, który zrobi Update Docker Tags
  • Uruchamianie taska, który zrobi [PACKER] Packer fmt
  • Uruchamianie taska, który zrobi [PACKER] Packer validate
  • Uruchamianie taska, który zrobi [PACKER] Packer build

⚙️ 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": "[PACKER] Packer fmt",
      "type": "shell",
      "command": "docker run --rm --name packer-dev -u root -v ${workspaceFolder}:/packer -v ~/.profile:/root/.profile ${input:packer_image} bash -c 'cd /packer && bash /packer/scripts/packer_fmt.bash'",
      "args": [],
      "problemMatcher": [],
      "presentation": {
        "echo": true,
        "reveal": "always",
        "focus": true,
        "panel": "shared"
      }
    },
    {
      "label": "[PACKER] Packer validate",
      "type": "shell",
      "command": "docker run --rm --name packer-dev -u root -v ${workspaceFolder}:/packer -v ~/.profile:/root/.profile ${input:packer_image} bash -c 'cd /packer && bash /packer/scripts/packer_validate.bash'",
      "args": [],
      "problemMatcher": [],
      "presentation": {
        "echo": true,
        "reveal": "always",
        "focus": true,
        "panel": "shared"
      }
    },
    {
      "label": "[PACKER] Packer build",
      "type": "shell",
      "command": "docker run --rm --name packer-dev -u root -v ${workspaceFolder}:/packer -v ~/.profile:/root/.profile ${input:packer_image} bash -c 'cd /packer && bash /packer/scripts/packer_build.bash'",
      "args": [],
      "problemMatcher": [],
      "presentation": {
        "echo": true,
        "reveal": "always",
        "focus": true,
        "panel": "shared"
      }
    },
  ],
  "inputs": [
    {
      "id": "packer_image",
      "type": "pickString",
      "description": "Wybierz obraz Dockera",
      "options": [
        "registry.gitlab.com/pl.rachuna-net/containers/packer:1.0.0",
        "registry.gitlab.com/pl.rachuna-net/containers/packer:1.0.1"
      ],
      "default": "registry.gitlab.com/pl.rachuna-net/containers/packer:1.0.1"
    },
  ]
}


💲 Env

.env

#!/usr/bin/env bash

export PACKER_PROJECT_ID="69245188"
export PACKER_REGISTRY_ID="8589299"
export CONTAINER_PROJECT_ID=$PACKER_PROJECT_ID
export CONTAINER_REGISTRY_ID=$PACKER_REGISTRY_ID

export PACKER_LOG=1

#### PROXMOX CLUSTER VARIABLES ####
export PKR_VAR_proxmox_node_name="xxx"
export PKR_VAR_proxmox_api_username="root@pam"
export PKR_VAR_proxmox_api_password="xxx"
export PKR_VAR_proxmox_api_tls_verify="false"

### ISO VARIABLES ###
export PKR_VAR_iso_storage_pool="local"

### VM VARIABLES ###
export PKR_VAR_vm_id="901"
export PKR_VAR_ssh_username="xxx"
export PKR_VAR_ssh_password="xxx"
export PKR_VAR_ssh_public_key="ssh..."


📟 Skrypty

Przykładowy skrypt scripts/packer_fmt.bash

#!/usr/bin/env bash

set -euxo pipefail
source .env


packer init .
for file in $(find pkrvars -type f -name "*.hcl"); do
    # walidacja pod kątem formatowania
    packer fmt -var-file=$file .
done

Przykładowy skrypt scripts/packer_validate.bash

#!/usr/bin/env bash

set -euxo pipefail
source .env


packer init .
for file in $(find pkrvars -type f -name "*.hcl"); do
    # walidacja pod kątem semantyki
    packer validate -var-file=$file .
done

Przykładowy skrypt scripts/packer_build.bash

#!/usr/bin/env bash

set -euxo pipefail
source .env


packer init .
for file in $(find pkrvars -type f -name "*.hcl"); do
    # Create a new vm template
    packer build -var-file=$file .
done

Przykładowy skrypt scripts/vscode_tasks_update_docker_tags.bash

#!/usr/bin/env bash

set -euo pipefail
source ~/.profile
source .env

OUTPUT_FILE=".vscode/tasks.json"
AUTH_HEADER="PRIVATE-TOKEN: $GITLAB_TOKEN"

# Pobierz listę tagów z rejestru
TEST_CURL=$(curl -s -H "$AUTH_HEADER" "https://gitlab.com/api/v4/projects/${CONTAINER_PROJECT_ID}/registry/repositories/${CONTAINER_REGISTRY_ID}/tags")
echo $TEST_CURL

TAGS=$(curl -s -H "$AUTH_HEADER" "https://gitlab.com/api/v4/projects/${CONTAINER_PROJECT_ID}/registry/repositories/${CONTAINER_REGISTRY_ID}/tags" | jq '[.[].location]')

# Sprawdź, czy pobrano tagi
if [ -z "$TAGS" ]; then
  echo "Nie udało się pobrać tagów z rejestru. Upewnij się, że token jest poprawny i masz dostęp do projektu."
  exit 1
fi


cat .vscode/tasks.json
jq --argjson tags "$TAGS" \
  '.inputs[0].options = $tags | .inputs[0].default = $tags[$tags | length - 1]' \
  .vscode/tasks.json > tmp.json && mv tmp.json .vscode/tasks.json