Selon l’enquête du rapport Accelerate State of DevOps 2019, 80 % des personnes interrogées ont déclaré que l’application ou le service principal qu’elles prenaient en charge était hébergé sur une plateforme cloud quelconque. 50 % des personnes interrogées ont déclaré que leur application principale était hébergée sur le cloud public.
Pourquoi l’infrastructure en tant que code ?
Traditionnellement, si nous regardons en arrière, lorsque vous vouliez un serveur, vous posiez un ticket et quelqu’un de l’équipe d’exploitation créait une instance de VM ou commandait un serveur physique. Cela pouvait se faire à l’aide de scripts, de la fonction “pointer et cliquer” ou même d’une installation manuelle.
Ensuite, à chaque demande, il y avait plus de VM, pour le DNS, le courrier, les bases de données, etc. Enfin, les systèmes d’exploitation, les serveurs web, les JVM et tout le reste faisaient l’objet de mises à jour permanentes. Au fil du temps, les configurations étaient légèrement différentes les unes des autres (dérive de la configuration), ce qui donnait des serveurs en flocon de neige. Et lorsque quelque chose tombait en panne, il était difficile de savoir quelles modifications avaient été apportées.
Cette situation était encore acceptable tant que les serveurs étaient peu nombreux et avaient une longue durée de vie.
Un grand changement s’est produit avec l’arrivée de sociétés de services en nuage comme AWS. Au lieu d’investir dans du matériel et des centres de données, de nombreuses entreprises ont commencé à transférer leurs applications dans le nuage. Dans le nuage, vous pouvez déployer un serveur en quelques minutes, alors qu’auparavant cela prenait des heures, voire des jours.
Pour maintenir des performances et une disponibilité optimales, vous devrez peut-être déployer davantage d’instances pour répondre à la demande. Plus tard, vous devrez peut-être y mettre fin pour réduire les coûts. Comme vous payez à l’heure, il se peut que vous deviez augmenter ou diminuer la capacité chaque jour. Faire cela manuellement, plusieurs fois par jour, est un véritable défi.
La capture des étapes nécessaires au déploiement ou à l’arrêt des instances et d’autres composants d’infrastructure dans le code permet l’automatisation. L’automatisation de l’approvisionnement en nuages et en infrastructures peut contribuer à créer de la valeur plus rapidement et de manière plus fiable.
Qu’est-ce que l’infrastructure en tant que code ?
L’infrastructure en tant que code (IaC) est l’automatisation de l’infrastructure à l’aide de principes et de pratiques de développement logiciel.
L’idée est de traiter votre infrastructure comme un logiciel, puis d’écrire, de tester et d’exécuter du code pour définir, déployer, mettre à jour et détruire votre infrastructure. Vous écrivez du code pour gérer vos serveurs, vos bases de données, vos réseaux, vos journaux, le déploiement et la configuration de vos applications. Lorsque vous souhaitez apporter des modifications à votre infrastructure, vous modifiez le code, vous le testez, puis vous l’appliquez à vos systèmes.
Avantages
L’infrastructure en tant que code offre des avantages significatifs par rapport au provisionnement manuel :
Libre-service
L’infrastructure étant définie en tant que code, l’ensemble du processus et du déploiement peut être automatisé et lancé par n’importe quel membre de l’équipe DevOps. Les utilisateurs de l’infrastructure obtiennent les ressources dont ils ont besoin quand ils en ont besoin.
Idempotence
L’idempotence signifie que vous définissez l’état souhaité et que, quel que soit le nombre de fois où vous exécutez le script, le résultat est le même. Il vérifie l’état actuel et l’état souhaité et n’applique que les changements nécessaires. Cela peut être extrêmement difficile à réaliser avec des scripts bash.
Des outils comme Ansible et Terraform intègrent des fonctionnalités permettant de rendre votre code idempotent.
Réduction des coûts
Réduit le temps et les efforts requis pour le provisionnement, beaucoup moins que le provisionnement manuel.
Livraison plus rapide des logiciels
Le provisionnement rapide de l’infrastructure pour le développement, les tests et la production vous permet de livrer des logiciels beaucoup plus rapidement. Le processus de déploiement étant automatisé, il est également cohérent et reproductible.
Auto-documentation
L’état de l’infrastructure est défini dans un code facilement lisible par tous.
Contrôle des versions
Traditionnellement, les changements apportés aux systèmes de production sont considérés comme risqués. Mais le changement est inévitable. Il se peut que vous deviez ajouter une nouvelle base de données lorsque vous ajoutez une nouvelle fonctionnalité. Il se peut que vous deviez ajouter de nouveaux serveurs ou de nouveaux espaces de stockage à la grappe. L’infrastructure en tant que code réduit les efforts et les risques liés aux modifications de l’infrastructure.
Vous pouvez enregistrer vos fichiers sources dans le contrôle de version, ce qui signifie que vous pouvez suivre toutes les modifications apportées à l’infrastructure et revenir rapidement à la version précédente si quelque chose ne fonctionne pas.
Validation et tests
L’infrastructure en tant que code permet de tester et d’appliquer de petites modifications en continu. Comme tout est du code, vous pouvez vérifier les erreurs à l’aide d’analyses statiques et de tests automatisés.
Sécurité améliorée
Le passage à l’infrastructure en tant que code vous permet d’intégrer la sécurité dès le début et d’appliquer les changements de manière fiable et sûre.
Outils d’infrastructure en tant que code
Bien qu’il existe de nombreux outils, il n’est pas toujours facile d’en choisir un. Voici quelques considérations qui pourraient vous être utiles :
Outils de gestion de la configuration et outils de provisionnement
D’une manière générale, les outils disponibles se répartissent en deux catégories
- Les outils de gestion de la configuration.
- Outils d’approvisionnement
Outils de gestion de la configuration
Les outils de gestion de la configuration sont conçus pour gérer les utilisateurs, installer et gérer les logiciels et les outils sur les serveurs existants. Chef, Puppet, Ansible et SaltStack sont avant tout des outils de configuration.
Vous pouvez utiliser les outils de gestion de la configuration pour installer et mettre à jour les logiciels sur les serveurs.
Outils d’approvisionnement
Terraform, CloudFormation, OpenStack Heat, en revanche, sont des outils de provisionnement, c’est-à-dire qu’ils sont utilisés pour créer des serveurs, des serveurs de base de données, des équilibreurs de charge, des files d’attente, des sous-réseaux, des pare-feu et tous les autres composants de votre infrastructure. Ces outils font des appels API aux fournisseurs pour créer l’infrastructure requise.
Infrastructure mutable ou immuable
Une infrastructure mutable est une infrastructure qui peut être modifiée après avoir été mise en place. Chef, Ansible, Puppet et SaltStack sont conçus pour installer ou mettre à jour le logiciel sur des serveurs existants. Cela peut se produire plusieurs fois au cours de la durée de vie d’un serveur. Après de nombreuses mises à jour, chaque serveur est susceptible d’être légèrement différent des autres, ce qui entraîne une dérive de la configuration. Par exemple, certaines modifications qui fonctionnent bien sur les serveurs de test peuvent ne pas fonctionner sur les serveurs de production.
Des outils comme Terraform et CloudFormation sont conçus pour créer à chaque fois un nouveau serveur à partir d’une image de machine ou d’une image de conteneur. Si les serveurs doivent être mis à jour, vous les remplacez par de nouveaux serveurs. Lorsque les nouveaux serveurs sont opérationnels, vous pouvez mettre fin aux anciens. Chaque déploiement utilise une image immuable pour créer un serveur, ce qui permet d’éviter les dérives de configuration. Cette méthode peut toutefois s’avérer un peu lente.
Outils impératifs et outils déclaratifs
Les outils impératifs sont similaires aux scripts. Vous énumérez les étapes à suivre pour parvenir à l’état souhaité. Les outils déclaratifs vous permettent de spécifier l’état final, et l’outil élabore les étapes permettant d’atteindre cet état.
Alors que Chef est principalement un outil impératif, Ansible utilise une approche hybride et prend en charge à la fois les techniques impératives et déclaratives.
Terraform, CloudFormation, Puppet, OpenStack Heat et SaltStack appartiennent tous à la catégorie des outils déclaratifs, dans lesquels vous déclarez l’état final souhaité.
Utiliser plusieurs outils ensemble
Bien que chacun de ces outils puisse être utilisé seul, une approche courante consiste à les utiliser ensemble. Par exemple, vous pouvez utiliser Terraform pour créer des VPC, des sous-réseaux, des passerelles Internet, des équilibreurs de charge et des VM, puis utiliser Ansible pour configurer et déployer des services sur ces instances.
Conclusion
L’infrastructure définie en tant que code offre de nombreux avantages par rapport au provisionnement manuel – elle peut être contrôlée par version, testée, conduit à un provisionnement plus rapide et à la livraison de logiciels. De nombreuses organisations ont déjà commencé à adopter l’approche IaC pour construire et gérer leur infrastructure.