Terraform Provider Selectel



Nous avons lancé le fournisseur officiel Terraform pour travailler avec Selectel. Ce produit permet aux utilisateurs d'implémenter pleinement la gestion des ressources via la méthodologie Infrastructure-as-code.

Actuellement, le fournisseur prend en charge la gestion des ressources du service Virtual Private Cloud (ci-après dénommé VPC). À l'avenir, nous prévoyons d'y ajouter la gestion des ressources d'autres services fournis par Selectel.

Comme vous le savez déjà, le service VPC est basé sur OpenStack. Cependant, étant donné qu'OpenStack ne fournit pas d'outils natifs pour la maintenance du cloud public, nous avons implémenté la fonctionnalité manquante dans un ensemble d'API supplémentaires qui simplifient la gestion des objets composites complexes et rendent le travail plus pratique. Une partie des fonctionnalités disponibles dans OpenStack est fermée à une utilisation directe, mais est accessible via notre API .

Le fournisseur Selectel Terraform offre désormais la possibilité de gérer les ressources VPC suivantes:

  • les projets et leurs quotas;
  • les utilisateurs, leurs rôles et jetons;
  • sous-réseaux publics, y compris interrégionaux et VRRP;
  • licences logicielles.

Le fournisseur utilise notre bibliothèque publique Go pour travailler avec l'API VPC. La bibliothèque et le fournisseur lui-même sont open-source, ils sont en cours de développement sur Github:


Pour gérer d'autres ressources cloud, telles que des machines virtuelles, des disques, des clusters Kubernetes, vous pouvez utiliser le fournisseur OpenStack Terraform. La documentation officielle des deux fournisseurs est disponible sur les liens suivants:


Pour commencer


