Tout comme dans la construction d'une maison, une plateforme informatique peut être bâtie brique par brique à l'aide de différents outils. Traditionnellement, des artisans viennent sur place et chacun fait son travail en suivant des plans, mais avec une part d'interprétation personnelle et des décisions prises sur le moment. L'Infra-as-Code est comparable à un plan de montage ordonné, avec l'ensemble des pièces qui permettent de construire votre plateforme à la manière d'un jeu de construction. Pour faire des modifications, pas besoin de "casser" et reconstruire : vous modifiez simplement votre "plan", et le système s'adapte automatiquement.
L'Infrastructure-as-Code (ou Infra-as-Code - IaC) est une pratique visant à permettre le déploiement et la configuration de composants informatiques virtuels (serveurs, réseaux, load-balancers, logiciels...) au travers du code source.
Plus largement, le terme est associé aux bonnes pratiques DevOps et permet de versionner les environnements déployés dans le but d'éviter ce que l'on appelle le "shadow IT", c'est-à-dire les ressources informatiques qui ne sont pas sous le contrôle de l'équipe en charge de l'infrastructure.
Origines
Le premier exemple d'outil permettant de faire de l'Infrastructure-as-Code remonte aux années 1990 avec la création de CFEngine, qui permettait à l'origine d'automatiser la configuration et la gestion d'ordinateurs et de serveurs Unix à distance. La pratique a ensuite été popularisée par l'avènement du cloud public dans les années 2000 et le besoin de déploiement rapide et de mise à l'échelle des ressources cloud.
Le terme IaC désigne plus généralement un ensemble d'outils permettant de répondre aux problématiques de provisionnement d'infrastructure (provisioning) et de gestion de configuration (configuration management).
Approches techniques
L'approche déclarative en IaC permet de définir l'état final souhaité de l'infrastructure dans le code. Le programme analyse cette description et se charge automatiquement de mettre en place ou d'ajuster les composants pour atteindre cet objectif. Terraform est l'outil de référence dans ce domaine : il compare l'état réel de l'infrastructure avec celui décrit dans le code et propose d'appliquer les ajustements nécessaires. D'autres solutions comme Pulumi, CloudFormation (AWS) et Puppet fonctionnent sur le même principe.
# Configuration du provider AWS
provider "aws" {
region = "eu-west-3" # Europe (Paris)
}
# Définition d'une instance EC2
resource "aws_instance" "serveur_web" {
ami = "ami-0c55b159cbfafe1f0" # Amazon Linux 2 AMI
instance_type = "t2.micro"
tags = {
Name = "ServeurWeb"
Environment = "Production"
}
}
Exemple de code Terraform permettant de déployer une instance EC2 sur AWS
D'autres outils suivent une approche impérative et définissent les éléments à déployer et leur configuration sous forme d'une liste d'instructions successives écrites de manière formelle, souvent au travers de tâches à exécuter pour parvenir à un résultat. Ansible et Chef sont des outils de gestion de configuration utilisant principalement ce mode de fonctionnement.
---
- name: Installation et démarrage d'un serveur web
hosts: webservers
become: yes # Pour avoir les privilèges sudo
tasks:
- name: Installation de Nginx
apt:
name: nginx
state: present
update_cache: yes
- name: Démarrage du service Nginx
service:
name: nginx
state: started
enabled: yes
Exemple de playbook Ansible permettant d'installer un serveur nginx
Ces différents outils d'IaC peuvent se combiner et s'intégrer aux pipelines de CI/CD des projets pour donner vie aux environnements applicatifs.
Ils sont devenus indispensables aujourd'hui dans un contexte où les entreprises ont besoin de mettre en place leurs services de façon rapide, automatique , et avec la possibilité de s'adapter facilement à la demande, que ce soit pour augmenter ou réduire leur infrastructure.