From 873478bdd307c42fd14f3b0010a637c21158684d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 15 Apr 2024 16:32:51 +0300 Subject: [PATCH] Add OpenTofu example (#2) * Add readme * Add OpenTofu example --------- Co-authored-by: Fedor Batonogov --- .gitignore | 41 +++++++++ opentofu/README.md | 105 ++++++++++++++++++++++ opentofu/test_vm/.terraform.lock.hcl | 25 ++++++ opentofu/test_vm/output.tf | 4 + opentofu/test_vm/provider.tf | 17 ++++ opentofu/test_vm/terraform.tfvars.example | 2 + opentofu/test_vm/variables.tf | 9 ++ opentofu/test_vm/vm-01.tf | 66 ++++++++++++++ 8 files changed, 269 insertions(+) create mode 100644 .gitignore create mode 100644 opentofu/README.md create mode 100644 opentofu/test_vm/.terraform.lock.hcl create mode 100644 opentofu/test_vm/output.tf create mode 100644 opentofu/test_vm/provider.tf create mode 100644 opentofu/test_vm/terraform.tfvars.example create mode 100644 opentofu/test_vm/variables.tf create mode 100644 opentofu/test_vm/vm-01.tf diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a24153f --- /dev/null +++ b/.gitignore @@ -0,0 +1,41 @@ +# Created by https://www.toptal.com/developers/gitignore/api/terraform +# Edit at https://www.toptal.com/developers/gitignore?templates=terraform + +### Terraform ### +# Local .terraform directories +**/.terraform/* + +# .tfstate files +*.tfstate +*.tfstate.* + +# Crash log files +crash.log +crash.*.log + +# Exclude all .tfvars files, which are likely to contain sensitive data, such as +# password, private keys, and other secrets. These should not be part of version +# control as they are data points which are potentially sensitive and subject +# to change depending on the environment. +*.tfvars +*.tfvars.json + +# Ignore override files as they are usually used to override resources locally and so +# are not checked in +override.tf +override.tf.json +*_override.tf +*_override.tf.json + +# Include override files you do wish to add to version control using negated pattern +# !example_override.tf + +# Include tfplan files to ignore the plan output of command: terraform plan -out=tfplan +# example: *tfplan* + +# Ignore CLI configuration files +.terraformrc +terraform.rc + +# End of https://www.toptal.com/developers/gitignore/api/terraform + diff --git a/opentofu/README.md b/opentofu/README.md new file mode 100644 index 0000000..00e4f8a --- /dev/null +++ b/opentofu/README.md @@ -0,0 +1,105 @@ +# **Infrastructure as Code** и системы управления конфигурацией + +Для развёртывания инфраструктуры согласно подходу **Infrastructure as Code**, используя **OpenTofu/Terraform** и создания необходимых ресурсов необходимо выполнить следующие шаги. + +--- + +Официальный сайт проекта [OpenTofu](https://opentofu.org/). +Репозиторий провайдера [bpg/terraform-provider-proxmox](https://github.com/bpg/terraform-provider-proxmox). + +--- + +## Подготовка Proxmox + +### Создание шаблона Ubuntu 22.04 + +На узле Promox создаем шаблон **Cloud Init** **Ubuntu 22.04** + +```sh +export PROXMOX_STORAGE=proxmox-data-01 +apt update && apt install libguestfs-tools -y && \ +wget --backups=1 https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img && \ +virt-customize -a jammy-server-cloudimg-amd64.img --install qemu-guest-agent && \ +qm create 9000 --name "ubuntu-22.04-cloudinit-template" --cores 2 --memory 2048 --net0 virtio,bridge=vmbr0 --scsihw virtio-scsi-pci && \ +qm set 9000 --virtio0 ${PROXMOX_STORAGE}:0,import-from=/root/jammy-server-cloudimg-amd64.img && \ +qm set 9000 --ide2 ${PROXMOX_STORAGE}:cloudinit && \ +qm set 9000 --boot order=virtio0 && \ +qm set 9000 --serial0 socket --vga serial0 && \ +qm template 9000 +``` + +--- + +## Последовательность действий при работе с OpenTofu + +### Инициализируем рабочий каталог, содержащий файлы конфигурации OpenTofu/Terraform + +Команда **tofu init** инициализирует рабочий каталог, содержащий файлы конфигурации **OpenTofu**. Это первая команда, которую следует выполнить после записи новой конфигурации **OpenTofu** или клонирования существующей из системы управления версиями. Эту команду безопасно запускать несколько раз. + +```bash +tofu init +``` + +### Проверяем файлы конфигурации в каталоге + +Команда **tofu validate** проверяет файлы конфигурации в каталоге, ссылаясь только на конфигурацию и не обращаясь к каким-либо удаленным службам, таким как удаленное состояние, API-интерфейсы провайдеров и т.д. + +```bash +tofu validate +``` + +### Создаем план + +Команда **tofu plan** позволяет предварительно просмотреть действия, которые **OpenTofu** предпримет для изменения вашей инфраструктуры, или сохранить предполагаемый план, который вы сможете применить позже. + +```bash +tofu plan +``` + +### Выполняем изменения, определенные конфигурацией **OpenTofu** + +Команда **tofu apply** является более распространенным рабочим процессом вне автоматизации. Если вы не передадите сохраненный план команде применения, она выполнит все функции плана и предложит вам утвердить его перед внесением изменений. + +```bash +tofu apply +``` + +### Удаляем ресурсы + +Команда **tofu destroy** создает план выполнения для удаления всех ресурсов, управляемых в этом проекте. + +```bash +tofu destroy +``` + +--- + +## Как задавать переменные + +Значения переменных можно задать несколькими способами: + +1. Через файл с расширением **.tfvars** (пачками) + +```bash +instance_zone=ru-central-b +``` + +По умолчанию загружаем значения из **terraform.tfvars**, но можно явно обозначить файл для загрузки: + +```bash +tofu apply -var-file="testing.tfvars" +``` + +2. Через переменные окружения. Переменная должна начинаться с **TF*VAR***, а дальше уже имя переменной + +### Для простого типа + +```bash +export TF_VAR_instance_zone=ru-central-d +``` + +### Для составного типа + +```bash +export TF_VAR_instance_zone='["ru-central-a","ru-central-b"]' +``` diff --git a/opentofu/test_vm/.terraform.lock.hcl b/opentofu/test_vm/.terraform.lock.hcl new file mode 100644 index 0000000..e1ea28e --- /dev/null +++ b/opentofu/test_vm/.terraform.lock.hcl @@ -0,0 +1,25 @@ +# This file is maintained automatically by "tofu init". +# Manual edits may be lost in future updates. + +provider "registry.opentofu.org/bpg/proxmox" { + version = "0.53.1" + constraints = ">= 0.53.1" + hashes = [ + "h1:MkkMFotq+rW2sdVlqLk0Uu5NaIvMtsHBT5RJDvnM8Hs=", + "zh:0afa2f8a6aab79973ce792001d5a479a596ed81cc4c44b0d60bcef9dfee093c7", + "zh:0e8a2b62fa0e0e5e83420b391d78bd8f4d7fba6d2df52787c4c9469508642252", + "zh:210a672e445d238538109f2894294199438b776ed89b1a8495d83368811e91e0", + "zh:56c26cb77a07278b2468960b035f53ee47067a51309d8945a1f6c01d66e5a50c", + "zh:854c70381decb32f942f7498d2c0bddc11aa80b73c0c32e12ba5f492dd382245", + "zh:85f4450113086b9004d19febef298f7cafb71cb0b550c420c8c28bc1b4186a3a", + "zh:93003276ec5bc2fc830dc165784cc9b32cc8d2aa41ebbb5f00f0ce12802f1ab2", + "zh:933ad1d9062bbdf63481e6d93d045472d09436ec5624651dec97e1229d725963", + "zh:aa64b56e3e13abe7c06ef1e18ac2dfab0cabda3d9e5e0efe24c8ba5a77755a01", + "zh:ad00656559244ad4a867c271b37a1e8bbb57b63681e98565f287e9d583a316bb", + "zh:ca58d28866723552ecf4c50b1271ec2747c61ed812fb791262a5f0e0ace1c9a4", + "zh:d04bffe5df2a03fa4fc6dbb8d24c389ac8510cc2ed2659dcf57bce3ede0b7809", + "zh:e5fa0efaf38602b4567b0dff3ea334d8b7b618cd15f4f30ca4b332b9a12aacf4", + "zh:f049e50b7f40d678d3e312fb7f837cb46047a8ce27500c7f56e53ecd0fda7e5c", + "zh:f26e0763dbe6a6b2195c94b44696f2110f7f55433dc142839be16b9697fa5597", + ] +} diff --git a/opentofu/test_vm/output.tf b/opentofu/test_vm/output.tf new file mode 100644 index 0000000..849f955 --- /dev/null +++ b/opentofu/test_vm/output.tf @@ -0,0 +1,4 @@ +output "ip_address_vm_01" { + description = "IP адрес vm-01" + value = proxmox_virtual_environment_vm.vm-01.ipv4_addresses[1] +} diff --git a/opentofu/test_vm/provider.tf b/opentofu/test_vm/provider.tf new file mode 100644 index 0000000..86f328f --- /dev/null +++ b/opentofu/test_vm/provider.tf @@ -0,0 +1,17 @@ +terraform { + required_providers { + proxmox = { + source = "bpg/proxmox" + version = ">= 0.53.1" + } + } +} + +provider "proxmox" { + endpoint = var.virtual_environment_endpoint + api_token = var.virtual_environment_api_token + insecure = true + ssh { + agent = false + } +} diff --git a/opentofu/test_vm/terraform.tfvars.example b/opentofu/test_vm/terraform.tfvars.example new file mode 100644 index 0000000..c5306f0 --- /dev/null +++ b/opentofu/test_vm/terraform.tfvars.example @@ -0,0 +1,2 @@ +virtual_environment_api_token = "root@pam!for-terraform-provider=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" +virtual_environment_endpoint = "https://x.x.x.x:8006/" diff --git a/opentofu/test_vm/variables.tf b/opentofu/test_vm/variables.tf new file mode 100644 index 0000000..4508554 --- /dev/null +++ b/opentofu/test_vm/variables.tf @@ -0,0 +1,9 @@ +variable "virtual_environment_endpoint" { + type = string + description = "The endpoint for the Proxmox Virtual Environment API (example: https://host:port)" +} + +variable "virtual_environment_api_token" { + type = string + description = "The api roken the Proxmox Virtual Environment API (example: root@pam!for-terraform-provider=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)" +} diff --git a/opentofu/test_vm/vm-01.tf b/opentofu/test_vm/vm-01.tf new file mode 100644 index 0000000..cf19da2 --- /dev/null +++ b/opentofu/test_vm/vm-01.tf @@ -0,0 +1,66 @@ +# Машинка +resource "proxmox_virtual_environment_vm" "vm-01" { + name = "vm-01" + description = "Managed by OpenTofu" + tags = ["opentofu", "test"] + on_boot = true + + # Указываем целевой узел, на котором будет запущена ВМ + node_name = "pve-01" + + # Шоблон из которого будет создавать ВМ + clone { + vm_id = "9000" + node_name = "pve-01" + retries = 2 + } + + # Активируем QEMU для этов ВМ + agent { + enabled = true + } + + operating_system { + type = "l26" + } + + cpu { + cores = 4 + type = "host" + numa = true + } + + memory { + dedicated = 4096 + } + + disk { + size = "40" + interface = "virtio0" + datastore_id = "proxmox-data-02" + file_format = "raw" + } + + network_device { + bridge = "vmbr0" + model = "virtio" + } + + initialization { + datastore_id = "proxmox-data-02" + ip_config { + ipv4 { + address = "dhcp" + } + } + dns { + servers = ["77.88.8.8"] + } + user_account { + username = "infra" + keys = [ + "ssh-rsa..." + ] + } + } +}