Terraform 提供商 Selectel

Terraform 提供商 Selectel

我们推出了官方 Terraform 提供商来与 Selectel 合作。 该产品允许用户通过基础设施即代码方法全面实施资源管理。

提供商目前支持服务资源管理 “虚拟私有云” (以下简称VPC)。 将来,我们计划为 Selectel 提供的其他服务添加资源管理。

如您所知,VPC 服务是基于 OpenStack 构建的。 然而,由于OpenStack不提供服务于公有云的原生工具,我们在一组额外的API中实现了缺失的功能,这些API简化了复杂复合对象的管理并使工作更加方便。 OpenStack 中的一些可用功能无法直接使用,但可以通过 我们的API.

Selectel Terraform 提供程序现在能够管理以下 VPC 资源:

  • 项目及其配额;
  • 用户、他们的角色和代币;
  • 公有子网,包括跨区域和VRRP;
  • 软件许可证。

提供商使用我们的公共 Go 库来与 VPC API 配合使用。 库和提供者本身都是开源的,它们的开发是在 Github 上进行的:

要管理其他云资源,例如虚拟机、磁盘、Kubernetes 集群,您可以使用 OpenStack Terraform 提供程序。 两个提供商的官方文档可通过以下链接获取:

入门

首先,您需要安装 Terraform(可以在以下位置找到安装包的说明和链接) 官方网站).

要进行操作,提供商需要 Selectel API 密钥,该密钥是在 帐户控制面板.

使用 Terraform 或使用我们的 Github 存储库中提供的一组现成示例来创建使用 Selectel 的清单: 地形示例.

包含示例的存储库分为两个目录:

  • 模块,包含小型可重用模块,这些模块将一组参数作为输入并管理一小组资源;
  • 例子,包含完整的互连模块集的示例。

安装 Terraform、创建 Selectel API 密钥并熟悉示例后,让我们继续讨论实际示例。

使用本地磁盘创建服务器的示例

我们来看一个创建项目、具有角色的用户和具有本地磁盘的虚拟机的示例: terraform-examples/examples/vpc/server_local_root_disk.

在文件中 变量.tf 描述了调用模块时将使用的所有参数。 其中一些有默认值,例如,服务器将在区域中创建 ru-3a 具有以下配置:

variable "server_vcpus" {
default = 4
}

variable "server_ram_mb" {
default = 8192
}

variable "server_root_disk_gb" {
default = 8
}

variable "server_image_name" {
default = "Ubuntu 18.04 LTS 64-bit"
}

在文件中 主文件 Selectel 提供程序已初始化:

provider "selectel" {
token    = "${var.sel_token}"
}

此文件还包含将安装在服务器上的 SSH 密钥的默认值:

module "server_local_root_disk" {
...
server_ssh_key      = "${file("~/.ssh/id_rsa.pub")}"
}

如有必要,您可以指定不同的公钥。 键不必指定为文件路径;您也可以将值添加为字符串。

在此文件中,进一步启动了模块 项目用户 и 服务器本地根磁盘,管理必要的资源。

让我们更详细地看看这些模块。

创建项目和具有角色的用户

第一个模块创建一个项目和在该项目中具有角色的用户: terraform-examples/modules/vpc/project_with_user.

创建的用户将能够登录 OpenStack 并管理其资源。 该模块很简单,只管理三个实体:

  • selectel_vpc_project_v2,
  • 选择_vpc_user_v2,
  • selectel_vpc_role_v2。

使用本地磁盘创建虚拟服务器

第二个模块涉及管理 OpenStack 对象,这是创建具有本地磁盘的服务器所必需的。

您应该注意此模块中为资源指定的一些参数 openstack_compute_instance_v2:

resource "openstack_compute_instance_v2" "instance_1" {
  ...

  lifecycle {
    ignore_changes = ["image_id"]
  }

  vendor_options {
    ignore_resize_confirmation = true
  }
}

争论 忽略更改 允许您忽略属性更改 id 用于创建虚拟机的映像。 在VPC服务中,大多数公共镜像会每周自动更新一次,同时其镜像也会自动更新。 id 也发生变化。 这是由于 OpenStack 组件 Glance 的特殊性造成的,其中图像被视为不可变的实体。

如果您正在创建或修改具有参数的现有服务器或磁盘 图片编号 使用 id 公共映像,然后在更新该映像后,再次运行 Terraform 清单将重新创建服务器或磁盘。 使用参数 忽略更改 可以让你避免这样的情况。

注:论证 忽略更改 很久以前就出现在 Terraform 中: 拉#2525.

