Terraform Provider Selectel





Selectelと連携するために公式のTerraformプロバイダーを立ち上げました。 この製品を使用すると、Infrastructure-as-code方法論を通じてリソース管理を完全に実装できます。



現在、プロバイダーはVirtual Private Cloudサービス (以下、VPCと呼びます)のリソース管理をサポートしています。 将来的には、Selectelが提供する他のサービスのリソース管理を追加する予定です。



既にご存じのとおり、VPCサービスはOpenStackに基づいています。 ただし、OpenStackがパブリッククラウドにサービスを提供するネイティブツールを提供しないという事実により、複雑な複合オブジェクトの管理を簡素化し、作業をより便利にする一連の追加APIに不足している機能を実装しました。 OpenStackで利用可能な機能の一部は直接使用が禁止されていますが、APIからアクセスできます



TerraformプロバイダーSelectelは、次のVPCリソースを管理する機能を実装するようになりました。





プロバイダーは、パブリックGoライブラリを使用してVPC APIを操作します。 ライブラリとプロバイダー自体は両方ともオープンソースであり、Githubで開発されています。





仮想マシン、ディスク、Kubernetesクラスターなどの他のクラウドリソースを管理するには、OpenStack Terraformプロバイダーを使用できます。 両方のプロバイダーの公式ドキュメントは、次のリンクから入手できます。





はじめに



開始するには、Terraformをインストールする必要があります(インストールパッケージへの指示とリンクは、 公式Webサイトにあります )。



プロバイダーが機能するには、アカウントのコントロールパネルで作成されるSelectel APIキーが必要です



Selectelで作業するためのマニフェストは、Terraformを使用して、またはGithubリポジトリで利用可能な既製のサンプルセットを使用して作成されます: terraform-examples



例を含むリポジトリは、2つのディレクトリに分かれています。





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にログインし、そのリソースを管理できます。 モジュールはシンプルで、3つのエンティティのみを管理します。





ローカルディスクで仮想サーバーを作成する



2番目のモジュールは、ローカルディスクでサーバーを作成するために必要な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サービスでは、ほとんどの公開画像は週に1回自動的に更新され、 IDも変更されます。 これは、イメージが不変のエンティティと見なされるOpenStack-Glanceコンポーネントの機能によるものです。



image_id引数としてパブリックイメージの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



リソース作成



マニフェストを起動する前に、この例では2つの異なるプロバイダーが起動されます。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モジュールを適用します。 この場合、設定されていない変数の値を手動で転送する必要があります。





最初の2つの変数の値は、 コントロールパネルから取得する必要があります。



最後の変数については、任意のパスワードを考えることができます。



モジュールを使用するには、次のコマンドを実行して、値SEL_ACCOUNTSEL_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の出力に注意してください。



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





指定したIPでSSHを介して、作成した仮想マシンを操作できます。



リソース編集



Terraformを介したリソースの作成に加えて、リソースを変更することもできます。



たとえば、 examples / 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にあります。



この例では、プロジェクト、プロジェクト内のロールを持つユーザーを作成し、1つの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クラスターの作成と管理を行います。 クラスターの操作方法の詳細については、 以前の記事の 1つと、知識ベースをご覧ください。



クラスターの準備中に、ディスク、仮想マシンが作成され、必要なすべてのコンポーネントがインストールされます。 準備には約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.
      
      





作成されたKubernetesクラスターをkubectlユーティリティで管理するには、クラスターアクセスファイルを取得する必要あります。 これを行うには、アカウント内のプロジェクトのリストで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を通じて「仮想プライベートクラウド」を操作する基本的な方法について学びました。 Selectel Terraformの公式プロバイダーを使用してフィードバックを提供していただければ幸いです。



TerraformプロバイダーSelectelで見つかったすべてのバグは、 Github Issuesで報告できます。



All Articles