This is the multi-page printable view of this section.
Click here to print.
Return to the regular view of this page.
Infrastructure as a Code

Wstęp do Opentofu
Opentofu to narzędzie typu Infrastructure as Code (IaC), które umożliwia definiowanie, provisionowanie i zarządzanie infrastrukturą za pomocą plików konfiguracyjnych. Dzięki Terraform możesz w sposób deklaratywny opisywać zasoby, takie jak serwery, sieci czy usługi w chmurze, a następnie automatycznie je tworzyć, modyfikować i usuwać, zapewniając spójność środowisk.
📍
Infrastructure as Code (IaC) to podejście do zarządzania infrastrukturą IT, w którym zasoby są definiowane i utrzymywane za pomocą kodu, a nie manualnych operacji. Jednym z najczęściej wykorzystywanych narzędzi do implementacji IaC jest OpenTofu, rozwijany przez firmę HashiCorp. OpenTofu umożliwia automatyczne tworzenie, aktualizowanie oraz usuwanie zasobów w chmurze i środowiskach lokalnych, na podstawie deklaratywnych plików konfiguracyjnych.
Wdrażając podejście IaC z użyciem OpenTofu, należy przyjąć szereg kluczowych założeń projektowych, które zapewniają bezpieczeństwo, skalowalność oraz powtarzalność środowisk infrastrukturalnych.
Architektura projektu OpenTofu w pl.rachuna-net
# Przykładowy opis struktury projektu
pl.rachuna-net/infrastructure/opentofu
├── gitlab-profile # Documentation
├── home.rachuna-net.pl
├── iac-gitlab # IaC - Gitlab Management by terraform
├── modules # Terraform modules
│ ├── gitlab-group # Terraform module for menagment groups
│ ├── gitlab-project # Terraform module for menagment projects
│ ├── proxmox-container
│ ├── proxmox-download-container
│ ├── proxmox-vm
│ ├── routeros-bonding
│ ├── routeros-bridge
│ ├── routeros-dhcp-server
│ ├── routeros-dns
│ ├── routeros-ethernet
│ ├── routeros-system
│ ├── routeros-vlan
│ ├── vault-pki-cert-ca
│ └── vault-pki-cert-intermediate
├── proxmox
├── router.rachuna-net.pl
└── vault
Założenia projektów Infrastructure as a Code
Infrastructure as Code (IaC) to podejście do zarządzania infrastrukturą IT, w którym:
- zasoby są definiowane i utrzymywane za pomocą kodu, a nie manualnych operacji.
- automatyczne tworzenie, aktualizowanie oraz usuwanie zasobów w chmurze i środowiskach lokalnych, na podstawie deklaratywnych plików konfiguracyjnych.
Wdrażając podejście IaC z użyciem OpenTofu, należy przyjąć szereg kluczowych założeń projektowych, które zapewniają bezpieczeństwo, skalowalność oraz powtarzalność środowisk infrastrukturalnych.
1 - Lista konfiguracji

Lista konfiguracji
Poniżej znajduje się lista projektów Infrastructure as a Code.
project |
version |
description |
iac-gitlab |
 |
IAC do zarządzania środowiskiem GitLab. |
1.1 - IAC-gitlab

IAC do zarządzania środowiskiem GitLab.
Repozytorum: iac-gitlab
Repozytorium zawierające infrastrukturę jako kod (IaC) do zarządzania środowiskiem GitLab przy użyciu OpenTofu. Umożliwia automatyzację tworzenia, konfiguracji i utrzymania zasobów GitLab.
1.1.1 - Grupy repozytoriów

Tworzenie grupy repozytoriów w GitLab za pomocą OpenTofu

