Jaskier
Présentation Link to heading
Du DevOps, ca parait peut-être pas grand chose si l’on connait, mais, la découverte complète du domaine ne fut pas une balade tranquille.
Le sujet original est ici, il s’agit “seulement” de créer une instance custom sur l’instance openstack dédiée, puis d’y déployer un nextcloud, wordpress, ainsi qu’un service fait main, en go, le tout automatiquement.
Je vais essayer, dans ce qui suit, de présenter ce qui a été produit (sans ordre, aucun).
Openstack / DigitalOcean Link to heading
Le but içi n’était bien-sur pas de monter un openstack, mais d’apprendre à utiliser celui qui nous était donné. L’instance donné possédant déjà la configuration globale (mise à disposition d’image, etc), nous n’avions “qu’a” l’utiliser.
Suite à la fermeture de l’Openstack avant la date de rendu (merci l’université, de ne pas payer l’infra), j’ai décidé de remplacer Openstack par le provider DigitalOcean, qui propose aussi une API similaire à OpenStack (et des crédits gratuits 🤑), et m’a donc permis de tester mon code.
Après une courte prise en main de l’interface graphique, il était tempte d’apprendre à utiliser l’API avec OpenTofu
OpenTofu / Terraform Link to heading
Après l’Infrastructure As Click, c’est l’heure de l’Infrastructure As Code avec OpenTofu.
OpenTofu, c’est : un Fork de Terraform, Terraform c’est : INCROYABLE.
“Incroyable, c’est à dire ?”
Terraform permet de créer une infrastrcture (une ou plusieurs VM(s)), à partir de quelques courts fichiers de configurations, en utilisant l’API de tout plein de providers différents.
Il suffit, pour cela de déclarer des ressources.
resource "digitalocean_droplet" "jaskier" {
image = "debian-12-x64"
name = "jaskier"
region = "fra1"
size = "s-2vcpu-2gb"
ssh_keys = [
data.digitalocean_ssh_key.devops.id,
]
ipv6 = true
user_data=file("cloud_init")
connection {
host = self.ipv4_address
user = "root"
type = "ssh"
private_key = file(var.pvt_key)
timeout = "2m"
}
}
Par exemple, l’extrait ci-dessus crée une ressource de type digitalocean_droplet
, avec le nom jaskier
. On lui donne tout plein d’attributs (read the doc).
Dans le projet, on a aussi crée un firewall, pour permettre l’ouverture de ports, ainsi que les enregistrements DNS (OVH puis CloudFlare) , pour annoncer l’IP de la machine récemment crée.
TODO ? Link to heading
Pour cette partie, une source d’amélioration serait l’automatisation des annonces DNS pour tous les sous-domaines, ainsi que pour IPV4/IPV6
Docker Link to heading
Dans ce projet, j’ai utilisé Docker pour deux chose distinct :
- Build le service en Go (un simple serveur en GO qui répond sur un port donné, mais faut imaginer 💭), avec un simple Dockerfile.
- Un Docker Compose, qui déploie :
- Un
nextcloud
, ainsi que son instanceMariaDB
- Un
Wordpress
, ainsi que son instanceMariaDB
- Un
prometheus-node-exporter
,prometheus
, ainsi quegrafana
, pour monitorer notre belle machine toute neuve. - Et enfin, le service le plus compliqué à configurer de cette liste, j’ai nommé
traefik
. Même s’il permet plein de fonctionnalité incroyable, ici, je l’ai seulement utilisé comme reverse-proxy, pour mettre chaque service derrière sont nom de domaine, et en HTTPS, bien sur.
- Un
Et tout ca, configuré dans le Docker-compose, mais aussi dans plusieurs autres fichiers externes, ainsi qu’avec la gestion des secrets.
TODO ? Link to heading
- Si possible, j’aimerai bien que la configurations soit mieux géré et notamment, si possible, tout mettre dans des fichiers externes, pour séparer la définition des services et leur configuration. (Cela permettrait aussi d’aléger le playbook ansible)
La gestion des secrets (Vault, quoi) Link to heading
Ansible, Truc de dingue Link to heading
TODO Link to heading
- Apprendre à utiliser une organisation claire des taches et des roles, pour pouvoir éclater le déploiement sans perdre en cohérence.
- Mettre le
Gitlab-CI, ou la cause d’une petite crise de nerf Link to heading
TODO : Et après ? Link to heading
- Faire de la prévision : être proactif sur le monitoring, pour essayer de pouvoir détecter les pbs avant qu’ils n’arrivent
Illustration designed by Freepik