Ansible automation hub에 Minio를 사용하는 방법

Red Hat Blog를 보다가 관심 가는 글이 보여서 AI번역+약간 교정해 보았습니다.
출처: https://developers.redhat.com/articles/2025/08/11/how-use-minio-ansible-automation-hub

이 문서에서는 Red Hat Ansible Automation Platform을 배포할 때 고성능 셀프 호스팅 객체 스토리지 솔루션인 MinIO를  Ansible automation hub의 백엔드로 구성하고 사용하는 방법을 살펴봅니다 . 이 접근 방식을 사용하면 AWS S3 또는 Azure Blob과 같은 클라우드 네이티브 객체 스토리지 서비스가 필요하지 않으므로, Air-Gapped 환경, 온프레미스 환경 또는 비용에 민감한 환경에 이상적입니다. Minio를 설정하고, AAP와 통합하고, 사용자 지정 콘텐츠 컬렉션을 호스팅하기 위한 완벽하게 호환되는 S3 유사 스토리지 백엔드로서의 기능을 검증하는 방법을 알아봅니다.

조직에서 전사적 자동화를 위해 Ansible Automation Platform을 도입하는 사례가 증가함에 따라 , 특히 인증된 콘텐츠 또는 사용자 지정 콘텐츠 컬렉션을 호스팅하기 위해 프라이빗 자동화 허브를 구축할 때 유연하고 비용 효율적인 스토리지 솔루션의 필요성이 더욱 중요해지고 있습니다. Amazon Web Services(AWS) 및 Azure와 같은 클라우드 제공업체는 S3 호환 스토리지(S3, Blob)를 제공하지만, 이러한 옵션은 에어갭 환경, 온프레미스 환경 또는 규제된 환경에서는 적합하지 않을 수 있습니다.

이 문제를 해결하기 위해 Red Hat OpenShift 환경 에 배포 가능한 고성능 S3 호환 객체 스토리지 시스템인 Minio를 사용할 수 있습니다 . 이를 통해 완전히 독립적이고 클라우드에 독립적인 Ansible Automation Platform 배포가 가능합니다. 

이 기사는 두 부분으로 나뉩니다. 

1부: OpenShift 클러스터에 Minio 설정하기

2부: Minio를 사용하여 Ansible Automation Platform을 배포하는 방법

필수 조건

시작하기 전에 다음 사항을 확인하세요.

  • Red Hat OpenShift Container Platform 에 대한 액세스 (버전 4.12 이상 권장, 4.16에서 테스트).
  • 워크로드를 배포하고 스토리지를 구성하기 위한 클러스터 관리자 또는 이와 동등한 권한.
  • 이미지를 가져오기 위한 레지스트리 연결.

메모: 인증서에는 letsencrypt를 사용하고 있습니다. 현재 자체 서명 인증서나 -tls-verify=false 옵션을 사용해서는 작동하지 않습니다. 자동화 허브 API 포드에서 “urllib3.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1006).”라는 메시지가 표시됩니다. 이미지를 푸시하는 동안 500 내부 오류가 발생할 수 있습니다.

1부: OpenShift에 Minio 배포

OpenShift에 Minio를 배포하려면 다음 단계를 따르세요(또는 Minio 가이드 를 참조하세요 ).

  1. OpenShift Container Platform에서 프로젝트를 생성하세요. OpenShift에서 “aap”라는 프로젝트를 생성했는데, 여기에 Minio Pod를 배포할 예정입니다.
  2. 그림 1에 표시된 대로 프로젝트의 Workloads -> Pods 로 이동한 다음 ( + )를 클릭하여 YAML을 가져옵니다.
사용자가 워크로드 -> Pod로 이동한 다음 더하기 기호를 클릭하여 YAML을 가져오는 모습을 보여주는 OpenShift Container Platform의 모습입니다.
그림 1: Pod로 이동하여 더하기 기호를 클릭하여 YAML을 가져옵니다.
  1. 다음 YAML을 편집기에 붙여넣습니다.
---
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

4. 기본 사용자 이름/비밀번호 및 크기를 변경합니다(YAML의 21, 22, 11번째 줄).

