Déploiement sur GCP avec Terraform & Ansible
L’objectif de ce billet est de mettre en place ce qu’il faut pour qu’à la fin, vous soyez capable de provisionner une machine sur le Cloud de Google avec Terraform et de la configurer avec Ansible.
Donc, nous verrons :
- comment créer un projet sur Google Cloud Platform (GCP)
- provisionner une machine avec Terraform
- créer un compte de service pour l’inventaire dynamique Ansible
- et configurer le serveur avec un simple playbook Ansible
Si à un moment vous perdez le fil dans les ajouts sur les fichiers terraform, je vous ai mis le code source sur gitlab ↗.
Installation des prérequis
Si vous ne possédez pas encore de compte GCP, vous pouvez en créer un de test. Ce compte permet de découvrir gratuitement ce service pendant 90 jours avec un crédit alloué de 300$. Ensuite, on peut basculer sur la version gratuite mais il faudra bien faire attention de ne pas dépasser les limites ↗.
Installation du SDK cloud gcloud
Dans un premier temps, nous allons installer la CLI gcloud. Il suffit de se rendre sur cette page ↗ pour récupérer la ligne de commande.
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 du projet GCP
Dans un premier temps, il faut récupérer les informations de connexion de votre compte
google sur votre machine. Il faudra un navigateur, mais il est possible de s’en
passer avec l’option --console-only
. Ici, il suffit de copier/coller le code
générer dans le navigateur :
Il vous demandera ensuite de créer un nouveau projet. Choisissez un nom de projet assez complexe pour éviter qu’il ne soit déjà pris. Si c’est le cas vous pouvez relancer la création du projet avec la commande suivante :
Notre projet est créé. Ensuite, il faut récupérer les informations de connexion :
Création de notre configuration Terraform
Nous allons simplement indiquer à Terraform que nous allons provisionner nos
machines sur GCP. Pour cela il suffit de lui indiquer le provider suivant
google
. Mais au préalable créons un fichier pour y stocker nos variables :
variables.tf
. Modifier en fonction de vos besoins, moi j’utilise la zone
europe-west1
puisque j’habite très très près de la Belgique (200m) :
Maintenant créons le fichier principal de notre configuration Terraform :
Il faut initialiser la configuration pour installer le provider google :
Dans un premier temps créons une simple VM. Dans le fichier variable, ajoutez ces deux variables :
Ensuite ajouter à la suite de votre fichier main.tf
ceci :
Pour éviter de consommer trop sur votre compte, j’ai ajouté l’option preemptible au scheduling.
Vous pouvez vérifier la configuration avec la commande terraform plan
.
Normalement il va vous dire que l’API Compute engine n’est pas activé sur le
projet. Suivez le lien et activez cette API. Il faudra également sélectionner
votre compte de facturation. Patientez quelques minutes et relancez le calcul du
plan Terraform. Cette fois-ci, ça devrait passer.
Lançons le provisionnement :
Ajoutons une variable de sortie pour récupérer son adresse IP.
A la fin du fichier main.tf ajoutez ces lignes :
On peut relancer terraform plan
. Vous devriez voir ceci apparaître dans le plan :
Appliquez la configuration.
Maintenant attaquons la partie Ansible.
Configuration de l’inventaire Ansible
L’objectif est de pouvoir utiliser le plugin d’inventaire Ansible gcp_compute pour récupérer les machines provisionnées sur ce service.
Configurons le plugin ansible
Créer le fichier ansible.cfg
pour ajouter le plugin d’inventaire gcp_compute :
Il faut ensuite créer le fichier gcp_compute.yml
avec ce contenu :
Lançons la commande d’inventaire Ansible :
Vous voyez qu’il faut qu’on récupère le fichier de connexion d’un compte de service.
Création d’un compte de service
Nous allons voir comment créer un compte de service. Toujours au-dessus bloc output ajouter ces lignes :
Appliquez :
Attendez quelques instants et on relance la commande d’inventaire :
Mince, il faut lui ajouter les droits de lister des VM.
Ajout d’un rôle à un compte de service
Ajoutons-lui simplement un rôle existant contenant celui nécessaire à ansible-inventory, un rôle avec des droits de lecture seule :
On applique et on relance :
Ça fonctionne :blush:
Si vous voulez ajouter des groupes il suffit d’ajouter des labels à vos VM :
Utilisez l’inventaire pour lancer des playbooks
On arrive à récupérer notre inventaire, mais nous n’avons toujours pas le droit de nous connecter à nos VM. Pourtant, indispensable pour lancer des playbooks.
Autorisez les connections à votre VM avec votre clé SSH
Dans le bloc de google_compute_instance il faut ajouter ces lignes pour autoriser les connexions en SSH mettez le, en dessous de celui du scheduling :
Avant le bloc output ajoutez aussi ces deux blocs :
Le premier va récupérer les informations de connexion dans une source de
données. Le second va simplement y ajouter votre clé SSH utilisateur. Si elle
n’existe pas, créer la avec la commande ssh-keygen
.
Appliquez la configuration.
Vous devriez voir ces lignes :
A la fin, vous devez voir l’adresse email qui est en fait le compte utilisateur
créer sur la machine. Il suffit de remplacer les .
et @
par des _
.
Cool
Configuration du remote user ansible
Il suffit d’ajouter à votre fichier ansible.cfg
cette ligne dans la section
[default] avec votre user :
et on teste :
Allez pour finir on tente l’installation d’un package sur notre VM. On crée un playbook ansible avec ce contenu :
Et on lance :
Voilà objectif atteint ! Mais on peut encore l’améliorer en créant un role dédié, en autorisant les connexions avec le compte de service créé.