Niniejsza sekcja dokumentacji opisuje proces tworzenia grupy repozytoriów w GitLab przy użyciu OpenTofu. Prezentowane podejście umożliwia automatyczne zarządzanie strukturą repozytoriów, co wspiera podejście Infrastructure as Code (IaC).
Repozytorium GitLab zawierające definicję
🔗 GitLab: pl.rachuna-net/infrastructure/opentofu/iac-gitlab
Repozytorium modułu opentofu - gitlab-group
🔗 GitLab: pl.rachuna-net/infrastructure/opentofu/modules/gitlab-group
Korzyści wynikające z użycia OpenTofu
OpenTofu pozwala na:
- Automatyzację tworzenia i zarządzania grupami repozytoriów,
- Wersjonowanie konfiguracji, co ułatwia kontrolę zmian,
- Powtarzalność konfiguracji, eliminując błędy manualne.
Definiowanie grupy w OpenTofu
Aby utworzyć grupę repozytoriów w GitLab, należy dodać odpowiednią definicję do pliku konfiguracyjnego OpenTofu.
Przykładowy plik konfiguracyjny OpenTofu
Definicja grupy
📄 Ścieżka pliku: pl.rachuna-net/containers.tf
module "_containers" {
source = "git@gitlab.com:pl.rachuna-net/infrastructure/opentofu/modules/gitlab-group.git?ref=v1.0.0"
name = "containers"
description = "Repozytoria z obrazami kontenerowymi."
parent_group = local.parent_name
visibility = "public"
default_branch = "main"
avatar = "containers"
}
module "containers" {
source = "./containers/"
}
Definicja parametrów dla dzieci
📄 Ścieżka pliku: pl.rachuna-net/containers/_locals.tf
locals {
parent_name = "pl.rachuna-net/containers"
project_type = "container"
}
data "vault_kv_secret_v2" "github" {
mount = "kv-devops"
name = "github"
}
Weryfikacja planu OpenTofu
Po zapisaniu konfiguracji należy uruchomić polecenie tofu plan
, które zwróci listę planowanych zmian:
Wdrożenie zmian
Jeśli planowane zmiany są zgodne z oczekiwaniami, należy wdrożyć je do main
poprzez Merge Request (MR), co spowoduje utworzenie grupy repozytoriów w GitLab.
Podsumowanie
Wdrożenie grupy repozytoriów w GitLab za pomocą OpenTofu zapewnia automatyzację, powtarzalność i centralizację zarządzania. Po poprawnym wykonaniu opisanych kroków, nowa grupa repozytoriów będzie gotowa do użytku.
🚀 Gotowe! Grupa repozytoriów została pomyślnie utworzona przy użyciu OpenTofu. 🎉

1.1.2 - Repozytorium kodu

Tworzenie repozytorium w GitLab za pomocą OpenTofu

Niniejsza sekcja dokumentacji opisuje proces tworzenia repozytoriów w GitLab przy użyciu OpenTofu. Prezentowane podejście umożliwia automatyczne zarządzanie repozytoriami, co wspiera podejście Infrastructure as Code (IaC).
Repozytorium GitLab zawierające definicję
🔗 GitLab: pl.rachuna-net/infrastructure/opentofu/iac-gitlab
Repozytorium modułu opentofu - gitlab-group
🔗 GitLab: pl.rachuna-net/infrastructure/opentofu/modules/gitlab-project
Korzyści wynikające z użycia OpenTofu
OpenTofu pozwala na:
- Automatyzację tworzenia i zarządzania grupami repozytoriów,
- Wersjonowanie konfiguracji, co ułatwia kontrolę zmian,
- Powtarzalność konfiguracji, eliminując błędy manualne.
Definiowanie grupy w OpenTofu
Aby utworzyć repozytorium w GitLab, należy dodać odpowiednią definicję do pliku konfiguracyjnego OpenTofu.
📄 Ścieżka pliku: pl.rachuna-net/containers/opentofu
module "opentofu" {
source = "git@gitlab.com:pl.rachuna-net/infrastructure/opentofu/modules/gitlab-project.git?ref=v1.0.0"
name = "opentofu"
archived = false
description = "Obraz Dockerowy z narzędziem opentofu."
visibility = "public"
tags = ["docker", "opentofu"]
avatar = "opentofu"
parent_group = local.parent_name
project_type = "container"
build_git_strategy = "clone"
gitlab_ci_path = "containers/docker.yml@pl.rachuna-net/cicd/gitlab-ci"
# sonarqube
is_enabled_sonarqube = true
sonarqube_cloud_project_id = "pl.rachuna-net_opentofu"
# mirror to github
mirror_url = format(
"https://%s:%s@github.com/%s/%s.git",
data.vault_kv_secret_v2.github.data["owner"],
data.vault_kv_secret_v2.github.data["token"],
data.vault_kv_secret_v2.github.data["owner"],
"pl.rachuna-net.containers.opentofu"
)
variables = {
PUBLISH_VAULT_SECRET_PATH = {
description = "Ścieżka do sekrety Vault, gdzie będą publikowane zmienne środowiskowe",
value = "pl.rachuna-net/containers/opentofu:CONTAINER_IMAGE_OPENTOFU"
}
PUBLISH_VAULT_VALUE_VARIABLE = {
description = "Nazwa zmiennej środowiskowej, która będzie publikowana w Vault",
value = "CONTAINER_IMAGE_VERSION"
}
}
}
Weryfikacja planu OpenTofu
Po zapisaniu konfiguracji należy uruchomić polecenie tofu plan
, które zwróci listę planowanych zmian:
Wdrożenie zmian
Jeśli planowane zmiany są zgodne z oczekiwaniami, należy wdrożyć je do main
poprzez Merge Request (MR), co spowoduje utworzenie repozytorium w GitLab.
Podsumowanie
Wdrożenie repozytorium w GitLab za pomocą OpenTofu zapewnia automatyzację, powtarzalność i centralizację zarządzania. Po poprawnym wykonaniu opisanych kroków, nowa grupa repozytoriów będzie gotowa do użytku.
🚀 Gotowe! Grupa repozytoriów została pomyślnie utworzona przy użyciu OpenTofu. 🎉

2 - OpenTofu Modules