争论 忽略调整大小确认 成功调整本地磁盘、核心或服务器内存大小所需的。 此类更改是通过 OpenStack Nova 组件使用请求进行的 调整。 请求后默认 Nova 调整 将服务器置于状态 验证调整大小 并等待用户的进一步确认。 但是,可以更改此行为,以便 Nova 不等待用户的其他操作。

指定的参数允许 Terraform 不等待状态 验证调整大小 并做好服务器参数修改后进入激活状态的准备。 该参数可从 OpenStack Terraform 提供程序的 1.10.0 版本中获取: 拉#422.

创建资源

在运行清单之前,请注意,在我们的示例中,启动了两个不同的提供程序,并且 OpenStack 提供程序依赖于 Selectel 提供程序的资源,因为如果不在项目中创建用户,则无法管理属于它的对象。 不幸的是,出于同样的原因,我们不能只运行命令 地形应用 在我们的例子中。 我们首先需要做 应用 对于模块 项目用户 然后是其他一切。

注意:此问题在 Terraform 中尚未解决,您可以关注 Github 上的讨论: 问题#2430 и 问题#4149.

要创建资源,请转到目录 terraform-examples/examples/vpc/server_local_root_disk,其内容应该是这样的:

$ ls
README.md	   main.tf		vars.tf

我们使用以下命令初始化模块:

$ terraform init

输出显示 Terraform 下载其使用的提供程序的最新版本并检查示例中描述的所有模块。

首先我们来应用该模块 项目用户。 这需要手动为尚未设置的变量传递值:

  • sel_帐户 以及您的 Selectel 帐号;
  • sel_token 使用您的 Selectel API 密钥;
  • 用户密码 以及 OpenStack 用户的密码。

前两个变量的值必须取自 控制面板.

对于最后一个变量,您可以想出任何密码。

要使用该模块,您需要替换这些值 SEL_帐户, SEL_TOKEN и 用户密码 运行命令:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply -target=module.project_with_user

运行命令后,Terraform 将显示它要创建的资源并要求确认:

Plan: 3 to add, 0 to change, 0 to destroy.

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.

Enter a value: yes

创建项目、用户和角色后,您可以开始创建其余资源:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

创建资源时,请注意 Terraform 输出以及可访问所创建服务器的外部 IP 地址:

module.server_local_root_disk.openstack_networking_floatingip_associate_v2.association_1: Creating...
  floating_ip: "" => "x.x.x.x"

您可以使用指定的 IP 通过 SSH 使用创建的虚拟机。

编辑资源

除了通过 Terraform 创建资源之外,还可以修改它们。

例如,让我们通过更改参数值来增加服务器的核心数和内存数 服务器_vcpu и 服务器内存MB 在文件中 示例/vpc/server_local_root_disk/main.tf:

-  server_vcpus        = "${var.server_vcpus}"
-  server_ram_mb       = "${var.server_ram_mb}"
+  server_vcpus        = 8
+  server_ram_mb       = 10240

之后,我们使用以下命令检查这将导致什么变化:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform plan

因此,Terraform 进行了资源更改 openstack_compute_instance_v2 и openstack_compute_flavor_v2.

请注意,这将需要重新启动创建的虚拟机。

要应用新的虚拟机配置,请使用以下命令 地形应用,我们之前已经推出了。

所有创建的对象将显示在 VPC 控制面板:

Terraform 提供商 Selectel

在我们的 示例存储库 您还可以查看使用网络驱动器创建虚拟机的清单。

创建 Kubernetes 集群示例

在继续下一个示例之前,我们将清理之前创建的资源。 要在项目的根目录中执行此操作 terraform-examples/examples/vpc/server_local_root_disk 让我们运行命令来删除 OpenStack 对象:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform destroy -target=module.server_local_root_disk

然后运行命令清除 Selectel VPC API 对象:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform destroy -target=module.project_with_user

在这两种情况下,您都需要确认删除所有对象:

Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.

Enter a value: yes

下面的例子是在目录中 terraform-examples/examples/vpc/kubernetes_cluster.

此示例创建一个项目、一名在该项目中具有角色的用户,并引发一个 Kubernetes 集群。 在文件中 变量.tf 您可以看到默认值,例如节点数量、节点特征、Kubernetes 版本等。

要创建与第一个示例类似的资源,首先我们将开始初始化模块并创建模块资源 项目用户然后创建其他所有内容:

$ terraform init

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply -target=module.project_with_user

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

我们将通过 OpenStack Magnum 组件转移 Kubernetes 集群的创建和管理。 您可以在我们的其中一个中找到有关如何使用集群的更多信息 以前的文章,以及在 知识库.

