В одній з моїх попередніх статей я обговорював, чому та як варто адаптувати Infrastructure as Code (IaC) для ефективного управління вашою хмарною інфраструктурою. Існує кілька інструментів і фреймворків для IaC, серед яких найвідоміші — Terraform, Pulumi, Ansible, Puppet тощо. Ці інструменти дозволяють визначати та керувати інфраструктурою як кодом, що забезпечує автоматизацію, повторюваність та масштабованість у вашому хмарному середовищі. У цій статті я хочу представити OpenTofu — відкриту альтернативу Terraform, яка набирає популярності.
Фото Modestas Urbonas на Unsplash
HashiCorp, компанія, яка стоїть за Terraform, змінила ліцензування Terraform на Business Source License (BSL) у 2023 році. Це призвело до створення OpenTofu, форку Terraform, який має на меті зберегти проект відкритим і орієнтованим на спільноту. OpenTofu керується та підтримується Linux Foundation і має зростаючу спільноту контрибуторів та користувачів. Натисніть тут, щоб прочитати маніфест.
Чому обрати OpenTofu замість Terraform?
Обидва інструменти виконують однакові завдання, але ось чому вам може варто спробувати OpenTofu.
Ліцензування
OpenTofu використовує ліцензію Mozilla Public License v2.0 (MPL). Ви можете використовувати її, модифікувати і навіть заробляти на ній без будь-яких обмежень.
Terraform використовує Business Source License (BSL). Ця ліцензія накладає певні обмеження на те, як можна комерційно використовувати Terraform, особливо якщо ви створюєте щось, що конкурує з HashiCorp.
Орієнтованість на спільноту
OpenTofu є відкритим програмним забезпеченням і керується активною спільнотою контрибуторів. Ви можете очікувати швидшу інновацію, швидше виправлення помилок і більш відгукливий процес розробки.
Спільність з Terraform
OpenTofu прагне бути сумісним з Terraform, тому ви часто можете використовувати існуючі конфігурації Terraform з OpenTofu. Однак він також додає нові функції та покращення залежно від потреб спільноти, як-от вбудоване шифрування стану.
Управління станом
Як і Terraform, OpenTofu використовує файл стану для відстеження вашої інфраструктури. Цей (JSON) файл відображає конфігурацію до реальних ресурсів у вашому хмарному середовищі. Варто захистити та версіонувати цей файл, оскільки він може допомогти відстежувати зміни та відновлюватися після збоїв. Читати більше.
Файл стану з демонстраційної конфігурації нижче великий, але ось фрагмент цього файлу.
{
"mode": "managed",
"type": "aws_eip_association",
"name": "singh",
"provider": "provider[\"registry.opentofu.org/hashicorp/aws\"]",
"instances": [
{
"schema_version": 0,
"attributes": {
"allocation_id": "eipalloc-096bd339fb1d4fb60",
"allow_reassociation": null,
"id": "eipassoc-09c06e980f870b713",
"instance_id": "i-0663f391aaec5166e",
"network_interface_id": "eni-049e9af5f71af6d11",
"private_ip_address": "172.31.32.101",
"public_ip": "44.225.217.8"
},
"sensitive_attributes": [],
"private": "bnVsbA==",
"dependencies": [
"aws_eip.singh",
"aws_instance.singh",
"aws_key_pair.singh"
]
}
]
}
Шифрування стану та плану
OpenTofu підтримує шифрування файлів стану та планів на диску, як локально, так і в віддалених сховищах. Це допомагає забезпечити безпеку чутливої інформації в коді вашої інфраструктури. Читати більше.
Граф Tofu
OpenTofu надає утиліту командного рядка tofu graph
, яка дозволяє генерувати візуальне зображення вашої інфраструктури, визначеної в конфігураційних файлах OpenTofu.
Цей граф допомагає зрозуміти взаємозв'язки між різними ресурсами та їх залежності один від одного.
Граф Tofu, згенерований з конфігурації нижче
Мова OpenTofu
На високому рівні основною метою мови OpenTofu є оголошення ресурсів (компонентів інфраструктури) та їх налаштувань. OpenTofu використовує ту саму HCL (HashiCorp Configuration Language), що й Terraform. Основним будівельним блоком конфігурацій OpenTofu є блок ресурсу. Блок ресурсу визначає окремий ресурс у вашій інфраструктурі, наприклад, віртуальну машину, обліковий запис сховища або мережевий інтерфейс. Є тип блоку, мітка блоку та тіло блоку. Ось приклад блоку ресурсу в OpenTofu.
"" "" {
# Тіло блоку
= # Аргумент
}
resource "azurerm_storage_queue" "example" {
name = "example"
resource_group_name = azurerm_resource_group.example.name
account_name = azurerm_storage_account.example.name
}
Мова є декларативною, тобто вона представляє бажаний стан інфраструктури. Як кроки, ви спочатку визначаєте цей стан, потім використовуєте команди плану та застосування для створення або оновлення інфраструктури, щоб вона відповідала бажаному стану.
Демонстрація
У конфігурації демонстрації нижче ми:
- створюємо VPC і підмережу
- інтернет-шлюз та таблицю маршрутів
- асоціюємо підмережу з таблицею маршрутів
- створюємо статичну IP-адресу
- створюємо екземпляр та 2 кошики
# Налаштування постачальника AWS
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 5.0"
}
}
}
provider "aws" {
region = "us-west-2"
}
# Створення VPC
resource "aws_vpc" "singh" {
cidr_block = "10.0.0.0/16"
}
# Створення підмережі
resource "aws_subnet" "singh" {
vpc_id = aws_vpc.singh.id
cidr_block = "10.0.1.0/24"
}
# Створення інтернет-шлюзу
resource "aws_internet_gateway" "singh" {
vpc_id = aws_vpc.singh.id
}
# Створення таблиці маршрутів
resource "aws_route_table" "singh" {
vpc_id = aws_vpc.singh.id
route {
cidr_block = "0.0.0.0/0"
gateway_id = aws_internet_gateway.singh.id
}
}
# Асоціювання таблиці маршрутів з підмережею
resource "aws_route_table_association" "singh" {
subnet_id = aws_subnet.singh.id
route_table_id = aws_route_table.singh.id
}
# Створення групи безпеки
resource "aws_security_group" "singh" {
name = "allow_ssh"
vpc_id = aws_vpc.singh.id
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
}
}
# Створення Elastic IP (Статичної IP)
resource "aws_eip" "singh" {
domain = "vpc"
}
# Створення мережевого інтерфейсу
resource "aws_network_interface" "singh" {
subnet_id = aws_subnet.singh.id
private_ip = "10.0.1.10"
security_groups = [aws_security_group.singh.id]
}
# Прикріплення EIP до мережевого інтерфейсу
resource "aws_eip_association" "singh" {
instance_id = aws_instance.singh.id
allocation_id = aws_eip.singh.id
}
# Створення нового ключа
resource "aws_key_pair" "singh" {
key_name = "opentofu-keypair"
public_key = file("~/.ssh/id_rsa.pub") # мій публічний ключ.
Ви також можете згенерувати один з них
}
# Створення екземпляра EC2
resource "aws_instance" "singh" {
ami = "ami-0fa40e25bf4dda1f6"
instance_type = "t2.micro"
key_name = aws_key_pair.singh.key_name
tags = {
Name = "Singh-OpenTofu Instance"
}
}
# Створення S3 кошиків
resource "aws_s3_bucket" "bucket1" {
bucket = "opentofu-bucket1-singh"
tags = {
Name = "OpenTofu Bucket 1"
}
}
resource "aws_s3_bucket" "bucket2" {
bucket = "opentofu-bucket2-singh"
tags = {
Name = "OpenTofu Bucket 2"
}
}
Щоб застосувати конфігурацію, ви можете виконати наступні команди:
# налаштовує ваш проект OpenTofu і завантажує необхідні компоненти.
$ tofu init
# показує, що OpenTofu змінить у вашій інфраструктурі перед тим, як реально внести ці зміни.
$ tofu plan
# застосувати зміни
$ tofu apply
# знищити ресурси
$ tofu destroy
Цей приклад показує, як легко визначати і розгортати ресурси в AWS (або в будь-якому іншому хмарному середовищі) за допомогою OpenTofu (та інших інструментів IaC). Такий самий підхід можна використовувати для управління інфраструктурою через різних постачальників хмар та навіть для on-premises середовищ. Це повторювано, масштабовано та безпечно.
Висновок
Якщо ви шукаєте відкритий інструмент з сильною підтримкою безпеки та орієнтований на спільноту, спробуйте OpenTofu. Якщо ви вже використовували Terraform, вам буде знайомий OpenTofu, але з додатковими перевагами. Перевірте вебсайт OpenTofu, щоб дізнатися більше та приєднатися до спільноти. Якщо ви використовували OpenTofu, я був би радий дізнатися про ваш досвід і порівняти його з Terraform.
Перекладено з: Try OpenTofu for Your Next IaC Project