eadl:bloc4:fm2:td2

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentes Révision précédente
Prochaine révision
Révision précédente
eadl:bloc4:fm2:td2 [2026/05/04 01:54] – [5. Problème volontaire] jcheroneadl:bloc4:fm2:td2 [2026/05/13 16:52] (Version actuelle) – [13.3 Création d’un composant réutilisable] jcheron
Ligne 1: Ligne 1:
-====== TD2 : Créer un module Terraform réutilisable ======+====== TD2 : Bases du provisionning ======
  
-===== Objectifs =====+===== Terraform et Modularisation =====
  
   * Comprendre l’intérêt des variables et des outputs   * Comprendre l’intérêt des variables et des outputs
Ligne 193: Ligne 193:
 </sxh> </sxh>
  
-<WRAP round help>+<WRAP round question>
 Question : Question :
  
Ligne 367: Ligne 367:
 Terraform crée une instance par entrée dans la map. Terraform crée une instance par entrée dans la map.
 </WRAP> </WRAP>
-<WRAP round help>+<WRAP round question>
 Question : Question :
  
Ligne 413: Ligne 413:
 ==== 11.5 Analyse ==== ==== 11.5 Analyse ====
  
-<WRAP round help>+<WRAP round question>
   * Si vous supprimez un environnement de la map, que va faire Terraform ?   * Si vous supprimez un environnement de la map, que va faire Terraform ?
   * Que se passe-t-il si vous renommez une clé ?   * Que se passe-t-il si vous renommez une clé ?
Ligne 421: Ligne 421:
 ==== 11.6 Limites ==== ==== 11.6 Limites ====
  
-<WRAP round help>+<WRAP round question>
 Question : Question :
  
Ligne 561: Ligne 561:
 ==== 12.7 Analyse ==== ==== 12.7 Analyse ====
  
-<WRAP round help>+<WRAP round question>
 Questions : Questions :
  
Ligne 586: Ligne 586:
  
 C’est un cas réel fréquent en DevOps. C’est un cas réel fréquent en DevOps.
 +</WRAP>
 +
 +===== 13. Extension : Alternative avec Pulumi (approche orientée développeur) =====
 +
 +==== Objectifs ====
 +
 +  * Découvrir une alternative à Terraform
 +  * Comprendre la différence déclaratif vs programmation
 +  * Réécrire une logique Terraform avec un langage classique
 +  * Identifier avantages et limites
 +
 +==== 13.1 Principe ====
 +
 +Contrairement à Terraform :
 +
 +  * Terraform → langage déclaratif (HCL)
 +  * Pulumi → langage de programmation (TypeScript ici)
 +
 +Un module Terraform devient :
 +
 +  * une fonction
 +  * ou une classe
 +
 +Un ''for_each'' devient :
 +
 +  * une boucle classique
 +
 +==== 13.2 Initialisation du projet ====
 +
 +<sxh bash;gutter:false>
 +mkdir pulumi-td2
 +cd pulumi-td2
 +
 +pulumi new typescript
 +</sxh>
 +
 +Choisir :
 +
 +  * project name : pulumi-td2
 +  * stack : dev
 +
 +Installer le provider Docker :
 +
 +<sxh bash;gutter:false>
 +npm install @pulumi/docker
 +</sxh>
 +
 +==== 13.3 Création d’un composant réutilisable ====
 +
 +Créer un fichier ''nginx.ts'' :
 +
 +<sxh ts>
 +import * as docker from "@pulumi/docker";
 +
 +export function createNginx(name: string, port: number) {
 +
 +  const image = new docker.RemoteImage(name, {
 +    name: "nginx:latest",
 +  });
 +
 +  const container = new docker.Container(name, {
 +    image: image.imageId,
 +    ports: [
 +      {
 +        internal: 80,
 +        external: port,
 +      },
 +    ],
 +  });
 +
 +  return {
 +    url: `http://localhost:${port}`,
 +  };
 +}
 +</sxh>
 +
 +<WRAP round info>
 +En Pulumi, on remplace les modules Terraform par du code réutilisable.
 +</WRAP>
 +
 +==== 13.4 Utilisation (équivalent main.tf) ====
 +
 +Modifier ''index.ts'' :
 +
 +<sxh ts>
 +import { createNginx } from "./nginx";
 +
 +const frontend = createNginx("frontend", 8080);
 +const backend = createNginx("backend", 8081);
 +
 +export const frontendUrl = frontend.url;
 +export const backendUrl = backend.url;
 +</sxh>
 +
 +==== 13.5 Exécution ====
 +
 +<sxh bash;gutter:false>
 +pulumi up
 +</sxh>
 +
 +==== 13.6 Version dynamique ====
 +
 +Equivalent du ''for_each'' Terraform :
 +
 +<sxh ts>
 +import { createNginx } from "./nginx";
 +
 +const environments: Record<string, number> = {
 +  frontend: 8080,
 +  backend: 8081,
 +  data: 8082,
 +};
 +
 +const urls: Record<string, string> = {};
 +
 +for (const [name, port] of Object.entries(environments)) {
 +  const nginx = createNginx(name, port);
 +  urls[name] = nginx.url;
 +}
 +
 +export { urls };
 +</sxh>
 +
 +==== 13.7 Validation des erreurs ====
 +
 +<sxh ts>
 +const ports = Object.values(environments);
 +
 +if (new Set(ports).size !== ports.length) {
 +  throw new Error("Ports dupliqués détectés !");
 +}
 +</sxh>
 +
 +<WRAP round info>
 +Contrairement à Terraform, Pulumi permet d’ajouter des validations personnalisées
 +avant même le déploiement.
 +</WRAP>
 +
 +==== 13.8 Comparaison ====
 +
 +<WRAP round question>
 +Questions :
 +
 +  * Qu’est-ce qui est plus simple à écrire ?
 +  * Qu’est-ce qui est plus lisible ?
 +  * Où Pulumi est-il plus puissant ?
 +  * Où Terraform est-il plus prévisible ?
 +</WRAP>
 +
 +==== 13.9 Analyse ====
 +
 +<WRAP round info>
 +Pulumi permet :
 +
 +  * d’utiliser des structures natives (boucles, fonctions)
 +  * de factoriser facilement le code
 +  * d’ajouter des validations complexes
 +
 +Mais :
 +
 +  * nécessite des compétences en développement
 +  * peut introduire de la complexité inutile
 +</WRAP>
 +
 +==== 13.10 Conclusion ====
 +
 +<WRAP round info>
 +Terraform et Pulumi répondent au même besoin avec deux approches :
 +
 +  * Terraform → simplicité, standardisation, lisibilité
 +  * Pulumi → flexibilité, puissance, approche développeur
 +
 +Dans un projet réel :
 +
 +  * Terraform est souvent utilisé côté Ops
 +  * Pulumi est pertinent pour des équipes orientées développement
 </WRAP> </WRAP>
  
  • eadl/bloc4/fm2/td2.1777852476.txt.gz
  • Dernière modification : il y a 12 jours
  • de jcheron