Redian新闻
>
使用 Terraform 来管理 OpenStack 集群 | Linux 中国

使用 Terraform 来管理 OpenStack 集群 | Linux 中国

科技
 
导读:Terraform 是一种声明性语言,可以作为你正在建设的基础设施的蓝图。                 
本文字数:7428,阅读时长大约:8分钟

Terraform 是一种声明性语言,可以作为你正在建设的基础设施的蓝图。

在拥有一个 OpenStack 生产环境和家庭实验室一段时间后,我可以肯定地说,从管理员和租户的角度置备工作负载和管理它是很重要的。

Terraform 是一个开源的基础设施即代码(IaC)软件工具,用于 置备(provisioning)网络、服务器、云平台等。Terraform 是一种声明性语言,可以作为你正在建设的基础设施的蓝图。你可以用 Git 来管理它,它有一个强大的 GitOps🔗 opensource.com 使用场景。

本文介绍了使用 Terraform 管理 OpenStack 集群的基础知识。我使用 Terraform 重新创建了 OpenStack 演示项目。

安装 Terraform

我使用 CentOS 作为跳板机运行 Terraform。根据官方文档,第一步是添加 Hashicorp 仓库:

  1. $ sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo

接下来,安装 Terraform:

  1. $ sudo dnf install terraform -y

验证安装:

  1. $ terraform version

如果你看到返回的版本号,那么你已经安装了 Terraform。

为 OpenStack 提供者创建一个 Terraform 脚本

在 Terraform 中,你需要一个 提供者(provider),它是一个转换器,Terraform 调用它将你的 .tf 转换为对你正在协调的平台的 API 调用。

有三种类型的提供者:官方、合作伙伴和社区:

◈ 官方提供者由 Hashicorp 维护。
◈ 合作伙伴提供者由与 Hashicorp 合作的技术公司维护。
◈ 社区提供者是由开源社区成员维护的。

在这个 链接🔗 registry.terraform.io 中有一个很好的 OpenStack 的社区提供者。要使用这个提供者,请创建一个 .tf 文件,并命名为 main.tf

  1. $ vi main.tf

在 main.tf 中添加以下内容:

  1. terraform {
  2. required_version = ">= 0.14.0"
  3. required_providers {
  4. openstack = {
  5. source = "terraform-provider-openstack/openstack"
  6. version = "1.49.0"
  7. }
  8. }
  9. }
  10. provider "openstack" {
  11. user_name = OS_USERNAME
  12. tenant_name = OS_TENANT
  13. password = OS_PASSWORD
  14. auth_url = OS_AUTH_URL
  15. region = OS_REGION
  16. }

你需要修改 OS_USERNAMEOS_TENANTOS_PASSWORDOS_AUTH_URL 和 OS_REGION 变量才能工作。

创建一个 Terraform 管理文件

OpenStack 管理文件的重点是置备外部网络、路由、用户、镜像、租户配置文件和配额。

此示例提供风格,连接到外部网络的路由、测试镜像、租户配置文件和用户。

首先,为置备资源创建一个 AdminTF 目录:

  1. $ mkdir AdminTF
  2. $ cd AdminTF

