
我们启动了正式的Terraform提供商以与Selectel合作。 该产品允许用户通过“基础结构即代码”方法完全实施资源管理。
当前,提供商支持服务
“虚拟私有云” (以下简称VPC)的资源管理。 将来,我们计划向其中添加Selectel提供的其他服务的资源管理。
如您所知,VPC服务基于OpenStack。 但是,由于OpenStack并未提供用于服务公共云的本机工具,我们在一组附加的API中实现了缺少的功能,这些API简化了复杂复合对象的管理并简化了工作。 OpenStack中可用的部分功能已禁止直接使用,但可以通过
我们的API进行访问。
Selectel Terraform提供程序现在可以管理以下VPC资源:
- 项目及其配额;
- 用户,他们的角色和令牌;
- 公共子网,包括跨区域和VRRP;
- 软件许可证。
提供者使用我们的公共Go-library与VPC API一起使用。 库和提供程序本身都是开源的,它们是在Github上开发的:
要管理其他云资源,例如虚拟机,磁盘,Kubernetes群集,可以使用OpenStack Terraform提供程序。 可以在以下链接中找到两家提供商的官方文档:
开始使用
首先,您需要安装Terraform(说明和安装包的链接可以在
官方网站上找到)。
要正常工作,提供程序需要Selectel API密钥,该密钥在
控制面板中为该帐户创建 。
使用Selectel的清单是使用Terraform或使用我们在Github存储库中可用的一组现成示例创建的:
terraform-examples 。
带有示例的存储库分为两个目录:
- 模块 ,包含小型可重用模块,这些模块化模块将一组参数作为输入并管理一小部分资源;
- examples ,包含一组完整的互连模块的示例。
安装Terraform,创建Selectel API密钥并熟悉示例之后,我们继续进行实际示例。
使用本地磁盘创建服务器的示例
考虑创建项目的示例,具有角色的用户和具有本地磁盘的虚拟机:
terraform-examples / examples / vpc / server_local_root_disk 。
vars.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" }
在
main.tf文件中,Selectel提供程序已初始化:
provider "selectel" { token = "${var.sel_token}" }
此文件还包含将在服务器上安装的SSH密钥的默认值:
module "server_local_root_disk" { ... server_ssh_key = "${file("~/.ssh/id_rsa.pub")}" }
如有必要,您可以指定其他公共密钥。 不必将键指定为文件的路径;您还可以将值添加为字符串。
在该文件中,进一步启动了
project_with_user和
server_local_root_disk模块,它们管理必要的资源。
我们将更详细地分析这些模块。
创建具有角色的项目和用户
第一个模块创建一个项目和一个在该项目中具有角色的用户:
terraform-examples / modules / vpc / project_with_user 。
创建的用户将能够登录OpenStack并管理其资源。 该模块很简单,仅管理三个实体:
- selectel_vpc_project_v2,
- selectel_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 } }
ignore_changes参数允许
您忽略用于创建虚拟机的映像的
id属性更改。 在VPC服务中,大多数公共映像每周都会自动更新一次,其
ID也会更改。 这是由于OpenStack-Glance组件的功能所致,其中图像被视为不可变的实体。
如果创建或修改了使用公共映像的
id作为
image_id参数的现有服务器或磁盘,则在更新该映像后,重新启动Terraform清单将重新创建服务器或磁盘。 使用
ignore_changes参数可以避免这种情况。
注意: ignore_changes 参数 很久以前就出现在Terraform中: pull#2525 。要成功调整本地磁盘,核心或服务器内存的大小,需要
ignore_resize_confirmation参数。 此类更改是通过使用
调整大小请求的OpenStack Nova组件进行的。 默认情况下,Nova在
调整大小请求后将服务器置于
verify_resize状态,并等待用户的其他确认。 但是,可以更改此行为,以使Nova无需等待用户的其他操作。
指定的参数允许Terraform不等待服务器的
verify_resize状态,并为更改参数后服务器处于活动状态做好准备。 该参数可从OpenStack Terraform提供程序的1.10.0版本获得:
pull#422 。
资源创造
在启动清单之前,应该注意,在我们的示例中,启动了两个不同的提供程序,并且OpenStack提供程序取决于Selectel提供程序的资源,因为如果不在项目中创建用户就无法管理属于它的对象。 不幸的是,出于同样的原因,我们不能只在示例中运行
terraform apply命令 。 我们将需要首先
申请 project_with_user模块,然后再申请其他所有内容。
注意:此问题尚未在Terraform中解决,您可以按照在Github上第2430期和第4149 期中的讨论进行。要创建资源,我们将转到
terraform-examples / examples / vpc / server_local_root_disk目录 ,其内容应如下所示:
$ ls README.md main.tf vars.tf
我们使用以下命令初始化模块:
$ terraform init
输出显示Terraform下载了所使用的提供程序的最新版本,并检查了示例中描述的所有模块。
首先,应用
project_with_user模块。 在这种情况下,您需要手动传输尚未设置的变量的值:
- sel_account和您的Selectel帐号;
- sel_token带有Selectel API的密钥;
- user_password和OpenStack用户的密码。
前两个变量的值必须从
控制面板中获取 。
对于最后一个变量,您可以想到任何密码。
要使用该模块,必须
通过运行以下命令来替换值
SEL_ACCOUNT ,
SEL_TOKEN和
USER_PASSWORD :
$ 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
创建资源时,请注意带有外部IP地址的Terraform输出,在该IP地址上可以访问创建的服务器:
module.server_local_root_disk.openstack_networking_floatingip_associate_v2.association_1: Creating... floating_ip: "" => "xxxx"
您可以在指定IP上通过SSH使用创建的虚拟机。
资源编辑
除了通过Terraform创建资源外,还可以对其进行修改。
例如,通过更改
示例/vpc/server_local_root_disk/main.tf文件中的
server_vcpus和
server_ram_mb参数的值,增加服务器的内核和内存的数量:
- 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进行了更改。
请注意,这将导致重新创建的虚拟机。要应用新的虚拟机配置,请使用我们之前已经运行过的
terraform apply命令 。
所有创建的对象将显示在
VPC控制面板中 :

