Terraform 提供商 Selectel

Terraform 提供商 Selectel

我們已經啟動了官方 Terraform 提供程序來與 Selectel 合作。 該產品允許用戶通過基礎設施即代碼方法論(基礎設施即代碼)全面實施資源管理。

提供商目前支持服務資源管理 “虛擬私有云” (以下簡稱專有網絡)。 未來,我們計劃將Selectel提供的其他服務的資源管理添加到其中。

如您所知,VPC 服務構建在 OpenStack 之上。 然而,由於 OpenStack 不提供用於服務公共雲的原生工具,我們在一組附加 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 描述了調用模塊時將使用的所有參數。 其中一些有默認值,例如,服務器將在區域中創建 en-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"
}

在文件中 主.tf 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_用戶。 變量的值必須用作密碼 TF_VAR_用戶_密碼,在啟動時指定 地形應用 較早。

在項目內部,您需要轉到選項卡 Kubernetes:

Terraform 提供商 Selectel

這是通過 Terraform 創建的集群。 下載文件為 Kubectl 您可以在“訪問”選項卡上:

Terraform 提供商 Selectel

該選項卡包含安裝說明。 Kubectl 並使用下載的 配置.yaml.

發射後 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 可以輕鬆更改集群節點的數量。
在文件中 主.tf 給出以下值:

cluster_node_count = "${var.cluster_node_count}"

該值替換自 變量.tf:

variable "cluster_node_count" {
default = 2
}

您可以更改其中的默認值 變量.tf,或者直接在中指定所需的值 主.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 問題.

來源: www.habr.com

添加評論