Fournisseur Terraform Selectel

Fournisseur Terraform Selectel

Nous avons lancé un fournisseur Terraform officiel pour travailler avec Selectel. Ce produit permet aux utilisateurs de mettre pleinement en œuvre la gestion des ressources grâce à la méthodologie Infrastructure-as-code.

Le fournisseur prend actuellement en charge la gestion des ressources de service "Cloud privé virtuel" (ci-après dénommé VPC). À l'avenir, nous prévoyons d'ajouter la gestion des ressources pour d'autres services fournis par Selectel.

Comme vous le savez déjà, le service VPC est construit sur OpenStack. Cependant, étant donné qu'OpenStack ne fournit pas d'outils natifs pour servir le cloud public, nous avons implémenté les fonctionnalités manquantes dans un ensemble d'API supplémentaires qui simplifient la gestion d'objets composites complexes et rendent le travail plus pratique. Certaines fonctionnalités disponibles dans OpenStack ne peuvent pas être utilisées directement, mais sont disponibles via notre API.

Le fournisseur Selectel Terraform inclut 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 de logiciels.

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, leur développement est réalisé 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 aux liens suivants :

Mise en route

Pour commencer, vous devez installer Terraform (les instructions et les liens vers les packages d'installation peuvent être trouvés sur le site officiel).

Pour fonctionner, le fournisseur a besoin d'une clé API Selectel, qui est créée dans panneaux de contrôle de 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 : exemples de terraform.

Le référentiel avec les 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 vous être familiarisé avec les exemples, passons aux exemples pratiques.

Un exemple de création d'un serveur avec un disque local

Regardons un exemple de 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.

En fichier vars.tf tous les paramètres qui seront utilisés lors de l'appel des modules sont décrits. 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"
}

En 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é sous forme de chemin de fichier ; vous pouvez également ajouter la valeur sous forme de chaîne.

Plus loin dans ce fichier, les modules sont lancés projet_avec_utilisateur и serveur_local_root_disk, qui gèrent les ressources nécessaires.

Examinons ces modules plus en détail.

Créer un projet et 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 gère seulement trois entités :

  • selectel_vpc_project_v2,
  • selectel_vpc_user_v2,
  • selectel_vpc_role_v2.

Création d'un serveur virtuel avec disque local

Le deuxième module traite de la gestion des objets OpenStack, nécessaires à la création d'un serveur avec un disque local.

Vous devez prêter attention à certains des arguments 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
  }
}

Argument ignore_changes vous permet d'ignorer les changements d'attributs 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 en même temps leur id change également. Cela est dû aux particularités du composant OpenStack - Glance, dans lequel les images sont considérées comme des entités immuables.

Si vous créez ou modifiez un serveur ou un disque existant ayant comme argument id_image d'occasion id image publique, puis une fois cette image mise à jour, l'exécution à nouveau du manifeste Terraform recréera le serveur ou le disque. Utiliser un argument ignore_changes vous permet d'éviter une telle situation.

Remarque : argument ignore_changes est apparu dans Terraform il y a assez longtemps : tirer#2525.

Argument ignore_resize_confirmation 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 d'une requête redimensionner. Nova par défaut après demande redimensionner met le serveur en statut vérifier_resize et attend une confirmation supplémentaire de l'utilisateur. Cependant, ce comportement peut être modifié afin 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 vérifier_resize pour le serveur et soyez prêt à ce que le serveur soit dans un état actif après avoir modifié ses paramètres. L'argument est disponible à partir de la version 1.10.0 du fournisseur OpenStack Terraform : tirer#422.

Création de ressources

Avant d'exécuter les manifestes, notez que dans notre exemple, deux fournisseurs différents sont lancés, et le fournisseur OpenStack dépend des ressources du fournisseur Selectel, puisque sans créer d'utilisateur dans le projet, il est impossible de gérer les objets qui lui appartiennent. . Malheureusement, pour la même raison, nous ne pouvons pas simplement exécuter la commande terraform applique dans notre exemple. Nous devons d'abord faire vous inscrire pour module projet_avec_utilisateur et après pour tout le reste.

Remarque : Ce problème n'est pas encore résolu dans Terraform, vous pouvez suivre la discussion sur Github à l'adresse numéro 2430 и numéro 4149.

Pour créer des ressources, allez dans le répertoire terraform-examples/examples/vpc/server_local_root_disk, son contenu devrait ressembler à ceci :

