{"id":190,"date":"2026-08-30T23:42:01","date_gmt":"2026-08-30T21:42:01","guid":{"rendered":"https:\/\/asfy.fr\/index.php\/tutoriels\/awx-piloter-ansible-depuis-une-interface-web\/"},"modified":"2026-08-30T23:42:22","modified_gmt":"2026-08-30T21:42:22","slug":"awx-piloter-ansible-depuis-une-interface-web","status":"publish","type":"sv_tutoriel","link":"https:\/\/asfy.fr\/index.php\/tutoriels\/awx-piloter-ansible-depuis-une-interface-web\/","title":{"rendered":"AWX : piloter Ansible depuis une interface web"},"content":{"rendered":"<p>Si vous avez suivi le tutoriel \u00ab Ansible : installation et prise en main \u00bb, vous savez maintenant \u00e9crire et ex\u00e9cuter des playbooks en ligne de commande. Tr\u00e8s bien pour un usage personnel ou une petite \u00e9quipe technique \u2014 plus limit\u00e9 d\u00e8s qu&rsquo;il faut partager l&rsquo;automatisation avec des coll\u00e8gues moins \u00e0 l&rsquo;aise en CLI, garder un historique centralis\u00e9 des ex\u00e9cutions, ou restreindre qui a le droit de lancer quoi. C&rsquo;est exactement ce qu&rsquo;apporte <strong>AWX<\/strong>.<\/p>\n<h2>Qu&rsquo;est-ce qu&rsquo;AWX ?<\/h2>\n<p>AWX est le projet <strong>open source<\/strong> qui sert de base amont (upstream) au produit commercial Red Hat Ansible Automation Controller (anciennement \u00ab Ansible Tower \u00bb). Il ajoute une couche web compl\u00e8te au-dessus du moteur Ansible :<\/p>\n<ul>\n<li>Une <strong>interface web<\/strong> pour lancer des playbooks sans taper de commande<\/li>\n<li>Une <strong>API REST<\/strong> compl\u00e8te pour int\u00e9grer l&rsquo;automatisation dans d&rsquo;autres outils<\/li>\n<li>La gestion centralis\u00e9e des <strong>credentials<\/strong> (SSH, cloud, vault) chiffr\u00e9s en base, jamais expos\u00e9s en clair aux utilisateurs<\/li>\n<li>Le <strong>RBAC<\/strong> (contr\u00f4le d&rsquo;acc\u00e8s bas\u00e9 sur les r\u00f4les) : qui peut voir, modifier ou ex\u00e9cuter quoi, par organisation et par \u00e9quipe<\/li>\n<li>La <strong>planification<\/strong> de jobs r\u00e9currents et les <strong>notifications<\/strong> (email, Slack\u2026) en cas d&rsquo;\u00e9chec<\/li>\n<li>Un <strong>historique complet<\/strong> et consultable de chaque ex\u00e9cution, avec les logs d\u00e9taill\u00e9s de chaque t\u00e2che<\/li>\n<li>Des <strong>inventaires dynamiques<\/strong> synchronis\u00e9s automatiquement depuis vos sources (cloud, VMware, fichiers)<\/li>\n<\/ul>\n<p>En r\u00e9sum\u00e9 : Ansible reste le moteur d&rsquo;ex\u00e9cution ; AWX est la tour de contr\u00f4le qui l&rsquo;entoure pour un usage en \u00e9quipe.<\/p>\n<h2>Pr\u00e9requis<\/h2>\n<p>Depuis plusieurs versions, AWX se d\u00e9ploie exclusivement via l&rsquo;<strong>awx-operator<\/strong> sur un cluster <strong>Kubernetes<\/strong> \u2014 l&rsquo;ancienne m\u00e9thode par Docker Compose est abandonn\u00e9e. Pour tester ou pour un usage en petite structure, un cluster <strong>Minikube<\/strong> local suffit tr\u00e8s bien.<\/p>\n<ul>\n<li><code>kubectl<\/code> install\u00e9 et configur\u00e9<\/li>\n<li><code>kustomize<\/code> (int\u00e9gr\u00e9 \u00e0 <code>kubectl<\/code> depuis la version 1.14, via <code>kubectl apply -k<\/code>)<\/li>\n<li><strong>Minikube<\/strong> pour un d\u00e9ploiement de test, ou un cluster Kubernetes existant avec une <strong>StorageClass<\/strong> supportant le provisionnement dynamique en production<\/li>\n<li>Au minimum 4 CPU et 6 Go de RAM allou\u00e9s au cluster de test<\/li>\n<\/ul>\n<figure class=\"sv-diagram\">\n<svg viewBox=\"0 0 640 260\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" role=\"img\" aria-labelledby=\"awxTitle\">\n<title id=\"awxTitle\">Positionnement d&rsquo;AWX au-dessus du moteur Ansible<\/title>\n<rect x=\"10\" y=\"10\" width=\"620\" height=\"240\" rx=\"14\" fill=\"#f4f7f5\" stroke=\"#c8d6cd\"\/>\n<rect x=\"50\" y=\"40\" width=\"200\" height=\"60\" rx=\"10\" fill=\"#eaf1ec\" stroke=\"#4a7c59\" stroke-width=\"2\"\/>\n<text x=\"150\" y=\"66\" font-size=\"11\" text-anchor=\"middle\" fill=\"#2f4f3a\" font-family=\"sans-serif\" font-weight=\"bold\">Utilisateurs (\u00e9quipe)<\/text>\n<text x=\"150\" y=\"82\" font-size=\"9\" text-anchor=\"middle\" fill=\"#5a6b60\" font-family=\"sans-serif\">interface web \/ API REST<\/text>\n<line x1=\"150\" y1=\"100\" x2=\"150\" y2=\"130\" stroke=\"#4a7c59\" stroke-width=\"1.5\"\/>\n<rect x=\"50\" y=\"130\" width=\"200\" height=\"60\" rx=\"10\" fill=\"#ffffff\" stroke=\"#4a7c59\" stroke-width=\"2\"\/>\n<text x=\"150\" y=\"156\" font-size=\"11\" text-anchor=\"middle\" fill=\"#2f4f3a\" font-family=\"sans-serif\" font-weight=\"bold\">AWX<\/text>\n<text x=\"150\" y=\"172\" font-size=\"9\" text-anchor=\"middle\" fill=\"#5a6b60\" font-family=\"sans-serif\">RBAC, credentials, historique<\/text>\n<line x1=\"250\" y1=\"160\" x2=\"350\" y2=\"160\" stroke=\"#4a7c59\" stroke-width=\"2\"\/>\n<rect x=\"350\" y=\"130\" width=\"220\" height=\"60\" rx=\"10\" fill=\"#ffffff\" stroke=\"#c8d6cd\"\/>\n<text x=\"460\" y=\"156\" font-size=\"11\" text-anchor=\"middle\" fill=\"#2f4f3a\" font-family=\"sans-serif\" font-weight=\"bold\">Moteur Ansible<\/text>\n<text x=\"460\" y=\"172\" font-size=\"9\" text-anchor=\"middle\" fill=\"#5a6b60\" font-family=\"sans-serif\">playbooks, inventaire, SSH<\/text>\n<text x=\"150\" y=\"220\" font-size=\"9\" text-anchor=\"middle\" fill=\"#5a6b60\" font-family=\"sans-serif\">D\u00e9ploy\u00e9 via awx-operator sur Kubernetes<\/text>\n<\/svg><figcaption>AWX orchestre l&rsquo;ex\u00e9cution des m\u00eames playbooks Ansible, avec une couche de contr\u00f4le d&rsquo;acc\u00e8s et de tra\u00e7abilit\u00e9 en plus.<\/figcaption><\/figure>\n<h2>\u00c9tape 1 \u2014 Pr\u00e9parer un cluster de test avec Minikube<\/h2>\n<pre><code>minikube start --cpus=4 --memory=6g --addons=ingress\nkubectl cluster-info<\/code><\/pre>\n<h2>\u00c9tape 2 \u2014 D\u00e9ployer l&rsquo;awx-operator<\/h2>\n<p>Cr\u00e9ez un dossier de d\u00e9ploiement avec un fichier <code>kustomization.yaml<\/code>. V\u00e9rifiez au pr\u00e9alable, sur la page des releases GitHub d&rsquo;<code>ansible\/awx-operator<\/code>, la derni\u00e8re version stable disponible plut\u00f4t que de recopier un num\u00e9ro fig\u00e9 qui sera vite d\u00e9pass\u00e9 :<\/p>\n<pre><code>mkdir awx-deploy && cd awx-deploy\ncat > kustomization.yaml &lt;&lt;EOF\nresources:\n  - github.com\/ansible\/awx-operator\/config\/default?ref=VERSION_A_VERIFIER\nimages:\n  - name: quay.io\/ansible\/awx-operator\n    newTag: VERSION_A_VERIFIER\nnamespace: awx\nEOF\n\nkubectl apply -k .\nkubectl get pods -n awx --watch<\/code><\/pre>\n<p>Patientez jusqu&rsquo;\u00e0 ce que le pod <code>awx-operator-controller-manager<\/code> passe en statut <code>Running<\/code> avant de continuer.<\/p>\n<h2>\u00c9tape 3 \u2014 D\u00e9ployer l&rsquo;instance AWX elle-m\u00eame<\/h2>\n<p>L&rsquo;op\u00e9rateur \u00e9tant en place, il ne reste qu&rsquo;\u00e0 lui d\u00e9clarer une ressource personnalis\u00e9e <code>AWX<\/code> pour qu&rsquo;il provisionne automatiquement la base de donn\u00e9es, le service web et les pods n\u00e9cessaires :<\/p>\n<pre><code>cat > awx-demo.yml &lt;&lt;EOF\n---\napiVersion: awx.ansible.com\/v1beta1\nkind: AWX\nmetadata:\n  name: awx-demo\n  namespace: awx\nspec:\n  service_type: nodeport\nEOF\n\nkubectl apply -f awx-demo.yml\nkubectl get pods -n awx --watch<\/code><\/pre>\n<p>Le premier d\u00e9ploiement peut prendre plusieurs minutes (migration de base de donn\u00e9es incluse) \u2014 un comportement normal, pas un blocage \u00e0 corriger.<\/p>\n<h2>\u00c9tape 4 \u2014 R\u00e9cup\u00e9rer le mot de passe administrateur<\/h2>\n<pre><code>kubectl get secret awx-demo-admin-password -n awx \\\n  -o jsonpath=\"{.data.password}\" | base64 --decode ; echo<\/code><\/pre>\n<p>L&rsquo;identifiant par d\u00e9faut est <code>admin<\/code>.<\/p>\n<h2>\u00c9tape 5 \u2014 Acc\u00e9der \u00e0 l&rsquo;interface web<\/h2>\n<pre><code># Avec Minikube\nminikube service awx-demo-service --url -n awx\n\n# Ou via un port-forward classique\nkubectl port-forward service\/awx-demo-service -n awx 8080:80<\/code><\/pre>\n<p>Ouvrez l&rsquo;URL obtenue (ou <code>http:\/\/localhost:8080<\/code> avec le port-forward) et connectez-vous avec <code>admin<\/code> et le mot de passe r\u00e9cup\u00e9r\u00e9 \u00e0 l&rsquo;\u00e9tape pr\u00e9c\u00e9dente.<\/p>\n<h2>\u00c9tape 6 \u2014 Premiers pas dans l&rsquo;interface<\/h2>\n<ol>\n<li><strong>Credentials<\/strong> : cr\u00e9ez un credential de type \u00ab Machine \u00bb avec votre cl\u00e9 SSH priv\u00e9e \u2014 c&rsquo;est ce qui remplace la cl\u00e9 locale que vous utilisiez en ligne de commande, d\u00e9sormais stock\u00e9e chiffr\u00e9e c\u00f4t\u00e9 serveur.<\/li>\n<li><strong>Projects<\/strong> : d\u00e9clarez un projet pointant vers votre d\u00e9p\u00f4t Git contenant les playbooks (le m\u00eame que celui utilis\u00e9 dans le tutoriel Ansible pr\u00e9c\u00e9dent). AWX synchronise automatiquement la derni\u00e8re version \u00e0 chaque ex\u00e9cution.<\/li>\n<li><strong>Inventories<\/strong> : recr\u00e9ez votre inventaire, soit manuellement (import du fichier <code>inventory.ini<\/code>), soit via une <strong>source dynamique<\/strong> si vos machines viennent d&rsquo;un cloud ou d&rsquo;un hyperviseur d\u00e9j\u00e0 support\u00e9.<\/li>\n<li><strong>Job Templates<\/strong> : associez un playbook du projet, un inventaire et un credential dans un mod\u00e8le de job r\u00e9utilisable \u2014 c&rsquo;est l&rsquo;\u00e9quivalent web de votre commande <code>ansible-playbook<\/code>.<\/li>\n<li><strong>Lancez le job<\/strong> depuis l&rsquo;interface et suivez l&rsquo;ex\u00e9cution en direct, t\u00e2che par t\u00e2che, avec le m\u00eame niveau de d\u00e9tail que la sortie CLI d&rsquo;Ansible.<\/li>\n<\/ol>\n<h2>RBAC : organiser les acc\u00e8s en \u00e9quipe<\/h2>\n<p>AWX structure les permissions autour de trois notions :<\/p>\n<ul>\n<li><strong>Organizations<\/strong> : le regroupement de plus haut niveau (une organisation par client, par exemple, dans un contexte de prestation).<\/li>\n<li><strong>Teams<\/strong> : des groupes d&rsquo;utilisateurs au sein d&rsquo;une organisation.<\/li>\n<li><strong>R\u00f4les<\/strong> attribu\u00e9s \u00e0 un niveau pr\u00e9cis (projet, inventaire, job template\u2026) : Admin, Execute (lancer un job sans pouvoir le modifier), Read seulement, etc.<\/li>\n<\/ul>\n<p>Bonne pratique : donnez le r\u00f4le <strong>Execute<\/strong> \u00e0 la majorit\u00e9 des utilisateurs sur les job templates de production \u2014 ils peuvent lancer les automatisations valid\u00e9es, sans pouvoir modifier les playbooks ni les credentials sous-jacents.<\/p>\n<h2>Bonnes pratiques et limites \u00e0 conna\u00eetre<\/h2>\n<ul>\n<li><strong>Sauvegardez la base de donn\u00e9es<\/strong> du cluster AWX r\u00e9guli\u00e8rement \u2014 elle contient l&rsquo;historique des jobs, les credentials chiffr\u00e9s et toute la configuration ; sa perte revient \u00e0 repartir de z\u00e9ro.<\/li>\n<li><strong>Mettez \u00e0 jour l&rsquo;op\u00e9rateur<\/strong> en changeant la r\u00e9f\u00e9rence de version dans <code>kustomization.yaml<\/code> puis en r\u00e9appliquant \u2014 ne modifiez jamais les ressources Kubernetes g\u00e9n\u00e9r\u00e9es \u00e0 la main.<\/li>\n<li>AWX ajoute une couche d&rsquo;infrastructure (Kubernetes) \u00e0 maintenir en plus d&rsquo;Ansible lui-m\u00eame \u2014 pour une \u00e9quipe d&rsquo;une ou deux personnes g\u00e9rant quelques serveurs, la ligne de commande reste souvent plus simple ; AWX devient pertinent d\u00e8s que plusieurs personnes doivent partager l&rsquo;automatisation en toute s\u00e9curit\u00e9.<\/li>\n<li>Si le support commercial et les garanties de version vous importent, la version payante <strong>Ansible Automation Platform<\/strong> de Red Hat s&rsquo;appuie sur les m\u00eames concepts qu&rsquo;AWX, avec du support officiel en plus.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Si vous avez suivi le tutoriel \u00ab Ansible : installation et prise en main \u00bb, vous savez maintenant \u00e9crire et ex\u00e9cuter des playbooks en ligne de commande. Tr\u00e8s bien pour un usage personnel ou une petite \u00e9quipe technique \u2014 plus limit\u00e9 d\u00e8s qu&rsquo;il faut partager l&rsquo;automatisation avec des coll\u00e8gues moins \u00e0 l&rsquo;aise en CLI, garder [&hellip;]<\/p>\n","protected":false},"featured_media":0,"template":"","sv_tuto_categorie":[22],"class_list":["post-190","sv_tutoriel","type-sv_tutoriel","status-publish","hentry","sv_tuto_categorie-infrastructure"],"_links":{"self":[{"href":"https:\/\/asfy.fr\/index.php\/wp-json\/wp\/v2\/sv_tutoriel\/190","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/asfy.fr\/index.php\/wp-json\/wp\/v2\/sv_tutoriel"}],"about":[{"href":"https:\/\/asfy.fr\/index.php\/wp-json\/wp\/v2\/types\/sv_tutoriel"}],"version-history":[{"count":1,"href":"https:\/\/asfy.fr\/index.php\/wp-json\/wp\/v2\/sv_tutoriel\/190\/revisions"}],"predecessor-version":[{"id":192,"href":"https:\/\/asfy.fr\/index.php\/wp-json\/wp\/v2\/sv_tutoriel\/190\/revisions\/192"}],"wp:attachment":[{"href":"https:\/\/asfy.fr\/index.php\/wp-json\/wp\/v2\/media?parent=190"}],"wp:term":[{"taxonomy":"sv_tuto_categorie","embeddable":true,"href":"https:\/\/asfy.fr\/index.php\/wp-json\/wp\/v2\/sv_tuto_categorie?post=190"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}