准备集群时,将创建磁盘和虚拟机,并安装所有必需的组件。 准备工作大约需要 4 分钟,在此期间 Terraform 将显示如下消息:

module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Still creating... (3m0s elapsed)

安装完成后,Terraform 将指示集群已准备就绪并显示其 ID:

module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Creation complete after 4m20s (ID: 3c8...)

Apply complete! Resources: 6 added, 0 changed, 0 destroyed.

通过实用程序管理创建的 Kubernetes 集群 Kubectl 您需要获取集群访问文件。 为此,请转到您帐户中的项目列表中通过 Terraform 创建的项目:

Terraform 提供商 Selectel

接下来,请点击链接 xxxxxx.selvpc.ru它出现在项目名称下方:

Terraform 提供商 Selectel

有关登录信息,请使用您通过 Terraform 创建的用户名和密码。 如果你没有被骗 变量.tf или 主文件 对于我们的示例,用户的名称为 tf_用户。 您必须使用变量的值作为密码 TF_VAR_用户_密码,在启动时指定 地形应用 较早。

在项目内部,您需要转到选项卡 Kubernetes:

Terraform 提供商 Selectel

这是通过 Terraform 创建的集群所在的位置。 下载文件为 Kubectl 您可以在“访问”选项卡上:

Terraform 提供商 Selectel

安装说明位于同一选项卡上。 Kubectl 以及下载的使用 配置文件.

发射后 Kubectl 并设置环境变量 库贝配置 你可以使用 Kubernetes:

$ kubectl get pods --all-namespaces

NAMESPACE        NAME                                    READY  STATUS  RESTARTS AGE
kube-system   coredns-9578f5c87-g6bjf                      1/1   Running   0 8m
kube-system   coredns-9578f5c87-rvkgd                     1/1   Running   0 6m
kube-system   heapster-866fcbc879-b6998                 1/1   Running   0 8m
kube-system   kube-dns-autoscaler-689688988f-8cxhf             1/1   Running   0 8m
kube-system   kubernetes-dashboard-7bdb5d4cd7-jcjq9          1/1   Running   0 8m
kube-system   monitoring-grafana-84c97bb64d-tc64b               1/1   Running   0 8m
kube-system   monitoring-influxdb-7c8ccc75c6-dzk5f                1/1   Running   0 8m
kube-system   node-exporter-tf-cluster-rz6nggvs4va7-minion-0 1/1   Running   0 8m
kube-system   node-exporter-tf-cluster-rz6nggvs4va7-minion-1 1/1   Running   0 8m
kube-system   openstack-cloud-controller-manager-8vrmp        1/1   Running   3 8m
prometeus-monitoring   grafana-76bcb7ffb8-4tm7t       1/1   Running   0 8m
prometeus-monitoring   prometheus-75cdd77c5c-w29gb           1/1   Running   0 8m

集群节点的数量可以通过 Terraform 轻松更改。
在文件中 主文件 指定以下值:

cluster_node_count = "${var.cluster_node_count}"

该值替换自 变量.tf:

variable "cluster_node_count" {
default = 2
}

您可以更改其中的默认值 变量.tf,或者直接在中指定所需的值 主文件:

-  cluster_node_count = "${var.cluster_node_count}"
+  cluster_node_count = 3

要应用更改(如第一个示例所示),请使用命令 地形应用:

$ env 
TF_VAR_sel_account=SEL_ACCOUNT 
TF_VAR_sel_token=SEL_TOKEN 
TF_VAR_user_password=USER_PASSWORD 
terraform apply

当节点数量发生变化时,集群仍将保持可用。 通过 Terraform 添加节点后,无需额外配置即可使用:

$ kubectl get nodes
NAME                               STATUS                     ROLES     AGE   VERSION
tf-cluster-rz6nggvs4va7-master-0   Ready,SchedulingDisabled   master    8m    v1.12.4
tf-cluster-rz6nggvs4va7-minion-0   Ready                      <none>    8m    v1.12.4
tf-cluster-rz6nggvs4va7-minion-1   Ready                      <none>    8m    v1.12.4
tf-cluster-rz6nggvs4va7-minion-2   Ready                      <none>    3m    v1.12.4

结论

在本文中,我们了解了使用的主要方法 “虚拟私有云” 通过地形。 如果您使用官方 Selectel Terraform 提供商并提供反馈,我们将非常高兴。

Selectel Terraform 提供程序中发现的任何错误都可以通过以下方式报告 Github 问题.

来源: habr.com

添加评论