Technique

Comment tout automatiser grâce à l’équation Terraform + Ansible + Elastic Cloud Enterprise

Dans la lignée de notre billet précédemment consacré à l’automatisation de l’installation d’Elastic Cloud Enterprise avec Ansible, cet article vous explique comment prolonger vos efforts et les appliquer au provisionnement de services cloud à l’aide de Terraform. Notre premier article montrait comment déployer et configurer Elastic Cloud Enterprise (ECE) dans trois zones de disponibilité d’AWS grâce à Ansible. Or, le provisionnement d’instances EC2 sous-jacentes et la configuration des groupes de sécurité étaient des procédures entièrement manuelles.

Dans cet article, nous allons un cran plus loin dans la méthodologie en utilisant Terraform pour automatiser le provisionnement et la configuration de ces instances EC2 et groupes de sécurité. En outre, ce logiciel nous permettra d’automatiser l’installation, la configuration et l’exécution du playbook Ansible que nous avons conçu la dernière fois. L’automatisation est une bonne chose.

Au fait, qu’est-ce que Terraform ? Contrairement à ce que je pensais, ce logiciel n’a rien à voir avec Genesis dans Star Trek. D’après ses développeurs, la société HashiCorp, cet outil permet de créer une infrastructure, de la modifier et d’en gérer les versions à l’aide d’une configuration de haut niveau appelée « Infrastructure As Code ». Pratique pour de nombreuses raisons, il comprend notamment tous les paramètres requis pour mettre votre infrastructure en route, en assurer le fonctionnement et la configurer dans des fichiers textes dont les versions peuvent être gérées et qui peuvent faire l’objet d’un CRUD. (Vous voyez ce que je veux dire ?)

Bien qu’AWS soit le fournisseur cloud de référence dans cet article, vous pouvez utiliser Terraform pour provisionner et gérer vos ressources sur tout autre fournisseur cloud. Pour en savoir plus, consultez la liste de ses principaux fournisseurs cloud et celle de ses fournisseurs cloud (apparemment) secondaires. Vous trouverez même un exemple sous GCP dans notre référentiel sur GitHub.

Enfin, comme dans notre précédent article, nous vous montrerons dans les grandes lignes comment créer un environnement ECE approprié pour une petite preuve de faisabilité ou un environnement de développement. Un déploiement de production complet doit utiliser des groupes d’instances, des équilibreurs de charge et d’autres constructions à haute disponibilité qui ne font pas l’objet de la configuration abordée ici. Pour en savoir plus sur la planification et le déploiement de la production, consultez nos documents de planification sur Elastic Cloud Enterprise.

Alors, et si on commençait ?

Tâches

De nouveau, nous nous basons sur l’exemple de petite installation de référence fourni dans la documentation ECE. Toutefois, nos tâches sont relativement différentes :

  1. Installation de Terraform
  2. Définition de l’infrastructure
  3. Exécution
  4. Célébration

Installation de Terraform

Commencez par consulter la documentation de HashiCorp. Vous aurez aussi besoin d’Ansible, que nous avons installé dans le cadre du premier article. Si vous ne l’avez pas déjà fait, consultez aussi la documentation sur Ansible. À l’aide de mon MacBook Pro au clavier si fragile, j’ai réussi à réaliser ces opérations :

> brew install terraform
> brew install ansible

Je dois vous préciser que j’ai utilisé une configuration compatible avec Terraform version 0.12 ou 0.12.19, plus précisément.

Définition de l’infrastructure

Pour réaliser cette tâche, vous devez :

  1. démarrer votre configuration Terraform à l’aide des fichiers que j’ai utilisés ;
  2. les parcourir pour les comprendre ;
  3. définir des variables spécifiques à votre situation.

Démarrer votre configuration Terraform

Comme expliqué ci-dessus, Terraform est un moyen de provisionner l’infrastructure à l’aide de fichiers de configuration. Or, un grand nombre de fichiers de configuration sont disponibles. Pour accélérer le processus, clonez le référentiel ou téléchargez les fichiers de notre référentiel d’exemples sur GitHub. Ces fichiers nous permettent d’exécuter toutes les tâches décrites ici.

Les différentes étapes que je vous présente sont adaptées pour les personnes qui n’ont pas peur d’utiliser l’interface de ligne de commande, comme moi. En effet, c’est bien plus difficile d’écrire les instructions pas à pas !

Étapes
  1. Clonez ou téléchargez le référentiel d’exemples.
    > git clone https://github.com/elastic/examples.git
    	
  2. Accédez à l’emplacement où vous l’avez sauvegardé.
    > cd /workspace/github/elastic/examples
    	
  3. Accédez aux exemples d’ECE sous AWS avec Terraform.
    > cd Cloud\ Enterprise/Getting\ Started\ Examples/aws/terraform
    	
  4. Préparez-vous à éditer un peu de texte.

