Linux中國

使用 Terraform 來管理 OpenStack 集群

Terraform 是一種聲明性語言,可以作為你正在建設的基礎設施的藍圖。

在擁有一個 OpenStack 生產環境和家庭實驗室一段時間後,我可以肯定地說,從管理員和租戶的角度置備工作負載和管理它是很重要的。

Terraform 是一個開源的基礎設施即代碼(IaC)軟體工具,用於 置備 provisioning 網路、伺服器、雲平台等。Terraform 是一種聲明性語言,可以作為你正在建設的基礎設施的藍圖。你可以用 Git 來管理它,它有一個強大的 GitOps 使用場景。

本文介紹了使用 Terraform 管理 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。

為 OpenStack 提供者創建一個 Terraform 腳本

在 Terraform 中,你需要一個 提供者 provider ,它是一個轉換器,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_USERNAMEOS_TENANTOS_PASSWORDOS_AUTH_URLOS_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"
}

創建一個租戶 Terraform 文件

作為一個 租戶 Tenant ,你通常會創建虛擬機。你還為這些虛擬機創建網路和安全組。

這個例子使用上面由 Admin 文件創建的用戶。

首先,創建一個 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 格式化文件,以便在倉庫中使用。

創建一個 Terraform 計劃

接下來,為你創建一個 計劃 plan ,看看將創建哪些資源。

對於管理員:

$ cd AdminTF

$ terraform validate

$ terraform plan

對於租戶:

$ cd TenantTF

$ terraform validate

$ terraform plan

命令解釋:

  • terraform validate 驗證 .tf 語法是否正確。
  • terraform plan 在緩存中創建一個計劃文件,所有管理的資源在創建和銷毀時都可以被跟蹤。

應用你的第一個 TF

要部署資源,使用 terraform apply 命令。該命令應用計劃文件中的所有資源狀態。

對於管理員:

$ cd AdminTF

$ terraform apply

對於租戶:

$ cd TenantTF

$ terraform apply

接下來的步驟

之前,我寫了一篇關於在樹莓派上部署最小 OpenStack 集群的 文章。你可以找到更詳細的 Terraform 和 Ansible 配置,並通過 GitLab 實現一些 CI/CD。

via: https://opensource.com/article/23/1/terraform-manage-openstack-cluster

作者:AJ Canlas 選題:lkxed 譯者:geekpi 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    這個站點使用 Akismet 來減少垃圾評論。了解你的評論數據如何被處理

    More in:Linux中國

    Linux中國

    關於Linux防火牆iptables的面試問答

    Nishita Agarwal是Tecmint的用戶,她將分享關於她剛剛經歷的一家公司(印度的一家私人公司Pune)的面試經驗。在面試中她被問及許多不同的問題,但她是iptables方面的專家,因此她想分享這些關於iptables的問題和相應的答案給那些以後可能會進行相關面試的人。 所有的問題和相應的答案都基於Nishita Agarwal的記憶並經過了重寫。 嗨,朋友!我叫Nishita Agarwal。我已經取得了理學學士學位,我的專業集中在UNIX和它的變種(BSD,Linux)。它們一直深深的吸引著我。我在存儲方面有1年多的經驗。我正在尋求職業上的變化,並將供職於印度的P
    Linux中國

    Lets Encrypt 已被所有主流瀏覽器所信任

    旨在讓每個網站都能使用 HTTPS 加密的非贏利組織 Lets Encrypt 已經得了 IdenTrust的交叉簽名,這意味著其證書現在已經可以被所有主流的瀏覽器所信任。從這個裡程碑事件開始,訪問者訪問使用了Lets Encrypt 證書的網站不再需要特別配置就可以得到 HTTPS 安全保護了。 Lets Encrypt 的兩個中級證書 ...
    Linux中國

    SSL/TLS 加密新紀元 – Lets Encrypt

    根據 Let's Encrypt 官方博客消息,Let's Encrypt 服務將在下周(11 月 16 日)正式對外開放。 Let's Encrypt 項目是由互聯網安全研究小組(ISRG,Internet Security Research Group)主導並開發的一個新型數字證書認證機構(CA,Certificate ...