Créer des serveurs sur Openstack OVH avecTerraform
Comme dirait mon vendeur de téléphone, “on ne va pas se mentir” : je déteste le Cloud. Ça vient de très loin – je me demande même si je faisais de l’informatique – d’une discussion avec une fraîche mouture de Science-Po de l’époque qui me vantait l’avantage du concept “magique” du cloud, et en quoi il était bon que “Mme Michu” n’y comprenne rien. Maintenant que je vois cela de l’intérieur, je dirais que mon sentiment de défiance est renforcé.
Derrière le Cloud il y a du “barre metal”, c’est à dire des serveurs physiques reliés les uns aux autres, très souvent sous Linux, avec une couche d’automatisation complexe qui permet d’offrir des services de plus en plus importants aux clients. Or il est une règle vieille comme le monde : pas d’indépendance sans connaissance… Durant le temps que vous chercherez la technique pour construire des serveurs sur l’infra d’Amazon ou Microsoft, d’autres le passeront à trouver des techniques plus poussées pour vous rendre toujours plus dépendant. Des services rendus propriétaires qui étrangement fonctionnent mieux que le standard opensource… par exemple des bases de données, de la redondance de charge… Le Cloud c’est avec modération, celui qui se sert du Cloud pour des applications critiques est fou, et dans le fond celui qui vend des services Cloud américains aux grands comptes français ne veut pas vraiment de l’indépendance économique française. C’est une situation qui devrait être accompagnée par le politique car dans les DSI, l’argent est bien souvent ROI… et la stratégie sur le long terme se fait rare. Si ces questions liées à la “souveraineté numérique” vous intéressent, je vous invite à lire cet article : Souveraineté numérique : le choix inquiétant fait par la BPI pour l’hébergement des données.
Vous l’aurez compris, je vais prendre un exemple de Cloud bien français même si ce dernier s’étend maintenant dans le monde entier : celui d’OVH. En plus ils utilisent la techno Openstack, ce qui est parfait pour s’initier aux concepts de cloud public/privé. Il faut savoir que le Cloud n’est pas gratuit, 0.01€ vous seront facturés à la création de l’infra ci-dessous, plus si vous décidez de garder le serveur.
Prérequis
- Avoir un compte chez OVH et souscrit à l’offre Cloud
- Un utilisateur OpenStack
- Les variables d’environnement OpenStack
- Vos identifiants API et clés d’autorisations OVH
- Une clé SSH
- L’exécutable Terraform
- Les clients OpenStack (nova, glance)
Vous trouverez les pages de tutoriel chez OHV et sur ce site. Normalement pas de soucis majeurs pour effectuer ces opérations, si vous avez néanmoins des problèmes, envoyez-moi un message et je détaillerai ce paragraphe des prérequis.
Utilisation de Terraform pour les instances Cloud public
On va faire très simple, trois fichiers. Un pour la connection à Openstack, un autre pour la création de la machine et son réseau, le dernier pour les variables :
$ tree
.
├── connections.tf
├── simple_instance.tf
└── variables.tf
connections.tf
Rien de bien compliqué ici :
provider "openstack" {
auth_url = "https://auth.cloud.ovh.net/v3.0/"
domain_name = "default"
tenant_name = ""
alias = "ovh"
user_name = "utilisateur_openstack" # vous possédez ces valeurs
password = "le_mot_de_passe" # si vous avez effectué les prérequis
}
simple_instance.tf
Voilà maintenant pour créer un serveur, j’utilise l’adresse IP de la machine d’administration afin de l’autoriser à accéder au serveur Cloud via SSH. Vous pouvez utiliser une autre technique que firewalld, il suffit de changer le script run.sh … Comme d’habitude, j’utilise des images cloud de Fedora Server (ici 32).
resource "openstack_compute_keypair_v2" "mattkey" {
provider = openstack.ovh
name = "mattkey" # A changer : c'est la clé que vous avez préalablement créée dans l'interface openstack OVH
public_key = file("~/.ssh/id_rsa.pub") # C'est la clé que vous avez préalablement créée dans l'interface openstack OVH
}
data "openstack_networking_network_v2" "public_a" {
name = "Ext-Net"
provider = openstack.ovh
}
resource "openstack_networking_port_v2" "public_a" {
name = "test_a_0"
network_id = data.openstack_networking_network_v2.public_a.id
admin_state_up = "true"
provider = openstack.ovh
}
data "http" "myip" {
url = "https://api.ipify.org"
}
data "template_file" "setup" {
template = <<SETUP
#!/bin/bash
# install & configure firewall
dnf install -y firewalld
systemctl start firewalld
systemctl enable --now firewalld
firewall-cmd --permanent --add-service=ssh
firewall-cmd --permanent --add-source=${trimspace(data.http.myip.body)}/32 --zone=trusted
firewall-cmd --permanent --add-service=ssh --zone trusted
firewall-cmd --permanent --remove-service=ssh --zone=public
firewall-cmd --reload
SETUP
}
data "template_file" "userdata" {
template = <<CLOUDCONFIG
#cloud-config
write_files:
- path: /tmp/setup/run.sh
permissions: '0755'
content: |
${indent(6, data.template_file.setup.rendered)}
- path: /etc/systemd/network/30-ens3.network
permissions: '0644'
content: |
[Match]
Name=ens3
[Network]
DHCP=ipv4
runcmd:
- sh /tmp/setup/run.sh
CLOUDCONFIG
}
resource "openstack_compute_instance_v2" "fed-test" {
region = var.region
name = "test-fed-instance"
provider = openstack.ovh
image_name = "Fedora 32"
flavor_name = "s1-2"
user_data = data.template_file.userdata.rendered
key_pair = openstack_compute_keypair_v2.mattkey.name
network {
access_network = true
port = openstack_networking_port_v2.public_a.id
}
}
output "Server_IP" {
value = openstack_networking_port_v2.public_a.all_fixed_ips
}
variables.tf
variable "region" {
type = string
default = "UK1" # cette valeur dépend de votre compte OVH et du fichier openstack .rc
}
Et voilà le tour est joué, théoriquement, l’ip du serveur s’affiche à la fin de l’exécution du `terraform apply`, vous pouvez vous y connecter via SSH avec votre clé privée. Pour tout détruire : `terraform destroy`. Si vous vous souvenez de mes précédents articles, ici ou là, vous pouvez maintenant provisionner la ou les machines avec Ansible.