Parcourir les fichiers

Vous devez disposer des fichiers suivants. Si vous le souhaitez, parcourez-les.

terraform.tfvars.exampleAprès l’avoir renommé terraform.tfvars, nous y configurons nos paramètres secrets et remplaçons toutes les variables de notre choix dans variables.tf.
variables.tfIl contient tout un tas de variables. Nous vous conseillons d’y jeter un coup d’œil.
provider.tfCette configuration de Terraform vous montre comment vous connecter à AWS.
servers.tfCette configuration de Terraform nous permet de trouver l’image de machine virtuelle souhaitée, de déployer nos instances et de capturer les métadonnées des instances à utiliser avec Ansible.
networking.tfCette configuration de Terraform prend en charge plusieurs paramètres du réseau AWS, à savoir un VPC, une passerelle Internet, une table de routage, un sous-réseau et des groupes de sécurité.
main.tfCette configuration de Terraform lance le script Ansible et recueille les données de sortie les plus importantes.
ansible-install.shLe script Terraform modifiera Ansible, en lancera la configuration et l’exécutera avec le rôle ECE.

Définir des variables

Nous devons définir différentes variables pour votre configuration. (J’ai fini la mienne, puisque ça marche déjà chez moi, et je suis là pour vous aider à faire de même.)

  • Un nom de projet qui sera étiqueté sur toutes les ressources AWS créées.
  • Votre adresse IP pour vous assurer que vous seul avez accès en SSH aux instances sous-jacentes. La remplacer par 0.0.0.0/0 est une bonne alternative si vous voulez la partager avec le monde entier.
  • Les identifiants d’accès à AWS pour permettre à Terraform de provisionner des ressources.

Si vous ne disposez pas d’une paire de clés secrètes ou d’un accès à AWS, suivez les consignes de la documentation d’AWS pour en créer.

Remarque : variables.tf définit un emplacement de fichier de clé publique et privée à utiliser pour accéder en SSH aux instances EC2. Si vous n’avez pas de clé SSH, je vous invite à faire une recherche en ligne. DigitalOcean vous donne de bonnes instructions de base pour Linux/OSX et Windows.

Étapes
  1. Renommez terraform.tfvars.example en terraform.tfvars.
  2. Dans terraform.tfvars, apportez les modifications suivantes :
    1. Définissez un project_name permettant d’identifier toutes vos ressources AWS.
    2. Configurez trusted_network pour votre adresse IP dans la notation CIDR ou toute autre plage de votre choix.
    3. Configurez aws_access_key et aws_secret_key à l’aide de vos informations.
    4. Vous pouvez aussi remplacer aws_region, public_key ou private_key, si vous le souhaitez.

Je ne vous demanderai pas de modifier les paramètres des types d’instances EC2 et d’image de machine virtuelle, et ce, pour plusieurs raisons, principalement pour diminuer la complexité au démarrage. Comme précédemment, nous envisageons de déployer trois instances i3.xlarge provenant d’une image de machine virtuelle CentOS 7.

  • Pour nous assurer que Terraform peut trouver la bonne image de machine virtuelle, nous pouvons la fournir avec diverses métadonnées. Dans ce cas, j’ai utilisé un modèle de nom, un identifiant de propriétaire (celui de centos.org) et un type de virtualisation. Ce modèle de nom et cet identifiant de propriétaire peuvent être configurés dans variables.tf. Toutefois, si vous choisissez une autre image de machine virtuelle (comme celle avec Ubuntu), vous devrez peut-être utiliser une valeur différente pour remote_user.
  • Si vous modifiez le type d’instance, ce changement peut avoir des répercussions. Les instances i3 utilisent des disques NVMe connectés en local dotés de paramètres de configuration et d’un nom de périphérique sous un SE spécifique dans Terraform. Si vous utilisez une instance différente et connectez des volumes EBS, vous devrez modifier servers.tf pour la mapper correctement. Pour en savoir plus à ce sujet, consultez la documentation de Terraform.

Les paramètres que j’ai utilisés pour le type d’instances EC2 et d’image de machine virtuelle sont disponibles dans variables.tf.

# Le nom de l’image de machine virtuelle dans AWS Marketplace
variable "aws_ami_name" {
  default = "CentOS Linux 7 x86_64 HVM*"
}
# Le propriétaire de l’image de machine virtuelle
variable "aws_ami_owner" {
  default = "679593333241" # centos.org
}
# L’utilisateur doit se connecter aux instances et réaliser l’installation.
# Cela dépend de l’image de machine virtuelle que vous utilisez. Assurez-vous qu’elles sont synchronisées. Par exemple, une image de machine virtuelle Ubuntu utiliserait l’utilisateur ubuntu.
variable "remote_user" {
  default = "centos"
}
# Type d’instance ECE
variable "aws_instance_type" {
  default = "i3.xlarge"
}
# Le nom du périphérique du volume non racine qui sera utilisé par ECE
# Pour les instances i3, il s’agit de nvme0n1.
# Si vous utilisez un type d’instance différent, cette valeur sera modifiée et pourrait aussi nécessiter de changer la définition des ressources dans servers.tf.
variable "device_name" {
  default="nvme0n1"
}

