Используйте Terraform для управления кластером OpenStack.
Terraform — это декларативный язык, который может служить образцом инфраструктуры, над которой вы работаете.
Имея в течение некоторого времени производственную и домашнюю лабораторию OpenStack, я могу с уверенностью сказать, что обеспечение рабочей нагрузки и управление ею с точки зрения администратора и арендатора очень важны.
Terraform — это программный инструмент «Инфраструктура как код» (IaC) с открытым исходным кодом, используемый для подготовки сетей, серверов, облачных платформ и многого другого. Terraform — это декларативный язык, который может служить образцом инфраструктуры, над которой вы работаете. Вы можете управлять им с помощью Git, и у него есть хороший вариант использования GitOps.
В этой статье рассматриваются основы управления кластером OpenStack с помощью Terraform. Я воссоздаю демонстрационный проект OpenStack, используя Terraform.
Установить Терраформ
Я использую CentOS в качестве хоста перехода, на котором запускаю Terraform. Согласно официальной документации, первым шагом является добавление репозитория Hashicorp:
$ sudo dnf config-manager \
--add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
Затем установите Terraform:
$ sudo dnf install terraform -y
Проверьте установку:
$ terraform –version
Если вы видите в ответ номер версии, вы установили Terraform.
Создайте скрипт Terraform для провайдера OpenStack.
В Terraform вам нужен провайдер. Поставщик — это преобразователь, который Terraform вызывает для преобразования вашего .tf
в вызовы API для платформы, которую вы оркестрируете.
Существует три типа поставщиков: официальные, партнерские и сообщества.
- Официальными поставщиками являются Hashicorp.
- Поставщиков-партнеров обслуживают технологические компании, сотрудничающие с Hashicorp.
- Поставщики сообщества поддерживаются членами сообщества открытого исходного кода.
По этой ссылке есть хороший поставщик сообщества для OpenStack. Чтобы использовать этого поставщика, создайте файл .tf
и назовите его main.tf
.
$ vi main.tf
Добавьте следующий контент в main.tf
:
terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "1.49.0"
}
}
}
provider "openstack" {
user_name = “OS_USERNAME”
tenant_name = “OS_TENANT”
password = “OS_PASSWORD”
auth_url = “OS_AUTH_URL”
region = “OS_REGION”
}
Вам необходимо изменить OS_USERNAME, OS_TENANT, OS_PASSWORD, OS_AUTH_URL и OS_REGION. переменные, чтобы это работало.
Создайте файл администратора Terraform.
Файлы администрирования OpenStack предназначены для подготовки внешних сетей, маршрутизаторов, пользователей, образов, профилей арендаторов и квот.
В этом примере предоставляются варианты, маршрутизатор, подключенный к внешней сети, тестовый образ, профиль клиента и пользователь.
Сначала создайте каталог AdminTF
для ресурсов подготовки:
$ mkdir AdminTF
$ cd AdminTF
В main.tf
добавьте следующее:
terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "1.49.0"
}
}
}
provider "openstack" {
user_name = “OS_USERNAME”
tenant_name = “admin”
password = “OS_PASSWORD”
auth_url = “OS_AUTH_URL”
region = “OS_REGION”
}
resource "openstack_compute_flavor_v2" "small-flavor" {
name = "small"
ram = "4096"
vcpus = "1"
disk = "0"
flavor_id = "1"
is_public = "true"
}
resource "openstack_compute_flavor_v2" "medium-flavor" {
name = "medium"
ram = "8192"
vcpus = "2"
disk = "0"
flavor_id = "2"
is_public = "true"
}
resource "openstack_compute_flavor_v2" "large-flavor" {
name = "large"
ram = "16384"
vcpus = "4"
disk = "0"
flavor_id = "3"
is_public = "true"
}
resource "openstack_compute_flavor_v2" "xlarge-flavor" {
name = "xlarge"
ram = "32768"
vcpus = "8"
disk = "0"
flavor_id = "4"
is_public = "true"
}
resource "openstack_networking_network_v2" "external-network" {
name = "external-network"
admin_state_up = "true"
external = "true"
segments {
network_type = "flat"
physical_network = "physnet1"
}
}
resource "openstack_networking_subnet_v2" "external-subnet" {
name = "external-subnet"
network_id = openstack_networking_network_v2.external-network.id
cidr = "10.0.0.0/8"
gateway_ip = "10.0.0.1"
dns_nameservers = ["10.0.0.254", "10.0.0.253"]
allocation_pool {
start = "10.0.0.1"
end = "10.0.254.254"
}
}
resource "openstack_networking_router_v2" "external-router" {
name = "external-router"
admin_state_up = true
external_network_id = openstack_networking_network_v2.external-network.id
}
resource "openstack_images_image_v2" "cirros" {
name = "cirros"
image_source_url = "https://download.cirros-cloud.net/0.6.1/cirros-0.6.1-x86_64-disk.img"
container_format = "bare"
disk_format = "qcow2"
properties = {
key = "value"
}
}
resource "openstack_identity_project_v3" "demo-project" {
name = "Demo"
}
resource "openstack_identity_user_v3" "demo-user" {
name = "demo-user"
default_project_id = openstack_identity_project_v3.demo-project.id
password = "demo"
}
Создайте файл Tenant Terraform.
Как арендатор, вы обычно создаете виртуальные машины. Вы также создаете группы сети и безопасности для виртуальных машин.
В этом примере используется пользователь, созданный выше с помощью файла администратора.
Сначала создайте каталог TenantTF
для подготовки, связанной с арендатором:
$ mkdir TenantTF
$ cd TenantTF
В main.tf
добавьте следующее:
terraform {
required_version = ">= 0.14.0"
required_providers {
openstack = {
source = "terraform-provider-openstack/openstack"
version = "1.49.0"
}
}
}
provider "openstack" {
user_name = “demo-user”
tenant_name = “demo”
password = “demo”
auth_url = “OS_AUTH_URL”
region = “OS_REGION”
}
resource "openstack_compute_keypair_v2" "demo-keypair" {
name = "demo-key"
public_key = "ssh-rsa ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
}
resource "openstack_networking_network_v2" "demo-network" {
name = "demo-network"
admin_state_up = "true"
}
resource "openstack_networking_subnet_v2" "demo-subnet" {
network_id = openstack_networking_network_v2.demo-network.id
name = "demo-subnet"
cidr = "192.168.26.0/24"
}
resource "openstack_networking_router_interface_v2" "demo-router-interface" {
router_id = “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX”
subnet_id = openstack_networking_subnet_v2.demo-subnet.id
}
resource "openstack_compute_instance_v2" "demo-instance" {
name = "demo"
image_id = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
flavor_id = "3"
key_pair = "demo-key"
security_groups = ["default"]
metadata = {
this = "that"
}
network {
name = "demo-network"
}
}
Инициализируйте свой Terraform
После создания файлов Terraform вам необходимо инициализировать Terraform.
Для администратора:
$ cd AdminTF
$ terraform init
$ terraform fmt
Для Арендаторов:
$ cd TenantTF
$ terraform init
$ terraform fmt
Объяснение команды:
terraform init
загружает поставщика из реестра, чтобы использовать его при подготовке этого проекта.terraform fmt
форматирует файлы для использования в репозиториях.
Создайте план Терраформирования
Затем создайте план, чтобы увидеть, какие ресурсы будут созданы.
Для администратора:
$ cd AdminTF
$ terraform validate
$ terraform plan
Для Арендаторов:
$ cd TenantTF
$ terraform validate
$ terraform plan
Объяснение команды:
terraform validate
проверяет правильность синтаксиса.tf
.terraform plan
создает файл плана в кеше, где можно отслеживать все управляемые ресурсы при создании и уничтожении.
Примените свой первый ТФ
Чтобы развернуть ресурсы, используйте команду terraform apply
. Эта команда применяет все состояния ресурсов в файле плана.
Для администратора:
$ cd AdminTF
$ terraform apply
Для Арендаторов:
$ cd TenantTF
$ terraform apply
Следующие шаги
Ранее я написал статью о развертывании минимального кластера OpenStack на Raspberry Pi. Вы можете узнать, как получить более подробные конфигурации Terraform и Ansible и реализовать некоторые CI/CD с помощью GitLab.