Ansible Automation Platform : bien au-delà d’Ansible Core
Ansible Automation Platform (AAP) est la plateforme enterprise de Red Hat qui industrialise l’automatisation Ansible à grande échelle. Elle dépasse largement Ansible Core en ajoutant :
- Automation Controller (ex-AWX/Tower) — UI, scheduling, RBAC, inventaires dynamiques
- Execution Environments — containers isolés et reproductibles pour les playbooks
- Private Automation Hub — registre interne de collections et d’Execution Environments
- Event-Driven Ansible (EDA) — automatisation réactive basée sur des événements
- Automation Mesh — réseau de nœuds d’exécution distribués
Déployé sur OpenShift, AAP bénéficie de la haute disponibilité, du scaling et du cycle de vie opéré par le cluster.
Installation via l’Operator AAP
# Créer le namespace
oc new-project ansible-automation-platform
# Installer l'Operator AAP
cat <<EOF | oc apply -f -
apiVersion: operators.coreos.com/v1alpha1
kind: Subscription
metadata:
name: ansible-automation-platform-operator
namespace: ansible-automation-platform
spec:
channel: stable-2.5
installPlanApproval: Automatic
name: ansible-automation-platform-operator
source: redhat-operators
sourceNamespace: openshift-marketplace
EOF
Déployer l’Automation Controller
apiVersion: automationcontroller.ansible.com/v1beta1
kind: AutomationController
metadata:
name: aap-controller
namespace: ansible-automation-platform
spec:
replicas: 2 # HA
admin_user: admin
admin_email: admin@entreprise.com
postgres_storage_class: longhorn-fast
postgres_storage_requirements:
requests:
storage: 20Gi
projects_storage_class: longhorn-fast
projects_storage_size: 20Gi
task_privileged: false
image_pull_policy: IfNotPresent
# SSO OpenShift
sso_enabled: true
sso_provider: openshift
route_tls_termination_mechanism: Edge
ingress_type: Route
Déployer Private Automation Hub
apiVersion: automationhub.ansible.com/v1beta1
kind: AutomationHub
metadata:
name: aap-hub
namespace: ansible-automation-platform
spec:
replicas: 1
storage_type: S3
object_storage_s3_secret: hub-s3-secret
postgres_storage_class: longhorn-fast
route_tls_termination_mechanism: Edge
Execution Environments (EE)
Les Execution Environments remplacent les virtualenvs Python. Ce sont des images OCI qui embarquent Ansible Core, les collections et les dépendances Python nécessaires à chaque automation.
Construire un EE personnalisé
# execution-environment.yml
version: 3
build_arg_defaults:
EE_BASE_IMAGE: 'registry.redhat.io/ansible-automation-platform-25/ee-minimal-rhel9:latest'
dependencies:
galaxy:
collections:
- name: redhat.openshift
version: ">=2.3.0"
- name: kubernetes.core
version: ">=2.4.0"
- name: community.general
version: ">=9.0.0"
python:
- openshift>=0.13.2
- kubernetes>=28.1.0
- boto3>=1.35.0
system:
- git [platform:rpm]
additional_build_steps:
prepend_final:
- RUN pip install --upgrade pip
append_final:
- RUN ansible-galaxy collection install redhat.openshift
# Construire l'EE avec ansible-builder
pip install ansible-builder
ansible-builder build \
--file execution-environment.yml \
--tag registry.entreprise.com/aap/ee-openshift:1.0.0 \
--container-runtime podman
# Pousser vers Private Automation Hub
podman push registry.entreprise.com/aap/ee-openshift:1.0.0
Inventaires dynamiques OpenShift
AAP peut découvrir automatiquement les clusters OpenShift comme inventaire.
# Credential pour OpenShift
# Dans l'UI : Credentials > Add > OpenShift or Kubernetes API Bearer Token
# Job Template avec inventaire dynamique
# Source d'inventaire : "OpenShift Virtualization" ou "Kubernetes"
# Variables d'inventaire :
connections:
- hostname: https://api.cluster-prod.entreprise.com:6443
verify_ssl: true
bearer_token: "{{ lookup('env', 'OCP_TOKEN') }}"
namespaces:
- production
- staging
Playbook Day-2 : rolling upgrade des nœuds OpenShift
---
- name: Rolling upgrade of OpenShift worker nodes
hosts: workers
serial: 1 # Un nœud à la fois
gather_facts: false
tasks:
- name: Cordon the node
kubernetes.core.k8s_drain:
state: cordon
name: "{{ inventory_hostname }}"
kubeconfig: /etc/kubernetes/admin.kubeconfig
- name: Drain the node
kubernetes.core.k8s_drain:
state: drain
name: "{{ inventory_hostname }}"
delete_emptydir_data: true
ignore_daemonsets: true
kubeconfig: /etc/kubernetes/admin.kubeconfig
wait_sleep: 10
wait_timeout: 300
- name: Apply OS updates
ansible.builtin.shell: |
rpm-ostree upgrade
become: true
- name: Reboot the node
ansible.builtin.reboot:
reboot_timeout: 600
- name: Wait for node to be Ready
kubernetes.core.k8s_info:
api_version: v1
kind: Node
name: "{{ inventory_hostname }}"
kubeconfig: /etc/kubernetes/admin.kubeconfig
register: node_info
until: >
node_info.resources[0].status.conditions
| selectattr('type', 'equalto', 'Ready')
| selectattr('status', 'equalto', 'True')
| list | length > 0
retries: 30
delay: 20
- name: Uncordon the node
kubernetes.core.k8s_drain:
state: uncordon
name: "{{ inventory_hostname }}"
kubeconfig: /etc/kubernetes/admin.kubeconfig
Event-Driven Ansible (EDA)
Event-Driven Ansible permet de déclencher des playbooks automatiquement en réponse à des événements : alertes Prometheus, webhooks, messages Kafka, etc.
Installer l’EDA Controller
apiVersion: eda.ansible.com/v1alpha1
kind: EDA
metadata:
name: eda-controller
namespace: ansible-automation-platform
spec:
automation_server_url: https://aap-controller-ansible-automation-platform.apps.cluster.com
automation_server_ssl_verify: "yes"
Rulebook : répondre à une alerte Prometheus
# rulebook-prometheus.yml
---
- name: Respond to Prometheus alerts
hosts: all
sources:
- ansible.eda.alertmanager:
host: 0.0.0.0
port: 5000
rules:
- name: Node disk pressure — cleanup
condition: event.alert.labels.alertname == "NodeDiskPressure"
action:
run_job_template:
name: cleanup-disk-space
organization: Default
job_args:
extra_vars:
target_node: "{{ event.alert.labels.instance }}"
- name: Pod CrashLoopBackOff — restart deployment
condition: >
event.alert.labels.alertname == "KubePodCrashLooping" and
event.alert.status == "firing"
action:
run_job_template:
name: restart-deployment
organization: Default
job_args:
extra_vars:
namespace: "{{ event.alert.labels.namespace }}"
deployment: "{{ event.alert.labels.deployment }}"
Intégration CI/CD
Déclencher un Job Template AAP depuis GitLab CI ou GitHub Actions :
# .gitlab-ci.yml
deploy-production:
stage: deploy
image: curlimages/curl:latest
script:
- |
curl -sk -X POST \
-H "Authorization: Bearer $AAP_TOKEN" \
-H "Content-Type: application/json" \
-d '{"extra_vars": {"version": "'"$CI_COMMIT_TAG"'", "environment": "production"}}' \
"https://aap-controller.apps.cluster.com/api/v2/job_templates/42/launch/"
only:
- tags
RBAC et organisations
AAP supporte un RBAC à plusieurs niveaux : Organisations → Teams → Users avec des rôles granulaires (Admin, Execute, Use, Audit).
# Créer une organisation via la CLI awx
pip install awxkit
awx organizations create \
--name "Équipe Platform" \
--description "Équipe responsable des clusters OpenShift"
# Créer un team
awx teams create \
--name "DevOps" \
--organization "Équipe Platform"
# Assigner un rôle à un team sur un Job Template
awx role grant \
--type execute \
--team "DevOps" \
--job-template "deploy-application"
Conclusion
Ansible Automation Platform sur OpenShift est la solution idéale pour les opérations Day-2 à grande échelle : mises à jour de clusters, gestion de la configuration, patching de nœuds, réponse aux incidents. L’Event-Driven Ansible ajoute une dimension réactive qui permet de construire des systèmes auto-réparateurs. Déployé sur OpenShift, AAP bénéficie de la haute disponibilité et du cycle de vie opéré du cluster, réduisant la charge opérationnelle de la plateforme d’automatisation elle-même.