Exécution

Nous avons presque terminé. Incroyable, non ? Si vous avez utilisé les paramètres par défaut et n’avez pas passé trop de temps à étudier tous les fichiers de configuration, vous devez avoir réussi à installer Terraform, copier certains fichiers et configurer quelques variables. Que reste-t-il à faire ? Il faut exécuter l’infrastructure, tout simplement.

Étapes
  1. Lancez Terraform.
    > terraform init
    	
  2. Appliquez les configurations qui nous ont demandé beaucoup de travail.
    > terraform apply
    	

C’est tout ! Bravo !

Après quelques minutes, vous devriez obtenir des données de sortie similaires à celles indiquées ci-dessous. Elles vous indiquent l’URL et le mot de passe administrateur pour la console administrateur d’ECE.

null_resource.run-ansible (local-exec): TASK [ansible-elastic-cloud-enterprise : debug] ********************************
null_resource.run-ansible (local-exec): ok: [ec2-52-70-7-3.compute-1.amazonaws.com] => {
null_resource.run-ansible (local-exec):     "msg": "Adminconsole is reachable at: https://ec2-35-175-235-131.compute-1.amazonaws.com:12443"
null_resource.run-ansible (local-exec): }
null_resource.run-ansible (local-exec): TASK [ansible-elastic-cloud-enterprise : debug] ********************************
null_resource.run-ansible (local-exec): ok: [ec2-52-70-7-3.compute-1.amazonaws.com] => {
null_resource.run-ansible (local-exec):     "msg": "Adminconsole password is: yI6ClXYNQ5LGiZlBuOm94s8hGV5ispQS24WVfL5fE9q"
null_resource.run-ansible (local-exec): }
null_resource.run-ansible (local-exec): TASK [ansible-elastic-cloud-enterprise : include_tasks] ************************
null_resource.run-ansible (local-exec): skipping: [ec2-52-70-7-3.compute-1.amazonaws.com]
null_resource.run-ansible (local-exec): PLAY RECAP *********************************************************************
null_resource.run-ansible (local-exec): ec2-34-229-205-85.compute-1.amazonaws.com : ok=68   changed=37   unreachable=0    failed=0    skipped=7    rescued=0    ignored=1
null_resource.run-ansible (local-exec): ec2-35-175-235-131.compute-1.amazonaws.com : ok=68   changed=29   unreachable=0    failed=0    skipped=8    rescued=0    ignored=1
null_resource.run-ansible (local-exec): ec2-52-70-7-3.compute-1.amazonaws.com : ok=68   changed=37   unreachable=0    failed=0    skipped=7    rescued=0    ignored=1
null_resource.run-ansible: Creation complete after 16m50s [id=7701810896203834102]
Apply complete! Resources: 1 added, 0 changed, 1 destroyed.
Outputs:
ece-instances = [
  [
    "ec2-35-175-235-131.compute-1.amazonaws.com",
    "ec2-34-229-205-85.compute-1.amazonaws.com",
    "ec2-52-70-7-3.compute-1.amazonaws.com",
  ],
]
installed-ece-url = https://ec2-35-175-235-131.compute-1.amazonaws.com:12443

Je vous encourage à faire un essai avec cette infrastructure. Ne craignez rien ! Si quelque chose se passe mal, il suffit de tout supprimer et de recommencer comme suit :

> terraform destroy
> terraform apply

Remarque : les certificats utilisés pour TLS sont signés automatiquement. Ainsi, vous recevez un avertissement dans votre navigateur quand vous essayez d’accéder à la console administrateur. Vous pouvez toujours configurer ECE pour utiliser vos propres certificats. Pour en savoir plus, lisez la documentation.

Célébration

Félicitations !

Par rapport à la dernière fois, la tâche était bien plus rapide et facile. Vous ne trouvez pas ? Nous avons réussi à éviter d’utiliser la console AWS et à effectuer les quelque 38 étapes requises pour déployer, configurer et sécuriser toutes les ressources. (Cette nouvelle méthode comprend tout juste 10 étapes, si je compte bien.)

Vous disposez maintenant des armes idéales pour vous lancer à l’assaut du cloud. Expérimentez avec ECE, utilisez les clusters, mettez-les à niveau ou redimensionnez-les. Il n’y a rien de plus simple. Profitez-en !