在我们的
示例存储库中,您还可以看到用于创建具有网络驱动器的虚拟机的清单。
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集群。 在
vars.tf文件中,
您可以看到默认值,例如节点数,它们的特征,Kubernetes的版本等。
要创建资源,类似于第一个示例,首先,我们将初始化模块并创建
project_with_user模块资源,然后创建其余资源:
$ 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将通知您集群已准备就绪,并显示其标识符:
module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Creation complete after 4m20s (ID: 3c8...) Apply complete! Resources: 6 added, 0 changed, 0 destroyed.
要通过kubectl实用程序管理创建的Kubernetes集群,必须获取集群访问文件。 为此,请转到您帐户中项目列表中通过Terraform创建的项目:

接下来,
单击格式为
xxxxxx.selvpc.ru的链接,该链接显示在项目名称下方:

使用通过Terraform创建的用户名和密码作为登录信息。 如果您没有为我们的示例更改
vars.tf或
main.tf ,则该用户的名称
将为tf_user 。 作为密码,使用变量
TF_VAR_user_password的值,该值
是在较早运行
terraform apply时指定的。
在项目内部,您需要转到
Kubernetes选项卡:

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

该选项卡包含有关安装
kubectl和使用下载的
config.yaml的说明 。
启动
kubectl并设置环境变量
KUBECONFIG后,可以使用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轻松更改。
在
main.tf文件中指定了以下值:
cluster_node_count = "${var.cluster_node_count}"
该值从vars.tf代替 :
variable "cluster_node_count" { default = 2 }
您可以在
vars.tf中更改默认值,或直接在
main.tf中指定所需的值:
- cluster_node_count = "${var.cluster_node_count}" + cluster_node_count = 3
如第一个示例一样,要应用更改,请使用
terraform apply命令 :
$ 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
结论
在本文中,我们了解了通过Terraform使用
“虚拟私有云”的基本方法。 如果您使用官方的Terraform提供商Selectel并提供反馈,我们将非常高兴。
可以通过
Github Issues报告Terraform提供程序Selectel的所有发现的错误。