Déploiement sur AWS avec Terraform & Ansible
Gitlab continue son travail d’intégration de Terraform sur sa plateforme. En effet, leur objectif est de proposer une solution simple et sécurisée pour mettre des workflows d’Infrastructure As Code. Voyons tout cela ensemble.
Je vais reprendre mon exemple du précédent billet mais en le portant cette fois sur Amazon Web Service et non Google Cloud Platform. Pour rappel l’objectif était d’arriver à récupérer un inventaire dynamique du projet.
Installation des prérequis
Installation de la CLI AWS
Cette fois je vais respecter les bonnes pratiques en utilisant un utilisateur
IAM ↗
et non le compte root
.
On lance la commande de configuration de la CLI AWS pour ajouter le compte administrator avec la sortie au format JSON :
Installation de Terraform
De la même manière procéder à l’installation de Terraform. ↗
Installation d’Ansible
Ansible est très simple à installer avec pyenv.
Initialisation de la configuration Terraform
On va simplement créé les deux premiers fichiers
main.tf
:
On initialise le projet :
Création du projet Gitlab
Nous allons initialiser le projet en créant de suite le fichier .gitignore
pour ne pas stocker de suite dans le repo des données sensibles. La version officielle ↗
On créé aussi notre fichier .gitlab-ci.yml avec ce contenu :
On créé le project sur gitlab.com (remplacez le repo avec le votre!) :
Si on se rend dans pipeline vous devriez voir ceci :
Cool. Tout est directement utilisable sans rien à faire. Vous remarquerez que le deploy est en activation manuelle.
Mais comment est géré le state de terraform dans Gitlab?
Il suffit de regarder ce qui se passe dans le stage init :
Il est stocké dans un Google Cloud Storage
. Nous verrons comment le modifier
une autre fois, pour le stocker dans un S3 d'Amazon
ou directement dans
gitlab
si vous utilisez une solution auto-hébergée.
Création de notre VM EC2
Vous allez voir ici les choses vont être un peu plus complexe.
Ajoutons d’abord ces lignes au fichier main.tf :
Quelques explications :
On retrouve plusieurs blocs resource et un data.
- Le
data
latest_rocky permet de récupérer la dernière image Rocky Linux 8 dont le fournisseur est679593333241
. Cette image sera celle utilisé dans l’instance. - un bloc pour stocker la clé pour se connecter
- un bloc
aws_default_vpc
qui permet de sélectionner le vpcdefault
- un bloc
aws_default_security_group
qui permet d’ouvrir le flux SSH sur le vpc default afin que de permettre les connections sur la machine provisionnée. - un bloc
aws_instance
qui est la vm et qui utiliser tous les blocs précédent.
On créé le fichier de variables comme suite :
variable.tf
:
On initialise la variable TV_VAR_SSH_KEY :
Maintenant vous pouvez tester en local votre configuration :
Même si on récupère rapidement l’adresse IP il faudra patienter que la machine
soit disponible: dans la console dans le contrôle de statuts on ne doit plus
voir initialisation en cours
.
Une fois prête vous pouvez vous connecter sur la machine avec votre clé SSH.
Test de l’approvisionnement depuis gitlab
Avant de pousser notre configuration dans gitlab il faut avant créer les secrets qui seront utilisé dans le CI. Allez dans le menu Settings/CI/CD de Gitlab et ajoutez trois variables:
- AWS_ACCESS_KEY_ID
- AWS_SECRET_ACCESS_KEY
- SSH_KEY (avec le contenu de la clé publique)
On pousse nos modifications et regardons si tout se passe bien dans le pipeline sous gitlab.
Et on lance le deploy (tache manuelle), on attend … on teste la connexion ssh
Ca c’est fait. Maintenant regardons comment utiliser l’inventaire Ansible.
Utilisation de l’inventaire dynamique Ansible aws_ec2
Il suffit de créer un fichier ansible.cfg contenant ceci:
On utilise le plugin aws_ec2
qui fait appel à l’inventaire aws_ec2.yml
dont
le contenu est (modifier les clés AWS avec les vôtres):
On teste si on récupère les machines provisionnées :
On test le module ping :
Intégration dans le CI Gitlab
L’objectif est de pouvoir jouer un playbook de test qui va installer le repo EPEL sur notre rocky linux 8:
Pour cela on va modifier notre fichier aws_ec2 en remplacant les valeurs des infos AWS par les variables que nous avons créé dans les paramètres CI/CD:
Et on vient ajouter un stage à notre CI:
Remarquez la commande ajouté dans le stage deploy
, qui permet d’éviter les
erreurs sur les clés existantes. Lors de la seconde soumission. Il faut créer
une nouvelle variable de type file
id_ed25519 avec la clé privé.
Poussons le tout dans gitlab et vérifions.
Après plusieurs lancements de la phase apply je me trouve avec plusieurs VM. Pas
vraiment le résultat attendu. Je tente d’activer un backend de type S3 (qu’il
faut créer avant) pour stocker le state Terraform. Pour cela il suffit de
modifier le premier bloc du fichier main.tf
:
Ca fonctionne.
Content du résultat.