
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 .