5. Create  클릭합니다 (그림 2).

    YAML을 가져옵니다.
    그림 2: 편집기에 YAML을 입력한 후, 생성 버튼을 클릭하여 YAML을 가져옵니다.

    이제 PVC, secret, service, api(route), ui(route)와 같은 Minio 리소스를 생성했습니다.

    6. 그림 3과 같이 포드 상태를 확인하세요.

      미니오 배포 후 Pod 목록
      그림 3: Minio 배포 후의 포드 목록입니다.

      그림 4에 표시된 대로 Minio 경로를 확인하세요.

      미니오 루트
      그림 4: 미니오 경로는 다음과 같습니다.

      -api 경로는 프로그래밍 방식 액세스를 위한 것이고 -ui 경로는 UI를 위한 것입니다(그림 5).

      Minio UI 액세스
      그림 5: Minio UI 접근.
      1. Create Bucket 클릭 하고 이름을 입력하여 버킷을 만듭니다(그림 6).
      미니오 AAP 버킷
      그림 6: Minio Ansible Automation Platform 버킷을 만듭니다.

      이것을 자동화 허브 스토리지로 사용할 수 있습니다.

      2부: Ansible 자동화 플랫폼 배포

      이제 Minio 버킷을 사용하여 Ansible Automation Platform 오퍼레이터 배포해 보겠습니다 . 자세히 알아보세요 .

      다음 단계를 따르세요.

      1. OpenShift Container Platform UI에서 왼쪽 패널의 OperatorHub 로 이동합니다.
      2. 검색창에 “Ansible Automation Platform”을 입력하세요. 그런 다음 기본 옵션으로 선택하여 설치합니다. 저는 Ansible Automation Platform 2.5를 설치합니다.
      3. 운영자를 설치한 후 Minio 버킷에 액세스하기 위한 시크릿을 만듭니다.
      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. 액세스 키, 시크릿, 버킷 이름, 엔드포인트 값을 실제 값으로 변경하세요. s3-endpoint는 UI가 아닌 -api 경로여야 합니다. 자세한 내용은 여기에서 확인할 수 있습니다 .

      5. 이제 Ansible Automation Platform 인스턴스를 배포할 차례입니다. 이 목적으로 다음 샘플 YAML을 사용합니다. 비밀 이름을 변경해야 합니다.

        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

        배포하는 데 5~10분이 소요됩니다. YAML에 대해 자세히 알아보세요 . 

        6. 배포가 완료되면 Ansible Automation Platform Gateway에 로그인하여 구독을 적용합니다.

        7. Automation Content 섹션 으로 이동합니다 (그림 6).

          액세스 자동화 허브
          그림 6: 자동화 콘텐츠 섹션이 강조 표시되어 있습니다.

          8. 이미지를 푸시하여 자동화 허브를 테스트하세요. 자동화 허브에 로그인하고 이미지에 태그를 지정한 다음 이미지를 푸시하세요.

          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
          .
          .

          9. 개인 자동화 허브에서 이미지를 확인하세요.이제 이미지를 사용하여 실행 환경(Ansible Automation Platform의 자동화 실행 섹션)을 생성하겠습니다.

          10. Automation Execution -> Infrastructure -> Credentials 으로 이동하여 개인 자동화 허브에 대한 자격 증명을 만듭니다 .

          11. 실행 환경을 생성합니다(그림 7).

            자동화 컨트롤러에서 실행 환경 생성
            그림 7: 실행 환경 생성

            12. 마지막으로, 실행 환경을 사용하여 작업 템플릿을 실행합니다. 처음에는 실행 환경을 가져오는 데 몇 분 정도 걸립니다.

              마무리

              이 문서에서는 Red Hat OpenShift 환경 에 Minio 개체 스토리지 시스템을 배포하여 완전히 자체 포함되고 클라우드에 독립적인 Ansible Automation Platform 배포를 구현하는 방법을 설명했습니다. 

              답글 남기기

              이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

              You May Also Like
              Read More

              AWX FAQ

              출처: https://www.ansible.com/awx-project-faqGoogle Translate로 번역하고 살짝 교정했습니다. 코어(Core) Ansible Core와 AWX의 차이점은 무엇인가요? Ansible Core는 커뮤니티 저장소나 Ansible의 공식…
              Read More

              기존 Ansible 인스턴스 구성 자동화

              Red Hat Blog를 보다가 관심 가는 글이 보여서 AI번역+약간 교정해 보았습니다.출처: https://developers.redhat.com/articles/2025/07/30/automating-configuration-existing-ansible-instance 메모: 이 문서에서는 Ansible 커뮤니티에서 개발,…