Terraform提供商Selectel



我们启动了正式的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_userserver_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_ACCOUNTSEL_TOKENUSER_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_vcpusserver_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_v2openstack_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.tfmain.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的所有发现的错误。

Source: https://habr.com/ru/post/zh-CN445162/


All Articles