Blog

Ansible Automation Platform sur OpenShift : automatisation enterprise à grande échelle

OpenShift
Ansible
Automation
CI/CD
Day-2 Operations

Déploiement et exploitation d'Ansible Automation Platform (AAP) sur OpenShift. Installation via l'Operator, configuration d'Automation Controller, Execution Environments, Event-Driven Ansible et intégration CI/CD pour les opérations Day-2.

1 mars 2025

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.