在 main.tf 中,添加以下内容:

  1. terraform {
  2. required_version = ">= 0.14.0"
  3. required_providers {
  4. openstack = {
  5. source = "terraform-provider-openstack/openstack"
  6. version = "1.49.0"
  7. }
  8. }
  9. }
  10. provider "openstack" {
  11. user_name = OS_USERNAME
  12. tenant_name = admin
  13. password = OS_PASSWORD
  14. auth_url = OS_AUTH_URL
  15. region = OS_REGION
  16. }
  17. resource "openstack_compute_flavor_v2" "small-flavor" {
  18. name = "small"
  19. ram = "4096"
  20. vcpus = "1"
  21. disk = "0"
  22. flavor_id = "1"
  23. is_public = "true"
  24. }
  25. resource "openstack_compute_flavor_v2" "medium-flavor" {
  26. name = "medium"
  27. ram = "8192"
  28. vcpus = "2"
  29. disk = "0"
  30. flavor_id = "2"
  31. is_public = "true"
  32. }
  33. resource "openstack_compute_flavor_v2" "large-flavor" {
  34. name = "large"
  35. ram = "16384"
  36. vcpus = "4"
  37. disk = "0"
  38. flavor_id = "3"
  39. is_public = "true"
  40. }
  41. resource "openstack_compute_flavor_v2" "xlarge-flavor" {
  42. name = "xlarge"
  43. ram = "32768"
  44. vcpus = "8"
  45. disk = "0"
  46. flavor_id = "4"
  47. is_public = "true"
  48. }
  49. resource "openstack_networking_network_v2" "external-network" {
  50. name = "external-network"
  51. admin_state_up = "true"
  52. external = "true"
  53. segments {
  54. network_type = "flat"
  55. physical_network = "physnet1"
  56. }
  57. }
  58. resource "openstack_networking_subnet_v2" "external-subnet" {
  59. name = "external-subnet"
  60. network_id = openstack_networking_network_v2.external-network.id
  61. cidr = "10.0.0.0/8"
  62. gateway_ip = "10.0.0.1"
  63. dns_nameservers = ["10.0.0.254", "10.0.0.253"]
  64. allocation_pool {
  65. start = "10.0.0.1"
  66. end = "10.0.254.254"
  67. }
  68. }
  69. resource "openstack_networking_router_v2" "external-router" {
  70. name = "external-router"
  71. admin_state_up = true
  72. external_network_id = openstack_networking_network_v2.external-network.id
  73. }
  74. resource "openstack_images_image_v2" "cirros" {
  75. name = "cirros"
  76. image_source_url = "https://download.cirros-cloud.net/0.6.1/cirros-0.6.1-x86_64-disk.img"
  77. container_format = "bare"
  78. disk_format = "qcow2"
  79. properties = {
  80. key = "value"
  81. }
  82. }
  83. resource "openstack_identity_project_v3" "demo-project" {
  84. name = "Demo"
  85. }
  86. resource "openstack_identity_user_v3" "demo-user" {
  87. name = "demo-user"
  88. default_project_id = openstack_identity_project_v3.demo-project.id
  89. password = "demo"
  90. }

创建一个租户 Terraform 文件

作为一个 租户(Tenant),你通常会创建虚拟机。你还为这些虚拟机创建网络和安全组。

这个例子使用上面由 Admin 文件创建的用户。

首先,创建一个 TenantTF 目录,用于与租户相关的置备:

  1. $ mkdir TenantTF
  2. $ cd TenantTF

在 main.tf 中,添加以下内容:

  1. terraform {
  2. required_version = ">= 0.14.0"
  3. required_providers {
  4. openstack = {
  5. source = "terraform-provider-openstack/openstack"
  6. version = "1.49.0"
  7. }
  8. }
  9. }
  10. provider "openstack" {
  11. user_name = demo-user
  12. tenant_name = demo
  13. password = demo
  14. auth_url = OS_AUTH_URL
  15. region = OS_REGION
  16. }
  17. resource "openstack_compute_keypair_v2" "demo-keypair" {
  18. name = "demo-key"
  19. public_key = "ssh-rsa ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ"
  20. }
  21. resource "openstack_networking_network_v2" "demo-network" {
  22. name = "demo-network"
  23. admin_state_up = "true"
  24. }
  25. resource "openstack_networking_subnet_v2" "demo-subnet" {
  26. network_id = openstack_networking_network_v2.demo-network.id
  27. name = "demo-subnet"
  28. cidr = "192.168.26.0/24"
  29. }
  30. resource "openstack_networking_router_interface_v2" "demo-router-interface" {
  31. router_id = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
  32. subnet_id = openstack_networking_subnet_v2.demo-subnet.id
  33. }
  34. resource "openstack_compute_instance_v2" "demo-instance" {
  35. name = "demo"
  36. image_id = "YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY"
  37. flavor_id = "3"
  38. key_pair = "demo-key"
  39. security_groups = ["default"]
  40. metadata = {
  41. this = "that"
  42. }
  43. network {
  44. name = "demo-network"
  45. }
  46. }

初始化你的 Terraform

创建 Terraform 文件后,你需要初始化 Terraform。

对于管理员:

  1. $ cd AdminTF
  2. $ terraform init
  3. $ terraform fmt

对于租户:

  1. $ cd TenantTF
  2. $ terraform init
  3. $ terraform fmt

命令解释:

