Skip to main content
Redhat Developers  Logo
  • Products

    Platforms

    • Red Hat Enterprise Linux
      Red Hat Enterprise Linux Icon
    • Red Hat AI
      Red Hat AI
    • Red Hat OpenShift
      Openshift icon
    • Red Hat Ansible Automation Platform
      Ansible icon
    • View All Red Hat Products

    Featured

    • Red Hat build of OpenJDK
    • Red Hat Developer Hub
    • Red Hat JBoss Enterprise Application Platform
    • Red Hat OpenShift Dev Spaces
    • Red Hat OpenShift Local
    • Red Hat Developer Sandbox

      Try Red Hat products and technologies without setup or configuration fees for 30 days with this shared Openshift and Kubernetes cluster.
    • Try at no cost
  • Technologies

    Featured

    • AI/ML
      AI/ML Icon
    • Linux
      Linux Icon
    • Kubernetes
      Cloud icon
    • Automation
      Automation Icon showing arrows moving in a circle around a gear
    • View All Technologies
    • Programming Languages & Frameworks

      • Java
      • Python
      • JavaScript
    • System Design & Architecture

      • Red Hat architecture and design patterns
      • Microservices
      • Event-Driven Architecture
      • Databases
    • Developer Productivity

      • Developer productivity
      • Developer Tools
      • GitOps
    • Automated Data Processing

      • AI/ML
      • Data Science
      • Apache Kafka on Kubernetes
    • Platform Engineering

      • DevOps
      • DevSecOps
      • Ansible automation for applications and services
    • Secure Development & Architectures

      • Security
      • Secure coding
  • Learn

    Featured

    • Kubernetes & Cloud Native
      Openshift icon
    • Linux
      Rhel icon
    • Automation
      Ansible cloud icon
    • AI/ML
      AI/ML Icon
    • View All Learning Resources

    E-Books

    • GitOps Cookbook
    • Podman in Action
    • Kubernetes Operators
    • The Path to GitOps
    • View All E-books

    Cheat Sheets

    • Linux Commands
    • Bash Commands
    • Git
    • systemd Commands
    • View All Cheat Sheets

    Documentation

    • Product Documentation
    • API Catalog
    • Legacy Documentation
  • Developer Sandbox

    Developer Sandbox

    • Access Red Hat’s products and technologies without setup or configuration, and start developing quicker than ever before with our new, no-cost sandbox environments.
    • Explore Developer Sandbox

    Featured Developer Sandbox activities

    • Get started with your Developer Sandbox
    • OpenShift virtualization and application modernization using the Developer Sandbox
    • Explore all Developer Sandbox activities

    Ready to start developing apps?

    • Try at no cost
  • Blog
  • Events
  • Videos

How to use Minio for Ansible automation hub

August 11, 2025
Kamlendu Shekhar
Related topics:
Automation and management
Related products:
Red Hat Ansible Automation Platform