$ ls
README.md	   main.tf		vars.tf

On initialise les modules à l'aide de la commande :

$ terraform init

Le résultat montre que Terraform télécharge les dernières versions des fournisseurs qu'il utilise et vérifie tous les modules décrits dans l'exemple.

Appliquons d'abord le module projet_avec_utilisateur. Cela nécessite de transmettre manuellement des valeurs pour les variables qui n'ont pas été définies :

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

Les valeurs des deux premières variables doivent être extraites de panneaux de contrôle.

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

Pour utiliser le module, vous devez remplacer les valeurs SEL_ACCOUNT, SEL_TOKEN и MOT DE PASSE DE L'UTILISATEUR 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 affichera les ressources qu'il souhaite créer et demandera une confirmation :

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 l'adresse IP externe où le serveur créé sera accessible :

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

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

Modification des ressources

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

Par exemple, augmentons le nombre de cœurs et de mémoire de notre serveur en modifiant les valeurs des paramètres serveur_vcpus и serveur_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 les changements que cela entraînera en utilisant 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 modifié les ressources openstack_compute_instance_v2 и openstack_compute_flavor_v2.

Veuillez noter que cela impliquera le redémarrage de la machine virtuelle créée.

Pour appliquer la nouvelle configuration de la machine virtuelle, utilisez la commande terraform applique, que nous avons déjà lancé plus tôt.

Tous les objets créés seront affichés dans Panneaux de contrôle VPC:

Fournisseur Terraform Selectel

В нашем exemples de référentiels Vous pouvez également consulter des manifestes pour créer des machines virtuelles avec des lecteurs réseau.

Exemple de création d'un cluster Kubernetes

Avant de passer à l’exemple suivant, nous allons nettoyer les ressources que nous avons créées précédemment. Pour faire cela à la racine du projet terraform-examples/examples/vpc/server_local_root_disk Exécutons 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

Exécutez ensuite la commande pour effacer les objets de l'API Selectel VPC :

$ 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 génère 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 similaires au premier exemple, nous allons tout d’abord commencer par initialiser les modules et créer des ressources de module projet_avec_utilisateurpuis créer tout 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 transférerons 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 base de connaissances.

Lors de la préparation du cluster, des disques et des machines virtuelles seront créés et tous les composants nécessaires seront installés. La préparation prend environ 4 minutes, pendant lesquelles Terraform affichera des messages tels que :

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

Une fois l'installation terminée, Terraform indiquera que le cluster est prêt et affichera son 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.

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

Fournisseur Terraform Selectel

Ensuite, suivez le lien comme xxxxxx.selvpc.ruqui apparaît sous le nom du projet :

Fournisseur Terraform Selectel

Pour les informations de connexion, utilisez le nom d'utilisateur et le mot de passe que vous avez créés via Terraform. Si tu n'as pas triché vars.tf ou main.tf pour notre exemple, l'utilisateur aura le nom tf_utilisateur. Vous devez utiliser la valeur de la variable comme mot de passe TF_VAR_user_password, qui a été spécifié au démarrage terraform applique plus tôt.

Dans le projet, vous devez accéder à l'onglet Kubernetes:

Fournisseur Terraform Selectel

C'est ici que se trouve le cluster créé via Terraform. Télécharger le fichier pour kubectl vous pouvez sur l'onglet « Accès » :

Fournisseur Terraform Selectel

Les instructions d'installation se trouvent sur le même onglet. kubectl et l'utilisation du fichier téléchargé config.yaml.

Après le démarrage du kubectl et définir 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 peut être facilement modifié via Terraform.
En fichier main.tf la valeur suivante est spécifiée :

cluster_node_count = "${var.cluster_node_count}"

Cette valeur est remplacée par vars.tf:

variable "cluster_node_count" {
default = 2
}

Vous pouvez modifier la valeur par défaut dans vars.tf, ou spécifiez 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 applique:

$ 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 restera 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 nous sommes familiarisés avec les principales façons de travailler avec "Cloud privé virtuel" via Terraform. Nous serons heureux si vous utilisez le fournisseur officiel Terraform Selectel et que vous nous faites part de vos commentaires.

Tous les bugs trouvés dans le fournisseur Selectel Terraform peuvent être signalés via Problèmes Github.

Source: habr.com

Ajouter un commentaire