[{"data":1,"prerenderedAt":1852},["ShallowReactive",2],{"/fr-fr/blog/using-ansible-and-gitlab-as-infrastructure-for-code":3,"navigation-fr-fr":1057,"banner-fr-fr":1491,"footer-fr-fr":1499,"blog-post-authors-fr-fr-George Kichukov|Salahddine Aberkan":1737,"blog-related-posts-fr-fr-using-ansible-and-gitlab-as-infrastructure-for-code":1764,"blog-promotions-fr-fr":1789,"next-steps-fr-fr":1843},{"id":4,"title":5,"authors":6,"body":9,"category":1035,"date":1036,"description":1037,"extension":1038,"externalUrl":1039,"faq":1039,"featured":1040,"heroImage":1041,"meta":1042,"navigation":580,"path":1043,"seo":1044,"slug":1050,"stem":1051,"tags":1052,"template":1054,"updatedDate":1055,"__hash__":1056},"blogPosts/fr-fr/blog/using-ansible-and-gitlab-as-infrastructure-for-code.md","GitLab DevSecOps : des pipelines IaC au service de votre croissance",[7,8],"George Kichukov","Salahddine Aberkan",{"type":10,"value":11,"toc":1024},"minimark",[12,16,34,51,54,61,66,81,84,126,135,141,146,155,189,196,351,359,366,491,496,499,508,514,523,529,533,542,550,715,721,728,734,738,747,753,761,871,877,881,901,944,950,959,965,971,975,978,981,987,991,994,998,1008,1020],[13,14,15],"p",{},"Les outils d'Infrastructure as Code (IaC), tels que TerraForm/OpenTofu, ou de gestion des configurations, tels qu'Ansible, jouent un rôle clé dans de nombreux workflows critiques. Ces projets commencent parfois par de simples scripts d'automatisations, sans nécessairement suivre les bonnes pratiques de développement logiciel ni répondre aux contrôles réglementaires exigés pour les applications logicielles d'entreprise.",[13,17,18,19,26,27,33],{},"Souvent développées par des ingénieurs système ou des ingénieurs d'infrastructure, ces automatisations sont mises en place sans réelle expertise des approches ",[20,21,25],"a",{"href":22,"rel":23,"title":24},"https://about.gitlab.com/fr-fr/topics/devops/",[],"Qu'est-ce que le DevOps ?","DevOps",", DevSecOps, ",[20,28,32],{"href":29,"rel":30,"title":31},"https://about.gitlab.com/topics/ci-cd/",[],"Qu'est-ce que le CI/CD ?","CI/CD"," et d'automatisation des tests. Dans les grandes entreprises employant de nombreuses équipes d'ingénierie parfois cloisonnées, la situation est encore plus compliquée.",[13,35,36,37,43,44,50],{},"Chez GitLab, nous maîtrisons l'",[20,38,42],{"href":39,"rel":40,"title":41},"https://about.gitlab.com/fr-fr/topics/devsecops/",[],"Qu'est-ce que le DevSecOps ?","approche DevSecOps"," depuis plus de 10 ans et utilisons notre plateforme DevSecOps unifiée en interne pour automatiser des tâches critiques à l'échelle de l'entreprise. Nous accompagnons des milliers de clients qui s'appuient sur notre plateforme GitLab pour une variété de processus : Infrastructure as Code (IaC), automatisation, gestion cloud, ",[20,45,49],{"href":46,"rel":47,"title":48},"https://about.gitlab.com/fr-fr/the-source/platform/driving-business-results-with-platform-engineering/",[],"Qu'est-ce que l’ingénierie de plateforme ?","ingénierie de plateforme"," et bien d'autres encore.",[13,52,53],{},"Découvrez dans cet article les principales fonctionnalités pour transformer vos puissantes automatisations en pipelines de livraison de logiciels évolutifs et auditables.",[13,55,56],{},[57,58],"img",{"alt":59,"src":60},"Liste d'automatisation","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750433380/oipm6tq8qutoh1ctredd.png",[62,63,65],"h2",{"id":64},"mise-en-œuvre","Mise en œuvre",[13,67,68,73,74,80],{},[20,69,72],{"href":70,"rel":71},"https://gitlab.com/gl-demo-ultimate-saberkan/public/ansible-demo",[],"Ce projet de démonstration"," illustre un workflow DevOps complet qui combine la puissance d'OpenTofu avec les pratiques modernes d'Ansible, le tout orchestré via les ",[20,75,79],{"href":76,"rel":77,"title":78},"https://about.gitlab.com/fr-fr/topics/ci-cd/cicd-pipeline/",[],"Qu'est-ce qu'un pipeline CI/CD ?","pipelines CI/CD"," de GitLab. Il met en scène le provisionnement d'un environnement de test AWS à l'aide de composants OpenTofu intégrés à GitLab, suivi du déploiement d'un serveur web Tomcat à l'aide de la version la plus récente d'Ansible, avec exécution dans un environnement personnalisé et prise en charge des collections.",[13,82,83],{},"Le projet tire parti de nombreuses fonctionnalités de GitLab :",[85,86,87,96,103,110,118],"ul",{},[88,89,90,91],"li",{},"Création et stockage d'environnements d'exécution Ansible personnalisés dans le ",[20,92,95],{"href":93,"rel":94},"https://docs.gitlab.com/user/packages/container_registry/",[],"registre de conteneurs de GitLab",[88,97,98],{},[20,99,102],{"href":100,"rel":101},"https://docs.gitlab.com/user/application_security/iac_scanning/",[],"Scan de sécurité des scripts d'IaC et des conteneurs permettant de détecter des vulnérabilités",[88,104,105,106],{},"Intégration du ",[20,107,109],{"href":100,"rel":108},[],"linting Ansible avec GitLab Code Quality",[88,111,112,113],{},"Stockage des binaires Tomcat dans le ",[20,114,117],{"href":115,"rel":116},"https://docs.gitlab.com/user/packages/generic_packages/",[],"dépôt de paquets génériques",[88,119,120,121],{},"Utilisation des ",[20,122,125],{"href":123,"rel":124},"https://docs.gitlab.com/ci/variables/",[],"variables d'environnement CI/CD à des fins de configuration",[13,127,128,129,134],{},"L'ensemble du workflow est automatisé par le biais d'un ",[20,130,133],{"href":131,"rel":132},"https://docs.gitlab.com/ci/pipelines/",[],"pipeline GitLab"," qui gère toutes les étapes, du provisionnement de l'infrastructure au déploiement des applications, en passant par les tests de sécurité.",[13,136,137],{},[57,138],{"alt":139,"src":140}," Workflow automatisé via un pipeline GitLab ","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750433380/giatmolwn9inusi4cev2.png",[142,143,145],"h3",{"id":144},"provisionnement-de-lenvironnement-avec-opentofu","Provisionnement de l'environnement avec OpenTofu",[13,147,148,149,154],{},"Le projet commence par le provisionnement d'un environnement de test AWS à l'aide d'OpenTofu, en s'appuyant sur l'intégration native des ",[20,150,153],{"href":151,"rel":152},"https://docs.gitlab.com/user/infrastructure/iac/",[],"composants OpenTofu de GitLab",", qui rationalisent le processus de provisionnement de l'infrastructure. Le pipeline inclut des étapes de validation, de planification et d'application qui garantissent un déploiement approprié de l'infrastructure tout en maintenant les bonnes pratiques IaC de GitLab.",[13,156,157,158,163,164,169,170,175,176,180,181,184,185,188],{},"Ce projet tire parti des capacités de l'",[20,159,162],{"href":160,"rel":161},"https://docs.gitlab.com/user/infrastructure/iac/terraform_state/",[],"outil de gestion des fichiers d'état de Terraform intégré à GitLab"," ainsi que du ",[20,165,168],{"href":166,"rel":167},"https://docs.gitlab.com/user/packages/terraform_module_registry/",[],"Terraform Module Registry",", tous deux compatibles avec OpenTofu et HashiCorp Terraform. Il est également possible d'utiliser les composants OpenTofu de GitLab avec HashiCorp Terraform en procédant à une ",[20,171,174],{"href":172,"rel":173},"https://gitlab.com/components/opentofu#can-i-use-this-component-with-terraform",[],"légère personnalisation"," : vous devez créer votre propre image incluant un script nommé ",[177,178,179],"code",{},"gitlab-tofu"," pour maintenir sa compatibilité avec les jobs de composants. Vous pouvez ensuite remplacer les commandes ",[177,182,183],{},"tofu"," par les commandes ",[177,186,187],{},"Terraform"," équivalentes.",[13,190,191,192,195],{},"L'exemple de composant « OpenTofu Module Release » montre comment créer un module Terraform et le stocker dans Terraform Module Registry dans GitLab. Ce module est ensuite importé dans le fichier ",[177,193,194],{},"provision_lab.tf"," directement depuis GitLab pour déployer l'environnement de test sur AWS. Ensuite, il génère un fichier d'inventaire contenant l'adresse IP publique de l'instance provisionnée, qui peut être utilisée dans les étapes de gestion des configurations avec Ansible.",[197,198,203],"pre",{"className":199,"code":200,"language":201,"meta":202,"style":202},"language-yaml shiki shiki-themes github-light","# From .gitlab-ci.yml\n - component: gitlab.com/components/opentofu/module-release@1.1.0\n   inputs:\n     root_dir: tofu\n     as: 🔍 tofu-module-release\n     stage: 🏗️ build-tofu-module\n     module_version: 0.0.1\n     module_system: aws\n     module_name: aws-lab\n     root_dir: tofu/modules/ansible-demo/aws-lab\n     rules:\n       - if: \"$CI_COMMIT_BRANCH\"\n         when: manual\n\n","yaml","",[177,204,205,214,232,241,252,263,274,286,297,308,318,326,340],{"__ignoreMap":202},[206,207,210],"span",{"class":208,"line":209},"line",1,[206,211,213],{"class":212},"sAwPA","# From .gitlab-ci.yml\n",[206,215,217,221,225,228],{"class":208,"line":216},2,[206,218,220],{"class":219},"sgsFI"," - ",[206,222,224],{"class":223},"shJU0","component",[206,226,227],{"class":219},": ",[206,229,231],{"class":230},"sYBdl","gitlab.com/components/opentofu/module-release@1.1.0\n",[206,233,235,238],{"class":208,"line":234},3,[206,236,237],{"class":223},"   inputs",[206,239,240],{"class":219},":\n",[206,242,244,247,249],{"class":208,"line":243},4,[206,245,246],{"class":223},"     root_dir",[206,248,227],{"class":219},[206,250,251],{"class":230},"tofu\n",[206,253,255,258,260],{"class":208,"line":254},5,[206,256,257],{"class":223},"     as",[206,259,227],{"class":219},[206,261,262],{"class":230},"🔍 tofu-module-release\n",[206,264,266,269,271],{"class":208,"line":265},6,[206,267,268],{"class":223},"     stage",[206,270,227],{"class":219},[206,272,273],{"class":230},"🏗️ build-tofu-module\n",[206,275,277,280,282],{"class":208,"line":276},7,[206,278,279],{"class":223},"     module_version",[206,281,227],{"class":219},[206,283,285],{"class":284},"sYu0t","0.0.1\n",[206,287,289,292,294],{"class":208,"line":288},8,[206,290,291],{"class":223},"     module_system",[206,293,227],{"class":219},[206,295,296],{"class":230},"aws\n",[206,298,300,303,305],{"class":208,"line":299},9,[206,301,302],{"class":223},"     module_name",[206,304,227],{"class":219},[206,306,307],{"class":230},"aws-lab\n",[206,309,311,313,315],{"class":208,"line":310},10,[206,312,246],{"class":223},[206,314,227],{"class":219},[206,316,317],{"class":230},"tofu/modules/ansible-demo/aws-lab\n",[206,319,321,324],{"class":208,"line":320},11,[206,322,323],{"class":223},"     rules",[206,325,240],{"class":219},[206,327,329,332,335,337],{"class":208,"line":328},12,[206,330,331],{"class":219},"       - ",[206,333,334],{"class":223},"if",[206,336,227],{"class":219},[206,338,339],{"class":230},"\"$CI_COMMIT_BRANCH\"\n",[206,341,343,346,348],{"class":208,"line":342},13,[206,344,345],{"class":223},"         when",[206,347,227],{"class":219},[206,349,350],{"class":230},"manual\n",[197,352,357],{"className":353,"code":355,"language":356,"meta":202},[354],"language-text","# From provision_lab.tf\nmodule \"aws-lab\" {\n  source = \"https://gitlab.com/api/v4/projects/67604719/packages/terraform/modules/aws-lab/aws/0.0.1\"\n}\n","text",[177,358,355],{"__ignoreMap":202},[13,360,361,362,365],{},"Les composants de validation, de planification et de déploiement sont configurés avec le paramètre ",[177,363,364],{},"**auto_define_backend: true**",". Ils s'intègrent automatiquement au backend de stockage d’état Terraform intégré à GitLab et éliminent le besoin de configuration manuelle du backend ou de solutions de stockage d'état externes telles que des compartiments S3.",[197,367,369],{"className":199,"code":368,"language":201,"meta":202,"style":202},"# From gitlab-ci.yml\n- component: gitlab.com/components/opentofu/apply@0.55.0\n  inputs:\n    version: 0.55.0\n    opentofu_version: 1.8.8\n    root_dir: tofu\n    state_name: demo\n    as: ✅ tofu-apply\n    stage: 🏗️ provision-lab\n    auto_define_backend: true\n    rules:\n      - if: \"$CI_COMMIT_BRANCH\"\n        when: manual\n\n",[177,370,371,376,388,395,405,415,424,434,444,454,464,471,482],{"__ignoreMap":202},[206,372,373],{"class":208,"line":209},[206,374,375],{"class":212},"# From gitlab-ci.yml\n",[206,377,378,381,383,385],{"class":208,"line":216},[206,379,380],{"class":219},"- ",[206,382,224],{"class":223},[206,384,227],{"class":219},[206,386,387],{"class":230},"gitlab.com/components/opentofu/apply@0.55.0\n",[206,389,390,393],{"class":208,"line":234},[206,391,392],{"class":223},"  inputs",[206,394,240],{"class":219},[206,396,397,400,402],{"class":208,"line":243},[206,398,399],{"class":223},"    version",[206,401,227],{"class":219},[206,403,404],{"class":284},"0.55.0\n",[206,406,407,410,412],{"class":208,"line":254},[206,408,409],{"class":223},"    opentofu_version",[206,411,227],{"class":219},[206,413,414],{"class":284},"1.8.8\n",[206,416,417,420,422],{"class":208,"line":265},[206,418,419],{"class":223},"    root_dir",[206,421,227],{"class":219},[206,423,251],{"class":230},[206,425,426,429,431],{"class":208,"line":276},[206,427,428],{"class":223},"    state_name",[206,430,227],{"class":219},[206,432,433],{"class":230},"demo\n",[206,435,436,439,441],{"class":208,"line":288},[206,437,438],{"class":223},"    as",[206,440,227],{"class":219},[206,442,443],{"class":230},"✅ tofu-apply\n",[206,445,446,449,451],{"class":208,"line":299},[206,447,448],{"class":223},"    stage",[206,450,227],{"class":219},[206,452,453],{"class":230},"🏗️ provision-lab\n",[206,455,456,459,461],{"class":208,"line":310},[206,457,458],{"class":223},"    auto_define_backend",[206,460,227],{"class":219},[206,462,463],{"class":284},"true\n",[206,465,466,469],{"class":208,"line":320},[206,467,468],{"class":223},"    rules",[206,470,240],{"class":219},[206,472,473,476,478,480],{"class":208,"line":328},[206,474,475],{"class":219},"      - ",[206,477,334],{"class":223},[206,479,227],{"class":219},[206,481,339],{"class":230},[206,483,484,487,489],{"class":208,"line":342},[206,485,486],{"class":223},"        when",[206,488,227],{"class":219},[206,490,350],{"class":230},[13,492,493],{},[57,494],{"alt":495,"src":140},"Les composants de validation, de planification et de déploiement sont configurés avec le paramètre auto_define_backend: true",[13,497,498],{},"La configuration de l'infrastructure crée une instance EC2 CentOS Stream 9 avec des groupes de sécurité appropriés pour autoriser l'accès SSH depuis les runners GitLab et l'accès HTTP au serveur Tomcat.",[13,500,501,502,507],{},"L'accès SSH et la configuration HTTP sont configurés par le biais des ",[20,503,506],{"href":504,"rel":505},"https://docs.gitlab.com/ci/variables/#define-a-cicd-variable-in-the-ui",[],"variables d'environnement GitLab CI/CD",".",[13,509,510],{},[57,511],{"alt":512,"src":513},"Accès SSH et configuration HTTP","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750433381/cmqtzg6ahz8ua5w8ybgs.png",[13,515,516,517,522],{},"Pour un accès sécurisé au cloud, le projet met en œuvre ",[20,518,521],{"href":519,"rel":520},"https://docs.gitlab.com/ci/cloud_services/aws/",[],"l'intégration OpenID Connect de GitLab"," avec AWS, en utilisant des identifiants de connexion temporaires via AWS Security Token Service (STS) :",[197,524,527],{"className":525,"code":526,"language":356,"meta":202},[354],"# From .gitlab-ci.yml\n.tofu_aws_setup:\n id_tokens:\n   OIDC_TOKEN:\n     aud: https://gitlab.com\n before_script:\n   - echo \"${OIDC_TOKEN}\" > /tmp/web_identity_token\n   - export AWS_PROFILE=\"\"\n   - export AWS_ROLE_ARN=\"${AWS_ROLE_ARN}\"\n   - export AWS_WEB_IDENTITY_TOKEN_FILE=\"/tmp/web_identity_token\"\n\n",[177,528,526],{"__ignoreMap":202},[142,530,532],{"id":531},"création-de-lenvironnement-dexécution-ansible","Création de l'environnement d'exécution Ansible",[13,534,535,536,541],{},"Les déploiements modernes avec Ansible reposent largement sur l'utilisation d'",[20,537,540],{"href":538,"rel":539},"https://docs.ansible.com/ansible/latest/getting_started_ee/index.html",[],"environnements d'exécution"," : il s'agit de versions conteneurisées qui encapsulent Ansible avec toutes ses dépendances, y compris les rôles et les collections préinstallés nécessaires. Dans ce projet, un environnement d'exécution personnalisé est créé, basé sur Fedora 39, qui inclut ansible-core, ansible-runner ainsi que des collections spécifiques, telle que ansible.posix, requise dans cet exemple pour configurer le pare-feu et SELinux.",[13,543,544,545,507],{},"Les rôles et collections tiers de ce projet sont téléchargés en mode natif à partir du dépôt communautaire Ansible Galaxy. Cette approche s'appuie sur l'écosystème de contenu Ansible réutilisable de la communauté, comme le montre la configuration de l'environnement d'exécution. Bien que cette démonstration utilise des ressources Ansible de la communauté, cette mise en œuvre de pipeline est entièrement compatible avec Red Hat Ansible Automation Platform. La structure du pipeline reste identique ; seules les sources de contenu changent. Ainsi, les entreprises qui utilisent la version Enterprise peuvent simplement rediriger leurs sources de contenu d'automatisation vers leur Automation Hub privé au lieu du dépôt Ansible Galaxy par défaut issu de la communauté. Selon la documentation officielle d'Ansible, vous pouvez réaliser cette opération en ",[20,546,549],{"href":547,"rel":548},"https://docs.redhat.com/en/documentation/red_hat_ansible_automation_platform/1.2/html/getting_started_with_red_hat_ansible_automation_hub/proc-configure-automation-hub-server#proc-configure-automation-hub-server",[],"configurant votre serveur Automation Hub privé et votre token d'accès dans le fichier ansible.cfg",[197,551,553],{"className":199,"code":552,"language":201,"meta":202,"style":202},"# From execution-environment.yml\n---\nversion: 3\n\nimages:\n  base_image:\n    name: quay.io/fedora/fedora:39\n\ndependencies:\n  ansible_core:\n    package_pip: ansible-core\n  ansible_runner:\n    package_pip: ansible-runner\n  system:\n    - openssh-clients\n    - sshpass\n  galaxy:\n    collections:\n    - name: ansible.posix\n      version: \">=2.0.0\"\n\n",[177,554,555,560,566,576,582,589,596,606,610,617,624,634,641,650,658,667,675,683,691,704],{"__ignoreMap":202},[206,556,557],{"class":208,"line":209},[206,558,559],{"class":212},"# From execution-environment.yml\n",[206,561,562],{"class":208,"line":216},[206,563,565],{"class":564},"s7eDp","---\n",[206,567,568,571,573],{"class":208,"line":234},[206,569,570],{"class":223},"version",[206,572,227],{"class":219},[206,574,575],{"class":284},"3\n",[206,577,578],{"class":208,"line":243},[206,579,581],{"emptyLinePlaceholder":580},true,"\n",[206,583,584,587],{"class":208,"line":254},[206,585,586],{"class":223},"images",[206,588,240],{"class":219},[206,590,591,594],{"class":208,"line":265},[206,592,593],{"class":223},"  base_image",[206,595,240],{"class":219},[206,597,598,601,603],{"class":208,"line":276},[206,599,600],{"class":223},"    name",[206,602,227],{"class":219},[206,604,605],{"class":230},"quay.io/fedora/fedora:39\n",[206,607,608],{"class":208,"line":288},[206,609,581],{"emptyLinePlaceholder":580},[206,611,612,615],{"class":208,"line":299},[206,613,614],{"class":223},"dependencies",[206,616,240],{"class":219},[206,618,619,622],{"class":208,"line":310},[206,620,621],{"class":223},"  ansible_core",[206,623,240],{"class":219},[206,625,626,629,631],{"class":208,"line":320},[206,627,628],{"class":223},"    package_pip",[206,630,227],{"class":219},[206,632,633],{"class":230},"ansible-core\n",[206,635,636,639],{"class":208,"line":328},[206,637,638],{"class":223},"  ansible_runner",[206,640,240],{"class":219},[206,642,643,645,647],{"class":208,"line":342},[206,644,628],{"class":223},[206,646,227],{"class":219},[206,648,649],{"class":230},"ansible-runner\n",[206,651,653,656],{"class":208,"line":652},14,[206,654,655],{"class":223},"  system",[206,657,240],{"class":219},[206,659,661,664],{"class":208,"line":660},15,[206,662,663],{"class":219},"    - ",[206,665,666],{"class":230},"openssh-clients\n",[206,668,670,672],{"class":208,"line":669},16,[206,671,663],{"class":219},[206,673,674],{"class":230},"sshpass\n",[206,676,678,681],{"class":208,"line":677},17,[206,679,680],{"class":223},"  galaxy",[206,682,240],{"class":219},[206,684,686,689],{"class":208,"line":685},18,[206,687,688],{"class":223},"    collections",[206,690,240],{"class":219},[206,692,694,696,699,701],{"class":208,"line":693},19,[206,695,663],{"class":219},[206,697,698],{"class":223},"name",[206,700,227],{"class":219},[206,702,703],{"class":230},"ansible.posix\n",[206,705,707,710,712],{"class":208,"line":706},20,[206,708,709],{"class":223},"      version",[206,711,227],{"class":219},[206,713,714],{"class":230},"\">=2.0.0\"\n",[13,716,717],{},[57,718],{"alt":719,"src":720},"Environnement d'exécution faisant l'objet d'un push vers le registre de conteneurs de GitLab ","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750433384/dh1o2ojjmb04ru4tfr9k.png",[13,722,723,724,727],{},"L'environnement d'exécution est défini dans un fichier YAML, généré à l'aide d'ansible-builder, puis faisant l'objet d'un push vers le ",[20,725,95],{"href":93,"rel":726},[],". Cette approche garantit des environnements d'exécution cohérents d'un système à l'autre, tout en simplifiant la gestion des dépendances.",[197,729,732],{"className":730,"code":731,"language":356,"meta":202},[354],"# From gitlab-ci.yml\n🔨 ansible-build-ee:\n  stage: 📦 ansible-build-ee\n  image: docker:24.0.5\n  needs: []\n  services:\n    - docker:24.0.5-dind\n  before_script:\n    - apk add --no-cache python3 py3-pip\n    - pip install ansible-builder\n    - cd ansible/execution-environment\n  script:\n    - ansible-builder build -t ${EE_IMAGE_NAME}:${EE_IMAGE_TAG} --container-runtime docker\n    - docker tag ${EE_IMAGE_NAME}:${EE_IMAGE_TAG} ${CI_REGISTRY_IMAGE}/${EE_IMAGE_NAME}:${EE_IMAGE_TAG}\n    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY\n    - docker push ${CI_REGISTRY_IMAGE}/${EE_IMAGE_NAME}:${EE_IMAGE_TAG}\n\n",[177,733,731],{"__ignoreMap":202},[142,735,737],{"id":736},"déploiement-de-tomcat-avec-ansible","Déploiement de Tomcat avec Ansible",[13,739,740,741,746],{},"Une fois l'infrastructure provisionnée et l'environnement d'exécution construit, le pipeline déploie Tomcat à l'aide d'",[20,742,745],{"href":743,"rel":744},"https://ansible.readthedocs.io/projects/navigator/",[],"Ansible Navigator",". L'environnement d'exécution créé à l'étape précédente est utilisé comme image pour le job de déploiement dans le pipeline GitLab.",[197,748,751],{"className":749,"code":750,"language":356,"meta":202},[354],"# From gitlab-ci.yml\n🚀 ansible-deploy:\n  stage: 🚀 ansible-deploy\n  image: ${CI_REGISTRY_IMAGE}/${EE_IMAGE_NAME}:${EE_IMAGE_TAG}\n  needs:\n    - ✅ tofu-apply\n  extends: [.ssh_private_key_setup, .default_rules]\n  script:\n    - ansible-navigator run ansible/playbook.yml \n      -i ansible/inventory/hosts.ini\n      --execution-environment false\n      --mode stdout \n      --log-level debug\n\n",[177,752,750],{"__ignoreMap":202},[13,754,755,756,760],{},"Ce processus récupère le paquet applicatif depuis le ",[20,757,759],{"href":115,"rel":758},[],"dépôt de paquets générique de GitLab",", configure les utilisateurs et les autorisations système, et définit Tomcat comme service systemd.",[197,762,764],{"className":199,"code":763,"language":201,"meta":202,"style":202},"# From playbook.yml\n---\n- name: Deploy Tomcat Server\n  hosts: all\n  become: true\n  roles:\n      - role: tomcat\n  \n  vars:\n    # Tomcat package and installation\n    tomcat_package: \"https://gitlab.com/api/v4/projects/67604719/packages/generic/apache-tomcat/10.1.39/apache-tomcat-10.1.39.tar.gz\"\n    tomcat_install_dir: \"/opt/tomcat\"\n    java_package: \"java-17-openjdk-devel\"\n\n",[177,765,766,771,775,786,796,805,812,824,829,836,841,851,861],{"__ignoreMap":202},[206,767,768],{"class":208,"line":209},[206,769,770],{"class":212},"# From playbook.yml\n",[206,772,773],{"class":208,"line":216},[206,774,565],{"class":564},[206,776,777,779,781,783],{"class":208,"line":234},[206,778,380],{"class":219},[206,780,698],{"class":223},[206,782,227],{"class":219},[206,784,785],{"class":230},"Deploy Tomcat Server\n",[206,787,788,791,793],{"class":208,"line":243},[206,789,790],{"class":223},"  hosts",[206,792,227],{"class":219},[206,794,795],{"class":230},"all\n",[206,797,798,801,803],{"class":208,"line":254},[206,799,800],{"class":223},"  become",[206,802,227],{"class":219},[206,804,463],{"class":284},[206,806,807,810],{"class":208,"line":265},[206,808,809],{"class":223},"  roles",[206,811,240],{"class":219},[206,813,814,816,819,821],{"class":208,"line":276},[206,815,475],{"class":219},[206,817,818],{"class":223},"role",[206,820,227],{"class":219},[206,822,823],{"class":230},"tomcat\n",[206,825,826],{"class":208,"line":288},[206,827,828],{"class":219},"  \n",[206,830,831,834],{"class":208,"line":299},[206,832,833],{"class":223},"  vars",[206,835,240],{"class":219},[206,837,838],{"class":208,"line":310},[206,839,840],{"class":212},"    # Tomcat package and installation\n",[206,842,843,846,848],{"class":208,"line":320},[206,844,845],{"class":223},"    tomcat_package",[206,847,227],{"class":219},[206,849,850],{"class":230},"\"https://gitlab.com/api/v4/projects/67604719/packages/generic/apache-tomcat/10.1.39/apache-tomcat-10.1.39.tar.gz\"\n",[206,852,853,856,858],{"class":208,"line":328},[206,854,855],{"class":223},"    tomcat_install_dir",[206,857,227],{"class":219},[206,859,860],{"class":230},"\"/opt/tomcat\"\n",[206,862,863,866,868],{"class":208,"line":342},[206,864,865],{"class":223},"    java_package",[206,867,227],{"class":219},[206,869,870],{"class":230},"\"java-17-openjdk-devel\"\n",[13,872,873],{},[57,874],{"alt":875,"src":876},"Registre de paquets de GitLab","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750433381/mynak8i2k7ms9vhdijqg.png",[142,878,880],{"id":879},"scan-de-sécurité-et-qualité-du-code","Scan de sécurité et qualité du code",[13,882,883,884,888,889,894,895,507],{},"La sécurité est intégrée tout au long du pipeline avec plusieurs outils de scan. Ce projet utilise le ",[20,885,887],{"href":100,"rel":886},[],"scanner SAST IaC intégré de GitLab"," pour détecter les vulnérabilités dans le code Terraform et Ansible. L'",[20,890,893],{"href":891,"rel":892},"https://docs.gitlab.com/user/application_security/container_scanning/",[],"analyse des conteneurs"," est appliquée à l'image de l'environnement d'exécution pour identifier tout problème de sécurité et générer une ",[20,896,900],{"href":897,"rel":898,"title":899},"https://about.gitlab.com/fr-fr/blog/the-ultimate-guide-to-sboms/",[],"Qu'est-ce qu'une nomenclature logicielle ?","nomenclature logicielle (SBOM)",[197,902,904],{"className":199,"code":903,"language":201,"meta":202,"style":202},"# From gitlab-ci.yml\ninclude: \n- template: Jobs/SAST-IaC.gitlab-ci.yml \n- template: Jobs/Container-Scanning.gitlab-ci.yml\n",[177,905,906,910,918,933],{"__ignoreMap":202},[206,907,908],{"class":208,"line":209},[206,909,375],{"class":212},[206,911,912,915],{"class":208,"line":216},[206,913,914],{"class":223},"include",[206,916,917],{"class":219},": \n",[206,919,920,922,925,927,930],{"class":208,"line":234},[206,921,380],{"class":219},[206,923,924],{"class":223},"template",[206,926,227],{"class":219},[206,928,929],{"class":230},"Jobs/SAST-IaC.gitlab-ci.yml",[206,931,932],{"class":219}," \n",[206,934,935,937,939,941],{"class":208,"line":243},[206,936,380],{"class":219},[206,938,924],{"class":223},[206,940,227],{"class":219},[206,942,943],{"class":230},"Jobs/Container-Scanning.gitlab-ci.yml\n",[13,945,946],{},[57,947],{"alt":948,"src":949},"La sécurité est intégrée à chaque étape du pipeline avec plusieurs outils de scanning","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750433386/e6ejckcv5kdyhhosej2f.png",[13,951,952,953,958],{},"De plus, le projet utilise Ansible Linter et ses résultats sont intégrés à ",[20,954,957],{"href":955,"rel":956},"https://docs.gitlab.com/ci/testing/code_quality/#import-code-quality-results-from-a-cicd-job",[],"GitLab Code Quality",". Cette intégration produit des rapports qui sont affichés directement dans l'interface de GitLab, ce qui facilite l'identification et la résolution des anomalies.",[197,960,963],{"className":961,"code":962,"language":356,"meta":202},[354],"# From gitlab-ci.yml\n🔍 ansible-lint:\n  stage: 🚀 ansible-deploy\n  image: ${CI_REGISTRY_IMAGE}/${EE_IMAGE_NAME}:${EE_IMAGE_TAG}\n  needs: []\n  script:\n    - ansible-lint ansible/playbook.yml -f codeclimate | python3 -m json.tool | tee gl-code-quality-report.json || true\n  artifacts:\n    reports:\n      codequality:\n        - gl-code-quality-report.json\n\n",[177,964,962],{"__ignoreMap":202},[13,966,967],{},[57,968],{"alt":969,"src":970},"Le projet utilise Ansible Linter et ses résultats sont intégrés à GitLab Code Quality","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750433380/gsfpaldra4rmtkseaudo.png",[142,972,974],{"id":973},"vérification-de-létat-du-déploiement","Vérification de l'état du déploiement",[13,976,977],{},"Après le déploiement, le pipeline effectue des vérifications de l'état pour s'assurer que le serveur Tomcat fonctionne correctement. Ce job tente d'établir une connexion au port HTTP du serveur et vérifie qu'il renvoie une réponse confirmant que le service est bien actif. Cette étape garantit que le déploiement s'est correctement terminé et que l'application est accessible.",[13,979,980],{},"Vous pouvez également tester l'accès de votre navigateur à l'instance provisionnée par Tomcat en utilisant l'adresse IP publique de l'instance provisionnée EC2.",[13,982,983],{},[57,984],{"alt":985,"src":986},"Vérification de l'état d'un job","https://res.cloudinary.com/about-gitlab-com/image/upload/v1750433385/uksdkjryydxhu94v1naj.png",[62,988,990],{"id":989},"destruction-de-lenvironnement-de-test","Destruction de l'environnement de test",[13,992,993],{},"Dernière étape du pipeline : le processus de nettoyage détruit l'environnement de test. Cette opération est mise en œuvre à l'aide du composant de destruction OpenTofu, qui garantit que toutes les ressources créées au cours de l'étape de provisionnement sont correctement supprimées.",[62,995,997],{"id":996},"récapitulatif","Récapitulatif",[13,999,1000,1001,1007],{},"GitLab offre une plateforme DevSecOps unifiée et un framework pour gérer, à l'échelle de l'entreprise, les pratiques d'automatisation critiques telles que la gestion des configurations et de l'IaC (Infrastructure as Code). Ce framework inclut le ",[20,1002,1006],{"href":1003,"rel":1004,"title":1005},"https://about.gitlab.com/fr-fr/topics/version-control/",[],"Qu'est-ce que le contrôle de version ?","contrôle de version",", la planification de projet, la gestion des tickets, la collaboration entre les équipes, les pipelines CI/CD, la gestion du paquet de binaires et du registre de conteneurs, le scan de sécurité et de nombreuses autres fonctionnalités utiles. Il permet également de renforcer la gouvernance grâce à des contrôles intégrés dans les processus. Si vous cherchez à développer vos pratiques cloud (qu’il s’agisse d’un cloud privé ou public) ou plus généralement, de tout workflow d'automatisation en libre-service doté de règles de gouvernance, envisagez d'utiliser GitLab, TerraForm et Ansible comme les trois piliers d'une plateforme d'automatisation à la fois évolutive et conforme aux exigences de gouvernance.",[1009,1010,1011],"blockquote",{},[13,1012,1013,1014,1019],{},"Lancez-vous avec un ",[20,1015,1018],{"href":1016,"rel":1017},"http://bout.gitlab.com/free-trial/",[],"essai gratuit de GitLab Ultimate",". Inscrivez-vous dès aujourd'hui !",[1021,1022,1023],"style",{},"html pre.shiki code .sAwPA, html code.shiki .sAwPA{--shiki-default:#6A737D}html pre.shiki code .sgsFI, html code.shiki .sgsFI{--shiki-default:#24292E}html pre.shiki code .shJU0, html code.shiki .shJU0{--shiki-default:#22863A}html pre.shiki code .sYBdl, html code.shiki .sYBdl{--shiki-default:#032F62}html pre.shiki code .sYu0t, html code.shiki .sYu0t{--shiki-default:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html pre.shiki code .s7eDp, html code.shiki .s7eDp{--shiki-default:#6F42C1}",{"title":202,"searchDepth":216,"depth":216,"links":1025},[1026,1033,1034],{"id":64,"depth":216,"text":65,"children":1027},[1028,1029,1030,1031,1032],{"id":144,"depth":234,"text":145},{"id":531,"depth":234,"text":532},{"id":736,"depth":234,"text":737},{"id":879,"depth":234,"text":880},{"id":973,"depth":234,"text":974},{"id":989,"depth":216,"text":990},{"id":996,"depth":216,"text":997},"engineering","2019-07-01","Découvrez comment automatiser la gestion de votre infrastructure pour accompagner la croissance de votre entreprise grâce à des pipelines CI/CD sécurisés et un scan de sécurité intégré, à l'aide de GitLab, Terraform/OpenTofu et Ansible.","md",null,false,"https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,w_820,h_500,c_lfill/v1746211002/zlet4rmfg2z0j6lg16mc.png",{},"/fr-fr/blog/using-ansible-and-gitlab-as-infrastructure-for-code",{"ogTitle":1045,"ogImage":1041,"ogDescription":1046,"ogSiteName":1047,"noIndex":1040,"ogType":1048,"ogUrl":1049,"title":1045,"canonicalUrls":1049,"description":1046},"Créez des pipelines IaC évolutifs avec GitLab","Automatisez la gestion de votre infrastructure avec des pipelines CI/CD sécurisés, un scan de sécurité intégré, à l’aide de GitLab, Terraform/OpenTofu, Ansible.","https://about.gitlab.com","article","https://about.gitlab.com/blog/using-ansible-and-gitlab-as-infrastructure-for-code","using-ansible-and-gitlab-as-infrastructure-for-code","fr-fr/blog/using-ansible-and-gitlab-as-infrastructure-for-code",[1053,32],"demo","BlogPost","2025-07-17","eyMwKULN-3YQyqjkhv6TwReH9dk-icvw_rAyqOUSYwk",{"logo":1058,"freeTrial":1063,"sales":1068,"login":1073,"items":1078,"search":1406,"minimal":1442,"duo":1461,"switchNav":1470,"pricingDeployment":1481},{"config":1059},{"href":1060,"dataGaName":1061,"dataGaLocation":1062},"/fr-fr/","gitlab logo","header",{"text":1064,"config":1065},"Commencer un essai gratuit",{"href":1066,"dataGaName":1067,"dataGaLocation":1062},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr&glm_content=default-saas-trial/","free trial",{"text":1069,"config":1070},"Demander une démo",{"href":1071,"dataGaName":1072,"dataGaLocation":1062},"/fr-fr/sales/?contact-topic=request-demo","sales",{"text":1074,"config":1075},"Connexion",{"href":1076,"dataGaName":1077,"dataGaLocation":1062},"https://gitlab.com/users/sign_in/","sign in",[1079,1108,1209,1214,1328,1384],{"text":1080,"config":1081,"menu":1083},"Plateforme",{"dataNavLevelOne":1082},"platform",{"type":1084,"columns":1085},"cards",[1086,1092,1100],{"title":1080,"description":1087,"link":1088},"La plateforme d'orchestration intelligente pour le DevSecOps",{"text":1089,"config":1090},"Explorer notre plateforme",{"href":1091,"dataGaName":1082,"dataGaLocation":1062},"/fr-fr/platform/",{"title":1093,"description":1094,"link":1095},"GitLab Duo Agent Platform","L'IA agentique pour l'ensemble du cycle de développement logiciel",{"text":1096,"config":1097},"Découvrir GitLab Duo",{"href":1098,"dataGaName":1099,"dataGaLocation":1062},"/fr-fr/gitlab-duo-agent-platform/","gitlab duo agent platform",{"title":1101,"description":1102,"link":1103},"Pourquoi GitLab ?","Découvrez les principales raisons pour lesquelles les entreprises choisissent GitLab",{"text":1104,"config":1105},"En savoir plus",{"href":1106,"dataGaName":1107,"dataGaLocation":1062},"/fr-fr/why-gitlab/","why gitlab",{"text":1109,"left":580,"config":1110,"menu":1112},"Produit",{"dataNavLevelOne":1111},"solutions",{"type":1113,"link":1114,"columns":1118,"feature":1188},"lists",{"text":1115,"config":1116},"Voir toutes les solutions",{"href":1117,"dataGaName":1111,"dataGaLocation":1062},"/fr-fr/solutions/",[1119,1143,1166],{"title":1120,"description":1121,"link":1122,"items":1127},"Automatisation","CI/CD et automatisation pour accélérer le déploiement",{"config":1123},{"icon":1124,"href":1125,"dataGaName":1126,"dataGaLocation":1062},"AutomatedCodeAlt","/fr-fr/solutions/delivery-automation/","automated software delivery",[1128,1131,1134,1139],{"text":32,"config":1129},{"href":1130,"dataGaLocation":1062,"dataGaName":32},"/fr-fr/solutions/continuous-integration/",{"text":1093,"config":1132},{"href":1098,"dataGaLocation":1062,"dataGaName":1133},"gitlab duo agent platform - product menu",{"text":1135,"config":1136},"Gestion du code source",{"href":1137,"dataGaLocation":1062,"dataGaName":1138},"/fr-fr/solutions/source-code-management/","Source Code Management",{"text":1140,"config":1141},"Livraison de logiciels automatisée",{"href":1125,"dataGaLocation":1062,"dataGaName":1142},"Automated software delivery",{"title":1144,"description":1145,"link":1146,"items":1151},"Sécurité","Livrez du code plus rapidement sans compromettre la sécurité",{"config":1147},{"href":1148,"dataGaName":1149,"dataGaLocation":1062,"icon":1150},"/fr-fr/solutions/application-security-testing/","security and compliance","ShieldCheckLight",[1152,1156,1161],{"text":1153,"config":1154},"Tests de sécurité des applications",{"href":1148,"dataGaName":1155,"dataGaLocation":1062},"Application security testing",{"text":1157,"config":1158},"Sécurité de la chaîne d'approvisionnement logicielle",{"href":1159,"dataGaLocation":1062,"dataGaName":1160},"/fr-fr/solutions/supply-chain/","Software supply chain security",{"text":1162,"config":1163},"Conformité logicielle",{"href":1164,"dataGaName":1165,"dataGaLocation":1062},"/fr-fr/solutions/software-compliance/","software compliance",{"title":1167,"link":1168,"items":1173},"Mesures",{"config":1169},{"icon":1170,"href":1171,"dataGaName":1172,"dataGaLocation":1062},"DigitalTransformation","/fr-fr/solutions/visibility-measurement/","visibility and measurement",[1174,1178,1183],{"text":1175,"config":1176},"Visibilité et mesures",{"href":1171,"dataGaLocation":1062,"dataGaName":1177},"Visibility and Measurement",{"text":1179,"config":1180},"Gestion de la chaîne de valeur",{"href":1181,"dataGaLocation":1062,"dataGaName":1182},"/fr-fr/solutions/value-stream-management/","Value Stream Management",{"text":1184,"config":1185},"Analyses et informations",{"href":1186,"dataGaLocation":1062,"dataGaName":1187},"/fr-fr/solutions/analytics-and-insights/","Analytics and insights",{"title":1189,"type":1113,"items":1190},"GitLab",[1191,1197,1203],{"text":1192,"config":1193},"Entreprises",{"icon":1194,"href":1195,"dataGaLocation":1062,"dataGaName":1196},"Building","/fr-fr/enterprise/","enterprise",{"text":1198,"config":1199},"Pour les PME",{"icon":1200,"href":1201,"dataGaLocation":1062,"dataGaName":1202},"Work","/fr-fr/small-business/","small business",{"text":1204,"config":1205},"Pour le secteur public",{"icon":1206,"href":1207,"dataGaLocation":1062,"dataGaName":1208},"Organization","/fr-fr/solutions/public-sector/","public sector",{"text":1210,"config":1211},"Tarifs",{"href":1212,"dataGaName":1213,"dataGaLocation":1062,"dataNavLevelOne":1213},"/fr-fr/pricing/","pricing",{"text":1215,"config":1216,"menu":1218},"Ressources",{"dataNavLevelOne":1217},"resources",{"type":1113,"link":1219,"columns":1223,"feature":1317},{"text":1220,"config":1221},"Afficher toutes les ressources",{"href":1222,"dataGaName":1217,"dataGaLocation":1062},"/fr-fr/resources/",[1224,1257,1284],{"title":1225,"items":1226},"Premiers pas",[1227,1232,1237,1242,1247,1252],{"text":1228,"config":1229},"Installation",{"href":1230,"dataGaName":1231,"dataGaLocation":1062},"/fr-fr/install/","install",{"text":1233,"config":1234},"Guides de démarrage",{"href":1235,"dataGaName":1236,"dataGaLocation":1062},"/fr-fr/get-started/","quick setup checklists",{"text":1238,"config":1239},"Apprentissage",{"href":1240,"dataGaLocation":1062,"dataGaName":1241},"https://university.gitlab.com/","learn",{"text":1243,"config":1244},"Documentation",{"href":1245,"dataGaName":1246,"dataGaLocation":1062},"https://docs.gitlab.com/","product documentation",{"text":1248,"config":1249},"Vidéos sur les bonnes pratiques",{"href":1250,"dataGaName":1251,"dataGaLocation":1062},"/fr-fr/getting-started-videos/","best practice videos",{"text":1253,"config":1254},"Intégrations",{"href":1255,"dataGaName":1256,"dataGaLocation":1062},"/fr-fr/integrations/","integrations",{"title":1258,"items":1259},"Découvrir",[1260,1265,1270,1275,1279],{"text":1261,"config":1262},"Témoignages clients",{"href":1263,"dataGaName":1264,"dataGaLocation":1062},"/fr-fr/customers/","customer success stories",{"text":1266,"config":1267},"Blog",{"href":1268,"dataGaName":1269,"dataGaLocation":1062},"/fr-fr/blog/","blog",{"text":1271,"config":1272},"Demo Hub",{"href":1273,"dataGaName":1274,"dataGaLocation":1062},"/fr-fr/demo-hub/","demo hub",{"text":1276,"config":1277},"The Source",{"href":1278,"dataGaName":1269,"dataGaLocation":1062},"/fr-fr/the-source/",{"text":1280,"config":1281},"Travail à distance",{"href":1282,"dataGaName":1283,"dataGaLocation":1062},"https://handbook.gitlab.com/handbook/company/culture/all-remote/","remote",{"title":1285,"items":1286},"Connecter",[1287,1292,1297,1302,1307,1312],{"text":1288,"config":1289},"Services GitLab",{"href":1290,"dataGaName":1291,"dataGaLocation":1062},"/fr-fr/services/","services",{"text":1293,"config":1294},"Contribuer",{"href":1295,"dataGaName":1296,"dataGaLocation":1062},"https://contributors.gitlab.com","contribute",{"text":1298,"config":1299},"Communauté",{"href":1300,"dataGaName":1301,"dataGaLocation":1062},"/community/","community",{"text":1303,"config":1304},"Forum",{"href":1305,"dataGaName":1306,"dataGaLocation":1062},"https://forum.gitlab.com/","forum",{"text":1308,"config":1309},"Événements",{"href":1310,"dataGaName":1311,"dataGaLocation":1062},"/events/","events",{"text":1313,"config":1314},"Partenaires",{"href":1315,"dataGaName":1316,"dataGaLocation":1062},"/fr-fr/partners/","partners",{"config":1318,"title":1321,"text":1322,"link":1323},{"background":1319,"textColor":1320},"url('https://res.cloudinary.com/about-gitlab-com/image/upload/v1777322348/qpq8yrgn8knii57omj0c.png')","#000","Nouveautés de GitLab","Découvrez les dernières fonctionnalités et améliorations.",{"text":1324,"config":1325},"Lire les articles les plus récents",{"href":1326,"dataGaName":1327,"dataGaLocation":1062},"/fr-fr/whats-new/","whats new",{"text":1329,"config":1330,"menu":1332},"Société",{"dataNavLevelOne":1331},"company",{"type":1113,"columns":1333},[1334],{"items":1335},[1336,1341,1347,1349,1354,1359,1364,1369,1374,1379],{"text":1337,"config":1338},"À propos",{"href":1339,"dataGaName":1340,"dataGaLocation":1062},"/fr-fr/company/","about",{"text":1342,"config":1343,"footerGa":1346},"Carrières",{"href":1344,"dataGaName":1345,"dataGaLocation":1062},"/jobs/","jobs",{"dataGaName":1345},{"text":1308,"config":1348},{"href":1310,"dataGaName":1311,"dataGaLocation":1062},{"text":1350,"config":1351},"Leadership",{"href":1352,"dataGaName":1353,"dataGaLocation":1062},"/company/team/e-group/","leadership",{"text":1355,"config":1356},"Manuel",{"href":1357,"dataGaName":1358,"dataGaLocation":1062},"https://handbook.gitlab.com/","handbook",{"text":1360,"config":1361},"Relations avec les investisseurs",{"href":1362,"dataGaName":1363,"dataGaLocation":1062},"https://ir.gitlab.com/overview/default.aspx","investor relations",{"text":1365,"config":1366},"Trust Center",{"href":1367,"dataGaName":1368,"dataGaLocation":1062},"/fr-fr/security/","trust center",{"text":1370,"config":1371},"Centre pour la transparence de l'IA",{"href":1372,"dataGaName":1373,"dataGaLocation":1062},"/fr-fr/ai-transparency-center/","ai transparency center",{"text":1375,"config":1376},"Newsletter",{"href":1377,"dataGaName":1378,"dataGaLocation":1062},"/company/contact/#contact-forms","newsletter",{"text":1380,"config":1381},"Presse",{"href":1382,"dataGaName":1383,"dataGaLocation":1062},"/press/","press",{"text":1385,"config":1386,"menu":1387},"Nous contacter",{"dataNavLevelOne":1331},{"type":1113,"columns":1388},[1389],{"items":1390},[1391,1396,1401],{"text":1392,"config":1393},"Contacter l'équipe commerciale",{"href":1394,"dataGaName":1395,"dataGaLocation":1062},"/fr-fr/sales/","talk to sales",{"text":1397,"config":1398},"Assistance GitLab",{"href":1399,"dataGaName":1400,"dataGaLocation":1062},"https://support.gitlab.com/hc/en-us","support portal",{"text":1402,"config":1403},"Portail clients GitLab",{"href":1404,"dataGaName":1405,"dataGaLocation":1062},"https://customers.gitlab.com/customers/sign_in/","customer portal",{"close":1407,"login":1408,"suggestions":1415},"Fermer",{"text":1409,"link":1410},"Pour rechercher des dépôts et des projets, connectez-vous à",{"text":1411,"config":1412},"GitLab.com",{"href":1076,"dataGaName":1413,"dataGaLocation":1414},"search login","search",{"text":1416,"default":1417},"Suggestions",[1418,1421,1426,1428,1433,1438],{"text":1093,"config":1419},{"href":1098,"dataGaName":1420,"dataGaLocation":1414},"GitLab Duo Agent Platform",{"text":1422,"config":1423},"Suggestions de code (IA)",{"href":1424,"dataGaName":1425,"dataGaLocation":1414},"/fr-fr/solutions/code-suggestions/","Code Suggestions (AI)",{"text":32,"config":1427},{"href":1130,"dataGaName":32,"dataGaLocation":1414},{"text":1429,"config":1430},"GitLab sur AWS",{"href":1431,"dataGaName":1432,"dataGaLocation":1414},"/fr-fr/partners/technology-partners/aws/","GitLab on AWS",{"text":1434,"config":1435},"GitLab sur Google Cloud",{"href":1436,"dataGaName":1437,"dataGaLocation":1414},"/fr-fr/partners/technology-partners/google-cloud-platform/","GitLab on Google Cloud",{"text":1439,"config":1440},"Pourquoi utiliser GitLab ?",{"href":1106,"dataGaName":1441,"dataGaLocation":1414},"Why GitLab?",{"freeTrial":1443,"mobileIcon":1448,"desktopIcon":1453,"secondaryButton":1456},{"text":1444,"config":1445},"Commencer votre essai gratuit",{"href":1446,"dataGaName":1067,"dataGaLocation":1447},"https://gitlab.com/-/trials/new/","nav",{"altText":1449,"config":1450},"Icône GitLab",{"src":1451,"dataGaName":1452,"dataGaLocation":1447},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203874/jypbw1jx72aexsoohd7x.svg","gitlab icon",{"altText":1449,"config":1454},{"src":1455,"dataGaName":1452,"dataGaLocation":1447},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1758203875/gs4c8p8opsgvflgkswz9.svg",{"text":1457,"config":1458},"Commencer",{"href":1459,"dataGaName":1460,"dataGaLocation":1447},"https://gitlab.com/-/trial_registrations/new?glm_source=about.gitlab.com/fr-fr/get-started/","get started",{"freeTrial":1462,"mobileIcon":1466,"desktopIcon":1468},{"text":1463,"config":1464},"En savoir plus sur GitLab Duo",{"href":1098,"dataGaName":1465,"dataGaLocation":1447},"gitlab duo",{"altText":1449,"config":1467},{"src":1451,"dataGaName":1452,"dataGaLocation":1447},{"altText":1449,"config":1469},{"src":1455,"dataGaName":1452,"dataGaLocation":1447},{"button":1471,"mobileIcon":1476,"desktopIcon":1478},{"text":1472,"config":1473},"/switch",{"href":1474,"dataGaName":1475,"dataGaLocation":1447},"#contact","switch",{"altText":1449,"config":1477},{"src":1451,"dataGaName":1452,"dataGaLocation":1447},{"altText":1449,"config":1479},{"src":1480,"dataGaName":1452,"dataGaLocation":1447},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1773335277/ohhpiuoxoldryzrnhfrh.png",{"freeTrial":1482,"mobileIcon":1487,"desktopIcon":1489},{"text":1483,"config":1484},"Retour aux tarifs",{"href":1212,"dataGaName":1485,"dataGaLocation":1447,"icon":1486},"back to pricing","GoBack",{"altText":1449,"config":1488},{"src":1451,"dataGaName":1452,"dataGaLocation":1447},{"altText":1449,"config":1490},{"src":1455,"dataGaName":1452,"dataGaLocation":1447},{"title":1492,"button":1493,"config":1497},"GitLab Orbit est arrivé : la couche de contexte pour les agents d'IA.",{"text":1104,"config":1494},{"href":1495,"dataGaName":1496,"dataGaLocation":1062},"/fr-fr/gitlab-orbit/","orbit",{"layout":1498,"disabled":1040},"release",{"data":1500},{"text":1501,"source":1502,"edit":1508,"contribute":1513,"config":1517,"items":1522,"minimal":1729},"Git est une marque déposée de Software Freedom Conservancy et notre utilisation de « GitLab » est sous licence.",{"text":1503,"config":1504},"Afficher le code source de la page",{"href":1505,"dataGaName":1506,"dataGaLocation":1507},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/","page source","footer",{"text":1509,"config":1510},"Modifier cette page",{"href":1511,"dataGaName":1512,"dataGaLocation":1507},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/content/","web ide",{"text":1293,"config":1514},{"href":1515,"dataGaName":1516,"dataGaLocation":1507},"https://gitlab.com/gitlab-com/marketing/digital-experience/about-gitlab-com/-/blob/main/CONTRIBUTING.md/","please contribute",{"twitter":1518,"facebook":1519,"youtube":1520,"linkedin":1521},"https://twitter.com/gitlab","https://www.facebook.com/gitlab","https://www.youtube.com/channel/UCnMGQ8QHMAnVIsI3xJrihhg","https://www.linkedin.com/company/gitlab-com",[1523,1569,1621,1664,1696],{"title":1210,"links":1524,"subMenu":1539},[1525,1529,1534],{"text":1526,"config":1527},"Voir les forfaits",{"href":1212,"dataGaName":1528,"dataGaLocation":1507},"view plans",{"text":1530,"config":1531},"GitLab Premium",{"href":1532,"dataGaName":1533,"dataGaLocation":1507},"/fr-fr/pricing/premium/","why premium",{"text":1535,"config":1536},"GitLab Ultimate",{"href":1537,"dataGaName":1538,"dataGaLocation":1507},"/fr-fr/pricing/ultimate/","why ultimate",[1540],{"title":1385,"links":1541},[1542,1544,1546,1549,1554,1559,1564],{"text":1392,"config":1543},{"href":1394,"dataGaName":1072,"dataGaLocation":1507},{"text":1397,"config":1545},{"href":1399,"dataGaName":1400,"dataGaLocation":1507},{"text":1547,"config":1548},"Portail clients",{"href":1404,"dataGaName":1405,"dataGaLocation":1507},{"text":1550,"config":1551},"Statut",{"href":1552,"dataGaName":1553,"dataGaLocation":1507},"https://status.gitlab.com/","status",{"text":1555,"config":1556},"Conditions d'utilisation",{"href":1557,"dataGaName":1558,"dataGaLocation":1507},"/terms/","terms of use",{"text":1560,"config":1561},"Politique de confidentialité",{"href":1562,"dataGaName":1563,"dataGaLocation":1507},"/fr-fr/privacy/","privacy statement",{"text":1565,"config":1566},"Gestion des cookies",{"dataGaName":1567,"dataGaLocation":1507,"id":1568,"isOneTrustButton":580},"cookie preferences","ot-sdk-btn",{"title":1109,"links":1570,"subMenu":1579},[1571,1575],{"text":1572,"config":1573},"Plateforme DevSecOps",{"href":1091,"dataGaName":1574,"dataGaLocation":1507},"devsecops platform",{"text":1576,"config":1577},"Développement assisté par l'IA",{"href":1098,"dataGaName":1578,"dataGaLocation":1507},"ai-assisted development",[1580],{"title":1581,"links":1582},"Thèmes",[1583,1587,1592,1596,1601,1606,1611,1616],{"text":32,"config":1584},{"href":1585,"dataGaName":1586,"dataGaLocation":1507},"/fr-fr/topics/ci-cd/","cicd",{"text":1588,"config":1589},"GitOps",{"href":1590,"dataGaName":1591,"dataGaLocation":1507},"/fr-fr/topics/gitops/","gitops",{"text":25,"config":1593},{"href":1594,"dataGaName":1595,"dataGaLocation":1507},"/fr-fr/topics/devops/","devops",{"text":1597,"config":1598},"Contrôle de version",{"href":1599,"dataGaName":1600,"dataGaLocation":1507},"/fr-fr/topics/version-control/","version control",{"text":1602,"config":1603},"DevSecOps",{"href":1604,"dataGaName":1605,"dataGaLocation":1507},"/fr-fr/topics/devsecops/","devsecops",{"text":1607,"config":1608},"Cloud-native",{"href":1609,"dataGaName":1610,"dataGaLocation":1507},"/fr-fr/topics/cloud-native/","cloud native",{"text":1612,"config":1613},"IA pour la programmation",{"href":1614,"dataGaName":1615,"dataGaLocation":1507},"/fr-fr/topics/devops/ai-for-coding/","ai for coding",{"text":1617,"config":1618},"IA agentique",{"href":1619,"dataGaName":1620,"dataGaLocation":1507},"/fr-fr/topics/agentic-ai/","agentic ai",{"title":1622,"links":1623},"Solutions",[1624,1627,1629,1634,1637,1640,1643,1646,1648,1651,1654,1659],{"text":1153,"config":1625},{"href":1148,"dataGaName":1626,"dataGaLocation":1507},"Application Security Testing",{"text":1140,"config":1628},{"href":1125,"dataGaName":1126,"dataGaLocation":1507},{"text":1630,"config":1631},"Développement Agile",{"href":1632,"dataGaName":1633,"dataGaLocation":1507},"/fr-fr/solutions/agile-delivery/","agile delivery",{"text":1135,"config":1635},{"href":1137,"dataGaName":1636,"dataGaLocation":1507},"source code management",{"text":32,"config":1638},{"href":1130,"dataGaName":1639,"dataGaLocation":1507},"continuous integration & delivery",{"text":1179,"config":1641},{"href":1181,"dataGaName":1642,"dataGaLocation":1507},"value stream management",{"text":1588,"config":1644},{"href":1645,"dataGaName":1591,"dataGaLocation":1507},"/fr-fr/solutions/gitops/",{"text":1192,"config":1647},{"href":1195,"dataGaName":1196,"dataGaLocation":1507},{"text":1649,"config":1650},"PME",{"href":1201,"dataGaName":1202,"dataGaLocation":1507},{"text":1652,"config":1653},"Secteur public",{"href":1207,"dataGaName":1208,"dataGaLocation":1507},{"text":1655,"config":1656},"Éducation",{"href":1657,"dataGaName":1658,"dataGaLocation":1507},"/fr-fr/solutions/education/","education",{"text":1660,"config":1661},"Services financiers",{"href":1662,"dataGaName":1663,"dataGaLocation":1507},"/fr-fr/solutions/finance/","financial services",{"title":1215,"links":1665},[1666,1668,1670,1672,1675,1677,1680,1682,1684,1686,1688,1690,1692,1694],{"text":1228,"config":1667},{"href":1230,"dataGaName":1231,"dataGaLocation":1507},{"text":1233,"config":1669},{"href":1235,"dataGaName":1236,"dataGaLocation":1507},{"text":1238,"config":1671},{"href":1240,"dataGaName":1241,"dataGaLocation":1507},{"text":1243,"config":1673},{"href":1245,"dataGaName":1674,"dataGaLocation":1507},"docs",{"text":1266,"config":1676},{"href":1268,"dataGaName":1269,"dataGaLocation":1507},{"text":1678,"config":1679},"Nouveautés",{"href":1326,"dataGaName":1327,"dataGaLocation":1507},{"text":1261,"config":1681},{"href":1263,"dataGaName":1264,"dataGaLocation":1507},{"text":1280,"config":1683},{"href":1282,"dataGaName":1283,"dataGaLocation":1507},{"text":1288,"config":1685},{"href":1290,"dataGaName":1291,"dataGaLocation":1507},{"text":1293,"config":1687},{"href":1295,"dataGaName":1296,"dataGaLocation":1507},{"text":1298,"config":1689},{"href":1300,"dataGaName":1301,"dataGaLocation":1507},{"text":1303,"config":1691},{"href":1305,"dataGaName":1306,"dataGaLocation":1507},{"text":1308,"config":1693},{"href":1310,"dataGaName":1311,"dataGaLocation":1507},{"text":1313,"config":1695},{"href":1315,"dataGaName":1316,"dataGaLocation":1507},{"title":1329,"links":1697},[1698,1700,1702,1704,1706,1708,1713,1718,1720,1722,1724],{"text":1337,"config":1699},{"href":1339,"dataGaName":1331,"dataGaLocation":1507},{"text":1342,"config":1701},{"href":1344,"dataGaName":1345,"dataGaLocation":1507},{"text":1350,"config":1703},{"href":1352,"dataGaName":1353,"dataGaLocation":1507},{"text":1355,"config":1705},{"href":1357,"dataGaName":1358,"dataGaLocation":1507},{"text":1360,"config":1707},{"href":1362,"dataGaName":1363,"dataGaLocation":1507},{"text":1709,"config":1710},"Développement durable",{"href":1711,"dataGaName":1712,"dataGaLocation":1507},"/sustainability/","Sustainability",{"text":1714,"config":1715},"Diversité, inclusion et appartenance (DIB)",{"href":1716,"dataGaName":1717,"dataGaLocation":1507},"/fr-fr/diversity-inclusion-belonging/","Diversity, inclusion and belonging",{"text":1365,"config":1719},{"href":1367,"dataGaName":1368,"dataGaLocation":1507},{"text":1375,"config":1721},{"href":1377,"dataGaName":1378,"dataGaLocation":1507},{"text":1380,"config":1723},{"href":1382,"dataGaName":1383,"dataGaLocation":1507},{"text":1725,"config":1726},"Déclaration de transparence sur l'esclavage moderne",{"href":1727,"dataGaName":1728,"dataGaLocation":1507},"https://handbook.gitlab.com/handbook/legal/modern-slavery-act-transparency-statement/","modern slavery transparency statement",{"items":1730},[1731,1733,1735],{"text":1555,"config":1732},{"href":1557,"dataGaName":1558,"dataGaLocation":1507},{"text":1565,"config":1734},{"dataGaName":1567,"dataGaLocation":1507,"id":1568,"isOneTrustButton":580},{"text":1560,"config":1736},{"href":1562,"dataGaName":1563,"dataGaLocation":1507},[1738,1752],{"id":1739,"title":7,"body":1039,"config":1740,"content":1742,"description":1039,"extension":1746,"meta":1747,"navigation":580,"path":1748,"seo":1749,"stem":1750,"__hash__":1751},"blogAuthors/en-us/blog/authors/george-kichukov.yml",{"template":1741},"BlogAuthor",{"name":7,"config":1743},{"headshot":1744,"ctfId":1745},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1749664866/Blog/Author%20Headshots/george_kichukov.png","7e8bn05u4pXwYjkRrqdprE","yml",{},"/en-us/blog/authors/george-kichukov",{},"en-us/blog/authors/george-kichukov","UDDMPQ1Z1HpCP1BsB-pj1XWbSni3I2gAijoCAboFU3M",{"id":1753,"title":8,"body":1039,"config":1754,"content":1756,"description":1039,"extension":1746,"meta":1759,"navigation":580,"path":1760,"seo":1761,"stem":1762,"__hash__":1763},"blogAuthors/en-us/blog/authors/salahddine-aberkan.yml",{"template":1741,"gitlabHandle":1755},"saberkan",{"name":8,"config":1757},{"headshot":1758},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1750434234/comdtybiix8pjqdpsxow.png",{},"/en-us/blog/authors/salahddine-aberkan",{},"en-us/blog/authors/salahddine-aberkan","AdFL3fjgIIL8nyG0v9ZtBFV4z7UKBTjsQpD0IUnQyNY",[1765,1773,1781],{"title":1766,"description":1767,"heroImage":1768,"category":1035,"date":1769,"authors":1770,"slug":1772,"externalUrl":1039},"Green DevOps : l'importance de mesurer le bilan carbone de vos pipelines CI/CD","Les pipelines CI/CD ont un bilan carbone caché. Découvrez pourquoi il est crucial de le mesurer et comment vous lancer avec Eco CI et Carmen dans GitLab.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1765809212/noh0mdfn9o94ry9ykura.png","2026-07-22",[1771],"Lysanne Pinto","green-devops-carbon-measurement-cicd-pipeline",{"title":1774,"description":1775,"heroImage":1776,"category":1035,"date":1777,"authors":1778,"slug":1780,"externalUrl":1039},"Comment mettre en place l'observabilité CI/CD à grande échelle","Ce guide pratique consacré à l'analyse des pipelines GitLab aide les utilisateurs de GitLab Self-Managed à obtenir des indicateurs opérationnels exploitables grâce à Prometheus et Grafana.","https://res.cloudinary.com/about-gitlab-com/image/upload/f_auto,q_auto,c_lfill/v1774465167/n5hlvrsrheadeccyr1oz.png","2026-05-18",[1779],"Paul Meresanu","how-to-build-ci-cd-observability-at-scale",{"title":1782,"description":1783,"heroImage":1784,"category":1035,"date":1785,"authors":1786,"slug":1788,"externalUrl":1039},"5 modèles de pipeline GitLab pour résoudre vos enjeux d'ingénierie","Découvrez comment faire évoluer votre approche CI/CD avec des modèles composables pour les monorepos, les microservices, les environnements et la gouvernance.","https://res.cloudinary.com/about-gitlab-com/image/upload/v1772721753/frfsm1qfscwrmsyzj1qn.png","2026-05-06",[1787],"Omid Khan","5-ways-gitlab-pipeline-logic-solves-real-engineering-problems",{"promotions":1790},[1791,1805,1817,1829],{"id":1792,"categories":1793,"header":1795,"text":1796,"button":1797,"image":1802},"ai-modernization",[1794],"ai","L'IA tient-elle ses promesses à grande échelle ?","Le questionnaire ne prendra pas plus de 5 minutes.",{"text":1798,"config":1799},"Obtenez votre score de maturité IA",{"href":1800,"dataGaName":1801,"dataGaLocation":1269},"/fr-fr/assessments/ai-modernization-assessment/","modernization assessment",{"config":1803},{"src":1804},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/qix0m7kwnd8x2fh1zq49.png",{"id":1806,"categories":1807,"header":1809,"text":1796,"button":1810,"image":1814},"devops-modernization",[1808,1605],"product","Vous contentez-vous de gérer des outils ou de livrer des innovations ?",{"text":1811,"config":1812},"Obtenez votre score de maturité DevOps",{"href":1813,"dataGaName":1801,"dataGaLocation":1269},"/fr-fr/assessments/devops-modernization-assessment/",{"config":1815},{"src":1816},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138785/eg818fmakweyuznttgid.png",{"id":1818,"categories":1819,"header":1821,"text":1796,"button":1822,"image":1826},"security-modernization",[1820],"security","Faut-il sacrifier la rapidité pour garantir la sécurité ?",{"text":1823,"config":1824},"Obtenez votre score de maturité en matière de sécurité",{"href":1825,"dataGaName":1801,"dataGaLocation":1269},"/fr-fr/assessments/security-modernization-assessment/",{"config":1827},{"src":1828},"https://res.cloudinary.com/about-gitlab-com/image/upload/v1772138786/p4pbqd9nnjejg5ds6mdk.png",{"id":1830,"paths":1831,"header":1834,"text":1835,"button":1836,"image":1841},"github-azure-migration",[1832,1833],"migration-from-azure-devops-to-gitlab","integrating-azure-devops-scm-and-gitlab","Votre équipe est-elle prête pour la migration de GitHub vers Azure ?","GitHub a déjà commencé sa migration vers Azure. Découvrez ce que cela signifie pour vous.",{"text":1837,"config":1838},"Découvrez les différences entre GitLab et GitHub",{"href":1839,"dataGaName":1840,"dataGaLocation":1269},"/fr-fr/compare/gitlab-vs-github/github-azure-migration/","github azure migration",{"config":1842},{"src":1816},{"header":1844,"blurb":1845,"button":1846,"secondaryButton":1850},"Commencez à développer plus rapidement dès aujourd'hui","Découvrez ce que votre équipe peut accomplir avec la plateforme d'orchestration intelligente pour le DevSecOps.\n",{"text":1064,"config":1847},{"href":1848,"dataGaName":1067,"dataGaLocation":1849},"https://gitlab.com/-/trial_registrations/new?glm_content=default-saas-trial&glm_source=about.gitlab.com/fr-fr/","feature",{"text":1392,"config":1851},{"href":1394,"dataGaName":1072,"dataGaLocation":1849},1786803765775]