Moduły OpenTofu
Poniżej znajduje lista stworzonych modułów OpenTofu
product |
version |
Opis |
gitlab-group |
 |
Zarządzanie grupą w GitLab |
gitlab-project |
 |
Zarządzanie projektem w GitLab |
3 - Importowanie obiektów

Importowanie istniejących obiektów
tofu Import
– Co to jest i do czego służy?
tofu import
to polecenie w OpenTofu, które umożliwia wprowadzenie istniejących zasobów do stanu (state
) OpenTofu, bez konieczności ich tworzenia od zera. Jest to przydatne, gdy mamy zasoby zarządzane ręcznie lub przez inne narzędzia i chcemy przejąć nad nimi kontrolę za pomocą OpenTofu.
Do czego służy OpenTofu import?
- Przejmowanie kontroli nad istniejącymi zasobami – jeśli masz już zasoby w chmurze (np. VM w AWS, projekt w GitLab, użytkowników w Azure), możesz je zaimportować do OpenTofu bez ich ponownego tworzenia.
- Unikanie usuwania i ponownego tworzenia zasobów – jeśli ręcznie utworzony zasób nie znajduje się w stanie OpenTofu, ale istnieje, można go dodać do
state
, zamiast niszczyć i tworzyć od nowa.
- Migracja do OpenTofu – jeśli zarządzałeś zasobami ręcznie lub przy pomocy innego narzędzia (np. Ansible, CloudFormation), możesz je przenieść do OpenTofu.
Ograniczenia tofu import
- Nie importuje konfiguracji (
.tf
) – dodaje zasoby tylko do state
, ale nie generuje kodu. Konfigurację trzeba dodać ręcznie.
- Brak wsparcia dla całych modułów –
tofu import
działa na poziomie pojedynczych zasobów, a nie całych modułów.
- Niektóre zasoby nie są wspierane – nie wszystkie dostawcy (
providers
) umożliwiają import wszystkich typów zasobów.
Przykłady importowanie obiektów
importowanie grupy gitlab
import {
to = module.pl_rachuna-net.module.infrastructure.module.opentofu.module.group_modules.gitlab_group.group
id = "100726684"
}
importowanie projektu gitlab
import {
to = module.pl_rachuna-net.module.infrastructure.module.opentofu.module.modules.module.gitlab_group.gitlab_project.project
id = "66189322"
}
4 - Nadpisanie gitlab states

Wysłanie opentofu state do gitlab
Push opentofu state
OpenTofu GitLab States pozwala na zarządzanie i synchronizację stanu infrastruktury bezpośrednio w ramach projektu GitLab. Dzięki temu możliwe jest centralne przechowywanie i kontrola stanu, co ułatwia współpracę zespołową oraz automatyzację procesów CI/CD. W niniejszym dokumencie przedstawiono sposób wysyłania zmian do istniejącego stanu OpenTofu do GitLab za pomocą API.
#!/bin/env bash
curl --request POST \
--header "PRIVATE-TOKEN: $GITLAB_TOKEN" \
--header "Content-Type: application/json" \
--data-binary "@default.json" \
"https://gitlab.com/api/v4/projects/${PRROJECT_ID}/terraform/state/${TF_STATE_NAME}"
5 - Integracja z projektem gitlab

Integracja z projektem gitlab
Terraform State to mechanizm w Terraformie, który przechowuje aktualny stan zarządzanej infrastruktury. Jest to plik (domyślnie terraform.tfstate
), w którym Terraform zapisuje informacje o zasobach, ich konfiguracji oraz zależnościach. Dzięki temu Terraform może:
- Śledzić zmiany – porównuje aktualną infrastrukturę ze skonfigurowaną w kodzie, identyfikując różnice.
- Optymalizować działania – wie, które zasoby wymagają zmiany, zamiast tworzyć je od nowa.
- Zarządzać zależnościami – rozumie, w jakiej kolejności tworzyć, aktualizować lub usuwać zasoby.
- Współdzielić stan – umożliwia pracę zespołową poprzez zdalne przechowywanie stanu w backendach takich jak S3, GitLab czy Terraform Cloud.
Zarządzanie stanem jest kluczowe, dlatego warto używać zdalnego backendu zamiast przechowywać terraform.tfstate
lokalnie, szczególnie w środowiskach zespołowych.
⚠️ Nigdy umieszczaj terraform state w bezpośrednio w repozytorium kodu
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=gitlab-ci-token" \
-backend-config="password=${CI_JOB_TOKEN}" \
-backend-config="lock_method=POST" \
-backend-config="unlock_method=DELETE" \
-backend-config="retry_wait_min=5"
dla OpenTofu
tofu 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=gitlab-ci-token" \
-backend-config="password=${CI_JOB_TOKEN}" \
-backend-config="lock_method=POST" \
-backend-config="unlock_method=DELETE" \
-backend-config="retry_wait_min=5"
gdzie:
- CI_PROJECT_ID - id projektu w gitlab
- CI_SERVER_URL - serwer URL
- TF_STATE_NAME - nazwa instancji state