◈ terraform init 从镜像源下载提供者用于置备此项目。
◈ terraform fmt 格式化文件,以便在仓库中使用。

创建一个 Terraform 计划

接下来,为你创建一个 计划(plan),看看将创建哪些资源。

对于管理员:

  1. $ cd AdminTF
  2. $ terraform validate
  3. $ terraform plan

对于租户:

  1. $ cd TenantTF
  2. $ terraform validate
  3. $ terraform plan

命令解释:

◈ terraform validate 验证 .tf 语法是否正确。
◈ terraform plan 在缓存中创建一个计划文件,所有管理的资源在创建和销毁时都可以被跟踪。

应用你的第一个 TF

要部署资源,使用 terraform apply 命令。该命令应用计划文件中的所有资源状态。

对于管理员:

  1. $ cd AdminTF
  2. $ terraform apply

对于租户:

  1. $ cd TenantTF
  2. $ terraform apply

接下来的步骤

之前,我写了一篇关于在树莓派上部署最小 OpenStack 集群的 文章🔗 opensource.com。你可以找到更详细的 Terraform 和 Ansible🔗 www.ansible.com 配置,并通过 GitLab 实现一些 CI/CD。


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

作者:AJ Canlas 选题:lkxed 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

LCTT 译者 :geekpi
💎💎💎💎
翻译: 1879.5 篇
|
贡献: 3414 天
2013-10-25
2023-03-01
https://linux.cn/lctt/geekpi
欢迎遵照 CC-BY-SA 协议规定转载,
如需转载,请在文章下留言 “转载:公众号名称”,
我们将为您添加白名单,授权“转载文章时可以修改”。


微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
GNOME 2 的 Linux 文件管理器 Caja | Linux 中国EulerMaker:构建 openEuler 全场景生态 | Linux 中国使用 Kubespray 安装 Kubernetes 集群 | Linux 中国MNT Pocket Reform 迷你笔记本电脑发布:7 英寸屏、Linux 系统,售价 899 美元起Terraform 如何导入以及管理 AWS 现有安全组使用这个开源的会计应用来管理你的小企业 | Linux 中国在美术馆纪念品店漫游,二则在 Linux 命令行上使用 dict 文字工具 | Linux 中国糖尿病人也可以吃的Tiramisu世界上只有两个 Linux 发行版:Arch Linux 与其它 | Linux 中国使用 ChatGPT AI 从英文文本生成 Linux 命令 | Linux 中国加工肉食品有哪些坑?Agustín Hernández:中美洲建筑背景下的未来主义巨构为内存塞不下Transformer犯愁?OpenAI应用AI研究负责人写了份指南ICRA 2023 | CurveFormer:基于Transformer的3D车道线检测新网络广东篇:加快培育发展先进材料产业集群等十大战略性支柱产业集群、十大战略性新兴产业集群ICLR 2023 | Specformer: 基于Transformer的集合到集合图谱滤波器强化学习中的Transformer发展到哪一步了?清北联合发布TransformRL综述如何在 Arch Linux 中安装 MATE 桌面 | Linux 中国Live Captions:Linux 上的开源视频字幕应用 | Linux 中国ICLR 2023 | DIFFormer: 扩散过程启发的TransformerLinux查看进程占用网速和流量使用情况的三个命令:vnstat、iftop、nethogs2022 WTF YEARTUXEDO Stellaris 16(Gen5)是目前所能找到的终极 Linux 笔记本电脑 | Linux 中国Arch Linux 的最佳 GUI 包管理器 | Linux 中国7 Papers & Radios | 推理速度比Stable Diffusion快2倍;视觉Transformer统一图像文本谷歌云推出配置管理仪表板,简化 Kubernetes 集群管理Conagen和Natáur达成合作,生产可持续天然牛磺酸Opera推出Opera One,将取代Opera浏览器如何在 Linux 中使用旧相机作为网络摄像头 | Linux 中国酷冷至尊(CoolerMaster)的 MasterPlus 软件即将开源 | Linux 中国FastTrack Universität 2023莱比锡大学公立语言项目招生简章云儿唠嗑:岁末话星坛如何在 Linux 系统中使用 Ventoy 创建多重引导的 U 盘 | Linux 中国CTO:谁在项目中使用Arrays.asList、ArrayList.subList,就立马滚蛋!
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。