Pour commencer, vous devez installer Terraform (les instructions et les liens vers les packages d'installation se trouvent sur le site officiel ).

Pour fonctionner, le fournisseur requiert la clé API Selectel, qui est créée dans le panneau de configuration du compte .

Les manifestes pour travailler avec Selectel sont créés à l'aide de Terraform ou à l'aide d'un ensemble d'exemples prêts à l'emploi disponibles dans notre référentiel Github: terraform-examples .

Le référentiel avec des exemples est divisé en deux répertoires:

  • modules , contenant de petits modules réutilisables qui prennent un ensemble de paramètres en entrée et gèrent un petit ensemble de ressources;
  • exemples , contenant des exemples d'un ensemble complet de modules interconnectés.

Après avoir installé Terraform, créé une clé API Selectel et pris connaissance des exemples, nous passons à des exemples pratiques.

Exemple de création d'un serveur avec un disque local


Prenons l'exemple de la création d'un projet, d'un utilisateur avec un rôle et d'une machine virtuelle avec un disque local: terraform-examples / examples / vpc / server_local_root_disk .

Le fichier vars.tf décrit tous les paramètres qui seront utilisés lors de l'appel des modules. Certains d'entre eux ont des valeurs par défaut, par exemple, le serveur sera créé dans la zone ru-3a avec la configuration suivante:

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" } 

Dans le fichier main.tf , le fournisseur Selectel est initialisé:

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

Ce fichier contient également la valeur par défaut de la clé SSH qui sera installée sur le serveur:

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

Si nécessaire, vous pouvez spécifier une clé publique différente. Il n'est pas nécessaire de spécifier la clé comme chemin d'accès au fichier; vous pouvez également ajouter une valeur sous forme de chaîne.

Plus loin dans ce fichier, les modules project_with_user et server_local_root_disk sont lancés, qui gèrent les ressources nécessaires.

Nous analyserons ces modules plus en détail.

Création d'un projet et d'un utilisateur avec un rôle


Le premier module crée un projet et un utilisateur avec un rôle dans ce projet: terraform-examples / modules / vpc / project_with_user .

L'utilisateur créé pourra se connecter à OpenStack et gérer ses ressources. Le module est simple et ne gère que trois entités:

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Création d'un serveur virtuel avec un disque local


Le deuxième module gère les objets OpenStack nécessaires à la création d'un serveur avec un disque local.

Vous devez prêter attention à certains des arguments qui sont spécifiés dans ce module pour la ressource openstack_compute_instance_v2 :

 resource "openstack_compute_instance_v2" "instance_1" { ... lifecycle { ignore_changes = ["image_id"] } vendor_options { ignore_resize_confirmation = true } } 

L'argument ignore_changes vous permet d'ignorer le changement d'attribut id pour l'image utilisée pour créer la machine virtuelle. Dans le service VPC, la plupart des images publiques sont mises à jour automatiquement une fois par semaine et leur identifiant change également. Cela est dû aux fonctionnalités du composant OpenStack - Glance, dans lequel les images sont considérées comme des entités immuables.

Si un serveur ou un disque existant est créé ou modifié, qui utilise l' ID de l' image publique comme argument image_id , une fois cette image mise à jour, le redémarrage du manifeste Terraform recréera le serveur ou le disque. L'utilisation de l'argument ignore_changes évite cette situation.

Remarque: l'argument ignore_changes est apparu dans Terraform il y a longtemps: pull # 2525 .

L'argument ignore_resize_confirmation est nécessaire pour redimensionner avec succès le disque local, les cœurs ou la mémoire du serveur. Ces modifications sont effectuées via le composant OpenStack Nova à l'aide de la demande de redimensionnement . Par défaut, Nova après une demande de redimensionnement met le serveur dans l'état verify_resize et attend une confirmation supplémentaire de l'utilisateur. Cependant, ce comportement peut être modifié pour que Nova n'attende pas d'actions supplémentaires de la part de l'utilisateur.

L'argument spécifié permet à Terraform de ne pas attendre le statut verify_resize pour le serveur et d'être préparé pour que le serveur soit dans l'état actif après avoir changé ses paramètres. L'argument est disponible à partir de la version 1.10.0 du fournisseur OpenStack Terraform: pull # 422 .

Création de ressources


Avant de lancer des manifestes, il convient de noter que dans notre exemple, deux fournisseurs différents sont lancés et que le fournisseur OpenStack dépend des ressources du fournisseur Selectel, car il est impossible de gérer les objets lui appartenant sans créer un utilisateur dans le projet. Malheureusement, pour la même raison, nous ne pouvons pas simplement exécuter la commande terraform apply dans notre exemple. Nous devrons d'abord postuler pour le module project_with_user et ensuite pour tout le reste.

Remarque: ce problème n'a pas encore été résolu dans Terraform, vous pouvez suivre sa discussion sur Github dans les numéros 2430 et 4149 .

Pour créer des ressources, nous allons aller dans le répertoire terraform-examples / examples / vpc / server_local_root_disk , son contenu devrait être comme ceci:

 $ ls README.md main.tf vars.tf 

Nous initialisons les modules à l'aide de la commande:

 $ terraform init 

La sortie montre que Terraform télécharge les dernières versions des fournisseurs utilisés et vérifie tous les modules décrits dans l'exemple.

Tout d'abord, appliquez le module project_with_user . Dans ce cas, vous devez transférer manuellement les valeurs des variables qui n'ont pas été définies:

  • sel_account avec votre numéro de compte Selectel;
  • sel_token avec votre clé pour l'API Selectel;
  • mot_de_passe_utilisateur avec mot de passe pour l'utilisateur OpenStack.

Les valeurs des deux premières variables doivent être extraites du panneau de commande .

Pour la dernière variable, vous pouvez penser à n'importe quel mot de passe.

Pour utiliser le module, il est nécessaire de remplacer les valeurs SEL_ACCOUNT , SEL_TOKEN et USER_PASSWORD en exécutant la commande:

 $ 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 

Après avoir exécuté la commande Terraform, il montrera quelles ressources il veut créer et devra être confirmé:

 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 

Une fois le projet, l'utilisateur et le rôle créés, vous pouvez commencer à créer les ressources restantes:

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

Lors de la création de ressources, faites attention à la sortie Terraform avec une adresse IP externe à laquelle le serveur créé sera accessible:

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

Vous pouvez travailler avec la machine virtuelle créée via SSH sur l'IP spécifiée.

Modification des ressources


En plus de créer des ressources via Terraform, elles peuvent également être modifiées.

Par exemple, augmentez le nombre de cœurs et de mémoire pour notre serveur en modifiant les valeurs des paramètres server_vcpus et server_ram_mb dans le fichier examples / 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 

Après cela, nous vérifions quelles modifications cela entraînera à l'aide de la commande suivante:

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

En conséquence, Terraform a apporté des modifications aux ressources openstack_compute_instance_v2 et openstack_compute_flavor_v2 .

Veuillez noter que cela entraînera un redémarrage de la machine virtuelle créée.

Pour appliquer la nouvelle configuration de machine virtuelle, utilisez la commande terraform apply , que nous avons déjà exécutée précédemment.

Tous les objets créés seront affichés dans le panneau de configuration VPC :



Dans notre référentiel d'exemples, vous pouvez également voir des manifestes pour créer des machines virtuelles avec des lecteurs réseau.

Exemple de cluster Kubernetes


Avant de passer à l'exemple suivant, nous effacerons les ressources précédemment créées. Pour ce faire, dans la racine du projet terraform-examples / examples / vpc / server_local_root_disk, exécutez la commande pour supprimer les objets 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 

Ensuite, exécutez la commande Selectel VPC API Object Cleanup:

 $ 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 

Dans les deux cas, vous devrez confirmer la suppression de tous les objets:

 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 

L'exemple suivant se trouve dans le répertoire terraform-examples / examples / vpc / kubernetes_cluster .

Cet exemple crée un projet, un utilisateur avec un rôle dans le projet et lève un cluster Kubernetes. Dans le fichier vars.tf , vous pouvez voir les valeurs par défaut, telles que le nombre de nœuds, leurs caractéristiques, la version de Kubernetes, etc.

Pour créer des ressources, comme dans le premier exemple, la première chose que nous ferons est d'initialiser les modules et de créer les ressources du module project_with_user , puis de créer le reste:

 $ 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 

Nous transmettons la création et la gestion des clusters Kubernetes via le composant OpenStack Magnum. Vous pouvez en savoir plus sur la façon de travailler avec un cluster dans l'un de nos articles précédents , ainsi que dans la base de connaissances .

Pendant la préparation du cluster, des disques, des machines virtuelles seront créés et tous les composants nécessaires seront installés. La préparation dure environ 4 minutes, moment auquel Terraform affichera les messages du formulaire:

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

Une fois l'installation terminée, Terraform vous informera que le cluster est prêt et affichera son identifiant:

 module.kubernetes_cluster.openstack_containerinfra_cluster_v1.cluster_1: Creation complete after 4m20s (ID: 3c8...) Apply complete! Resources: 6 added, 0 changed, 0 destroyed. 

Pour gérer le cluster Kubernetes créé via l'utilitaire kubectl, vous devez obtenir le fichier d'accès au cluster. Pour ce faire, accédez au projet créé via Terraform dans la liste des projets de votre compte:



Ensuite, suivez le lien du formulaire xxxxxx.selvpc.ru , qui s'affiche sous le nom du projet:



Utilisez le nom d'utilisateur et le mot de passe créés via Terraform comme informations de connexion. Si vous n'avez pas modifié vars.tf ou main.tf pour notre exemple, l'utilisateur aura le nom tf_user . En tant que mot de passe, utilisez la valeur de la variable TF_VAR_user_password , qui a été spécifiée lors de l'exécution antérieure de terraform apply .

Dans le projet, vous devez aller dans l'onglet Kubernetes :



Voici un cluster créé via Terraform. Vous pouvez télécharger le fichier pour kubectl sur l'onglet «Accès»:



Le même onglet contient des instructions pour installer kubectl et utiliser le fichier config.yaml téléchargé.

Après avoir démarré kubectl et défini la variable d'environnement KUBECONFIG, vous pouvez utiliser 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 

Le nombre de nœuds de cluster est facilement modifié via Terraform.
La valeur suivante est spécifiée dans le fichier main.tf :

 cluster_node_count = "${var.cluster_node_count}" 

Cette valeur est remplacée par vars.tf :



 variable "cluster_node_count" { default = 2 } 

Vous pouvez soit modifier la valeur par défaut dans vars.tf , soit spécifier la valeur requise directement dans main.tf :

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

Pour appliquer les modifications, comme dans le cas du premier exemple, utilisez la commande terraform apply :

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

Lorsque le nombre de nœuds change, le cluster reste disponible. Après avoir ajouté un nœud via Terraform, vous pouvez l'utiliser sans configuration supplémentaire:

 $ 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 

Conclusion


Dans cet article, nous avons découvert les méthodes de base pour travailler avec le «cloud privé virtuel» via Terraform. Nous serons heureux si vous utilisez le fournisseur officiel Terraform Selectel et fournissez des commentaires.

Tous les bogues trouvés du fournisseur Terraform Selectel peuvent être signalés via Github Issues .

Source: https://habr.com/ru/post/fr445162/


All Articles