Share:

    This article explores how to configure and use MinIO—a high-performance, self-hosted object storage solution—as a backend for Ansible automation hub when deploying Red Hat Ansible Automation Platform. This approach eliminates the need for cloud-native object storage services like AWS S3 or Azure Blob, making it ideal for air-gapped, on-prem, or cost-sensitive environments. You'll learn how to set up Minio, integrate it with AAP, and validate its functionality as a fully compatible S3-like storage backend for hosting custom content collections.

    As organizations increasingly adopt Ansible Automation Platform for enterprise-wide automation, the need for flexible and cost-effective storage solutions becomes critical, especially when deploying a private automation hub to host certified or custom content collections. While cloud providers like Amazon Web Services (AWS) and Azure offer S3-compatible storage (S3, Blob), these options may not be feasible in air-gapped, on-premise, or regulated environments.

    To address this, we can use Minio, a high-performance, S3-compatible object storage system that can be deployed on a Red Hat OpenShift environment. This enables a fully self-contained, cloud-independent Ansible Automation Platform deployment. 

    This article is divided into two parts: 

    Part 1: Set up Minio on an OpenShift cluster.

    Part 2: How to use Minio to deploy Ansible Automation Platform.

    Prerequisites

    Before we begin, ensure that you have:

    • Access to Red Hat OpenShift Container Platform (version 4.12 or higher recommended; I have tested it in 4.16).
    • Cluster-admin or equivalent privileges to deploy workloads and configure storage.
    • Registry connectivity for pulling images.

    Note:

    I am using letsencrypt for the certificates.

    As of now, I couldn't make it work with a self-signed certificate or with -tls-verify=false. The automation hub API pod gives "urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1006)." You may see a 500 internal error while pushing the images.

    Part 1: Deploy Minio on OpenShift

    Follow these steps to deploy Minio on OpenShift (or refer to the Minio guide):

    1. Create a project in OpenShift Container Platform. I created a project called "aap" in OpenShift, where I am going to deploy my Minio pod.
    2. Navigate to Workloads -> Pods for the project and then click the plus sign (+) to import YAML, as shown in Figure 1.
    A view of OpenShift Container Platform showing the user navigating to Workloads -> Pods then clicking the plus sign to import YAML.
    Figure 1: Navigating to Pods to click the plus sign to import YAML.
    1. Paste the following YAML into the editor:

      ---
      kind: PersistentVolumeClaim
      apiVersion: v1
      metadata:
        name: minio-pvc
      spec:
        accessModes:
          - ReadWriteOnce
        resources:
          requests:
            storage: 20Gi
        volumeMode: Filesystem
      ---
      kind: Secret
      apiVersion: v1
      metadata:
        name: minio-secret
      stringData:
        # change the username and password to your own values.
        # ensure that the user is at least 3 characters long and the password at least 8
        minio_root_user: minio
        minio_root_password: minio123
      ---
      kind: Deployment
      apiVersion: apps/v1
      metadata:
        name: minio
      spec:
        replicas: 1
        selector:
          matchLabels:
            app: minio
        template:
          metadata:
            creationTimestamp: null
            labels:
              app: minio
          spec:
            volumes:
              - name: data
                persistentVolumeClaim:
                  claimName: minio-pvc
            containers:
              - resources:
                  limits:
                    cpu: 250m
                    memory: 1Gi
                  requests:
                    cpu: 20m
                    memory: 100Mi
                readinessProbe:
                  tcpSocket:
                    port: 9000
                  initialDelaySeconds: 5
                  timeoutSeconds: 1
                  periodSeconds: 5
                  successThreshold: 1
                  failureThreshold: 3
                terminationMessagePath: /dev/termination-log
                name: minio
                livenessProbe:
                  tcpSocket:
                    port: 9000
                  initialDelaySeconds: 30
                  timeoutSeconds: 1
                  periodSeconds: 5
                  successThreshold: 1
                  failureThreshold: 3
                env:
                  - name: MINIO_ROOT_USER
                    valueFrom:
                      secretKeyRef:
                        name: minio-secret
                        key: minio_root_user
                  - name: MINIO_ROOT_PASSWORD
                    valueFrom:
                      secretKeyRef:
                        name: minio-secret
                        key: minio_root_password
                ports:
                  - containerPort: 9000
                    protocol: TCP
                  - containerPort: 9090
                    protocol: TCP
                imagePullPolicy: IfNotPresent
                volumeMounts:
                  - name: data
                    mountPath: /data
                    subPath: minio
                terminationMessagePolicy: File
                image: >-
                  quay.io/minio/minio:latest
                args:
                  - server
                  - /data
                  - --console-address
                  - :9090
            restartPolicy: Always
            terminationGracePeriodSeconds: 30
            dnsPolicy: ClusterFirst
            securityContext: {}
            schedulerName: default-scheduler
        strategy:
          type: Recreate
        revisionHistoryLimit: 10
        progressDeadlineSeconds: 600
      ---
      kind: Service
      apiVersion: v1
      metadata:
        name: minio-service
      spec:
        ipFamilies:
          - IPv4
        ports:
          - name: api
            protocol: TCP
            port: 9000
            targetPort: 9000
          - name: ui
            protocol: TCP
            port: 9090
            targetPort: 9090
        internalTrafficPolicy: Cluster
        type: ClusterIP
        ipFamilyPolicy: SingleStack
        sessionAffinity: None
        selector:
          app: minio
      ---
      kind: Route
      apiVersion: route.openshift.io/v1
      metadata:
        name: minio-api
      spec:
        to:
          kind: Service
          name: minio-service
          weight: 100
        port:
          targetPort: api
        wildcardPolicy: None
        tls:
          termination: edge
          insecureEdgeTerminationPolicy: Redirect
      ---
      kind: Route
      apiVersion: route.openshift.io/v1
      metadata:
        name: minio-ui
      spec:
        to:
          kind: Service
          name: minio-service
          weight: 100
        port:
          targetPort: ui
        wildcardPolicy: None
        tls:
          termination: edge
          insecureEdgeTerminationPolicy: Redirect
    2. Change default username/password and size (lines 21, 22, and 11 in the YAML).
    3. Click Create (Figure 2).
    Import YAML.
    Figure 2: When you have entered the YAML into the editor, click the create button to import YAML.

    Now you have created Minio resources like PVC, secret, service, api(route), and ui(route).

    1. Check the pod status, as shown in Figure 3.
    Pod list after minio deployment
    Figure 3: This is the pod list after the Minio deployment.

    Check the Minio routes, as shown in Figure 4.

    Minio Routes
    Figure 4: The Minio routes are shown here.

    Note that -api route is for programmatic access and -ui route is for the UI (Figure 5).

    Minio UI Access
    Figure 5: Minio UI access.
    1. Click Create Bucket and enter a name to create a bucket (Figure 6).
    Minio AAP Bucket
    Figure 6: Create Minio Ansible Automation Platform bucket.

    We can use this for our automation hub storage.

    Part 2: Deploy Ansible Automation Platform

    We will now deploy the Ansible Automation Platform operator using the Minio bucket. Learn more...

    Follow these steps:

    1. In the OpenShift Container Platform UI, navigate to OperatorHub in the left panel.
    2. Enter "Ansible Automation Platform" in the search bar. Then select and install it with the default options. I am installing Ansible Automation Platform 2.5.
    3. Once you have installed the operator, create a secret to access the Minio bucket:

      oc -n $HUB_NAMESPACE apply -f- <<EOF
      apiVersion: v1
      kind: Secret
      metadata:
        name: 'my-private-hub-s3'
      stringData:
        s3-access-key-id: minio
        s3-secret-access-key: minio123
        s3-bucket-name: my-bucket-private-automation-hub
        s3-endpoint: https://minio-api-aap.apps.cluster-hh65q.hh65q.sandbox502.opentlc.com/
      EOF
    4. Change the value of access-key, secret, bucket name, and endpoint with your actual values. The s3-endpoint should be the -api route, not the UI. You can find more details here.
    5. Now it's time to deploy the Ansible Automation Platform instance. I am using the following sample YAML for this purpose. Be sure to change the name of the secret.

      oc apply -f - <<EOF
      apiVersion: aap.ansible.com/v1alpha1
      kind: AnsibleAutomationPlatform
      metadata:
        name: my-aap
        namespace: aap
      spec:
        # Platform
        image_pull_policy: IfNotPresent
        # Components
        controller:
          disabled: false
        eda:
          disabled: false
        hub:
          disabled: false
          storage_type: S3
          object_storage_s3_secret: my-private-hub-s3
        lightspeed:
          disabled: true
      EOF

      It will take 5 to 10 minutes to deploy. Learn more about the YAML. 

    6. Once deployment is complete, log in to the Ansible Automation Platform Gateway and apply the subscription.
    7. Navigate to the Automation Content section (Figure 6).
    access automation hub
    Figure 6: The Automation Content section is highlighted.
    1. Test the automation hub by pushing an image. Log in to the automation hub, tag an image, then push the image.

      kashekha@kashekha-thinkpadp1gen7:~$ podman login https://my-aap-aap.apps.cluster-hh65q.hh65q.sandbox502.opentlc.com
      Username: admin
      Password: 
      Login Succeeded!
      kashekha@kashekha-thinkpadp1gen7:~$ podman tag localhost/ee-supported-rhel9_caac_infra my-aap-aap.apps.cluster-hh65q.hh65q.sandbox502.opentlc.com/ee-supported-rhel9_caac_infra:latest
      kashekha@kashekha-thinkpadp1gen7:~$ podman images |grep "my-aap-aap"
      my-aap-aap.apps.cluster-hh65q.hh65q.sandbox502.opentlc.com/ee-supported-rhel9_caac_infra  latest      9d6efab8d315  4 weeks ago   1.53 GB
      kashekha@kashekha-thinkpadp1gen7:~$ podman push my-aap-aap.apps.cluster-hh65q.hh65q.sandbox502.opentlc.com/ee-supported-rhel9_caac_infra:latest
      Getting image source signatures
      .
      .
    2. Verify the image in the private automation hub.

      Now we'll use the image to create an execution environment (Automation Execution Section of Ansible Automation Platform).

    3. Create credentials for the private automation hub by navigating to Automation Execution -> Infrastructure -> Credentials.
    4. Create the execution environment (Figure 7).
    create execution env on automation controller
    Figure 7: Create the execution environment.
    1. Finally, run a job template with the execution environment. It will take a few minutes to pull the execution environment at first.

    Wrap up

    In this article, we explained how you can deploy the Minio object storage system on a Red Hat OpenShift environment to enable a fully self-contained, cloud-independent Ansible Automation Platform deployment. 

    Related Posts

    • How to deploy applications using Ansible Automation Platform

    • How Ansible Automation task scheduling improves productivity

    • How to manage Python dependencies in Ansible execution environments

    • A guide to configure execution environments as code

    • How to create execution environments using ansible-builder

    Recent Posts

    • How to enable Ansible Lightspeed intelligent assistant

    • Why some agentic AI developers are moving code from Python to Rust

    • Confidential VMs: The core of confidential containers

    • Benchmarking with GuideLLM in air-gapped OpenShift clusters

    • Run Qwen3-Next on vLLM with Red Hat AI: A step-by-step guide

    What’s up next?

    Learn the basics of YAML, a simple yet powerful data serialization language, through examples using Ansible.

    Start the activity
    Red Hat Developers logo LinkedIn YouTube Twitter Facebook

    Products

    • Red Hat Enterprise Linux
    • Red Hat OpenShift
    • Red Hat Ansible Automation Platform

    Build

    • Developer Sandbox
    • Developer Tools
    • Interactive Tutorials
    • API Catalog

    Quicklinks

    • Learning Resources
    • E-books
    • Cheat Sheets
    • Blog
    • Events
    • Newsletter

    Communicate

    • About us
    • Contact sales
    • Find a partner
    • Report a website issue
    • Site Status Dashboard
    • Report a security problem

    RED HAT DEVELOPER

    Build here. Go anywhere.

    We serve the builders. The problem solvers who create careers with code.

    Join us if you’re a developer, software engineer, web designer, front-end designer, UX designer, computer scientist, architect, tester, product manager, project manager or team lead.

    Sign me up

    Red Hat legal and privacy links

    • About Red Hat
    • Jobs
    • Events
    • Locations
    • Contact Red Hat
    • Red Hat Blog
    • Inclusion at Red Hat
    • Cool Stuff Store
    • Red Hat Summit
    © 2025 Red Hat

    Red Hat legal and privacy links

    • Privacy statement
    • Terms of use
    • All policies and guidelines
    • Digital accessibility

    Report a website issue