
在擁有一個(gè) OpenStack 生產(chǎn)環(huán)境和家庭實(shí)驗(yàn)室一段時(shí)間后,我可以肯定地說,從管理員和租戶的角度置備工作負(fù)載和管理它是很重要的。
Terraform 是一個(gè)開源的基礎(chǔ)設(shè)施即代碼(IaC)軟件工具,用于 置備provisioning網(wǎng)絡(luò)、服務(wù)器、云平臺等。Terraform 是一種聲明性語言,可以作為你正在建設(shè)的基礎(chǔ)設(shè)施的藍(lán)圖。你可以用 Git 來管理它,它有一個(gè)強(qiáng)大的 ??GitOps?? 使用場景。
本文介紹了使用 Terraform 管理 OpenStack 集群的基礎(chǔ)知識。我使用 Terraform 重新創(chuàng)建了 OpenStack 演示項(xiàng)目。
安裝 Terraform
我使用 CentOS 作為跳板機(jī)運(yùn)行 Terraform。根據(jù)官方文檔,第一步是添加 Hashicorp 倉庫:
$ sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
接下來,安裝 Terraform:
$ sudo dnf install terraform -y
驗(yàn)證安裝:
如果你看到返回的版本號,那么你已經(jīng)安裝了 Terraform。
為 OpenStack 提供者創(chuàng)建一個(gè) Terraform 腳本
在 Terraform 中,你需要一個(gè) 提供者provider,它是一個(gè)轉(zhuǎn)換器,Terraform 調(diào)用它將你的 ??.tf?
? 轉(zhuǎn)換為對你正在協(xié)調(diào)的平臺的 API 調(diào)用。
有三種類型的提供者:官方、合作伙伴和社區(qū):
- 官方提供者由 Hashicorp 維護(hù)。
- 合作伙伴提供者由與 Hashicorp 合作的技術(shù)公司維護(hù)。
- 社區(qū)提供者是由開源社區(qū)成員維護(hù)的。
在這個(gè) ??鏈接??? 中有一個(gè)很好的 OpenStack 的社區(qū)提供者。要使用這個(gè)提供者,請創(chuàng)建一個(gè) ??.tf?
?? 文件,并命名為 ??main.tf?
?。
在 ??main.tf?
? 中添加以下內(nèi)容:
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?
? 變量才能工作。
創(chuàng)建一個(gè) Terraform 管理文件
OpenStack 管理文件的重點(diǎn)是置備外部網(wǎng)絡(luò)、路由、用戶、鏡像、租戶配置文件和配額。
此示例提供風(fēng)格,連接到外部網(wǎng)絡(luò)的路由、測試鏡像、租戶配置文件和用戶。
首先,為置備資源創(chuàng)建一個(gè) ??AdminTF?
? 目錄:
$ mkdir AdminTF
$ cd AdminTF
在 ??main.tf?
? 中,添加以下內(nèi)容:
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"
}
創(chuàng)建一個(gè)租戶 Terraform 文件
作為一個(gè) 租戶Tenant,你通常會創(chuàng)建虛擬機(jī)。你還為這些虛擬機(jī)創(chuàng)建網(wǎng)絡(luò)和安全組。
這個(gè)例子使用上面由 Admin 文件創(chuàng)建的用戶。
首先,創(chuàng)建一個(gè) ??TenantTF?
? 目錄,用于與租戶相關(guān)的置備:
$ mkdir TenantTF
$ cd TenantTF
在 ??main.tf?
? 中,添加以下內(nèi)容:
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
創(chuàng)建 Terraform 文件后,你需要初始化 Terraform。
對于管理員:
$ cd AdminTF
$ terraform init
$ terraform fmt
對于租戶:
$ cd TenantTF
$ terraform init
$ terraform fmt
命令解釋:
- ?
?terraform init?
? 從鏡像源下載提供者用于置備此項(xiàng)目。 - ?
?terraform fmt?
? 格式化文件,以便在倉庫中使用。
創(chuàng)建一個(gè) Terraform 計(jì)劃
接下來,為你創(chuàng)建一個(gè) 計(jì)劃plan,看看將創(chuàng)建哪些資源。
對于管理員:
$ cd AdminTF
$ terraform validate
$ terraform plan
對于租戶:
$ cd TenantTF
$ terraform validate
$ terraform plan
命令解釋:
- ?
?terraform validate?
?? 驗(yàn)證 ??.tf?
? 語法是否正確。 - ?
?terraform plan?
? 在緩存中創(chuàng)建一個(gè)計(jì)劃文件,所有管理的資源在創(chuàng)建和銷毀時(shí)都可以被跟蹤。
應(yīng)用你的第一個(gè) TF
要部署資源,使用 ??terraform apply?
? 命令。該命令應(yīng)用計(jì)劃文件中的所有資源狀態(tài)。
對于管理員:
$ cd AdminTF
$ terraform apply
對于租戶:
$ cd TenantTF
$ terraform apply
接下來的步驟
之前,我寫了一篇關(guān)于在樹莓派上部署最小 OpenStack 集群的 ??文章???。你可以找到更詳細(xì)的 ??Terraform 和 Ansible?? 配置,并通過 GitLab 實(shí)現(xiàn)一些 CI/CD。