5.4.3.3. Operator 내에서 k8s Ansible 모듈 테스트

로컬에서 k8s Ansible 모듈을 사용하는 방법을 익히면 CR(사용자 정의 리소스)이 변경될 때 Operator 내부에서 동일한 Ansible 논리를 트리거할 수 있습니다. 이 예제에서는 Operator에서 조사하는 특정 Kubernetes 리소스에 Ansible 역할을 매핑합니다. 이 매핑은 watches.yaml 파일에서 수행됩니다.

5.4.3.3.1. Ansible 기반 Operator를 로컬에서 테스트

Ansible 워크플로를 로컬에서 테스트한 후 로컬에서 실행되는 Ansible 기반 Operator 내부의 논리를 테스트할 수 있습니다.

이를 위해 Operator 프로젝트의 최상위 디렉터리에서 operator-sdk run --local 명령을 사용합니다. 이 명령은 watches.yaml 파일에서 읽고 ~/.kube/config 파일을 사용하여 k8s Ansible 모듈처럼 Kubernetes 클러스터와 통신합니다.

절차

  1. run --local 명령은 watches.yaml 파일에서 읽기 때문에 Operator 작성자가 사용할 수 있는 옵션이 있습니다. 역할이 단독으로 남아 있는 경우(기본적으로 /opt/ansible/roles/<name>) Operator의 /opt/ansible/roles/ 디렉터리에 역할을 복사해야 합니다.

    이는 변경 사항이 현재 디렉터리에서 반영되지 않기 때문에 번거로울 수 있습니다. 대신 현재 디렉터리를 가리키도록 역할 필드를 변경하고 기존 행을 주석 처리합니다.

    - version: v1alpha1
      group: test1.example.com
      kind: Test1
      #  role: /opt/ansible/roles/Test1
      role: /home/user/test1-operator/Test1
  2. CR(사용자 정의 리소스) Test1 에 대한 CRD(사용자 정의 리소스 정의) 및 적절한 RBAC(역할 기반 액세스 제어) 정의를 생성합니다. operator-sdk 명령은 deploy/ 디렉토리 내에서 이러한 파일을 자동으로 생성합니다.

    $ oc create -f deploy/crds/test1_v1alpha1_test1_crd.yaml
    $ oc create -f deploy/service_account.yaml
    $ oc create -f deploy/role.yaml
    $ oc create -f deploy/role_binding.yaml
  3. run --local 명령을 실행합니다.

    $ operator-sdk run --local

    출력 예

    [...]
    INFO[0000] Starting to serve on 127.0.0.1:8888
    INFO[0000] Watching test1.example.com/v1alpha1, Test1, default

  4. Operator에서 이벤트의 리소스 Test1 을 모니터링하므로 CR을 생성하면 실행할 Ansible 역할이 트리거됩니다. deploy/cr.yaml 파일을 확인합니다.

    apiVersion: "test1.example.com/v1alpha1"
    kind: "Test1"
    metadata:
      name: "example"

    spec 필드가 설정되지 않았기 때문에 추가 변수 없이 Ansible이 호출됩니다. 다음 섹션에서는 CR에서 Ansible로 추가 변수를 전달하는 방법을 설명합니다. 따라서 Operator에 적절한 기본값을 설정하는 것이 중요합니다.

  5. 기본 변수 statepresent 로 설정하여 Test1 의 CR 인스턴스를 생성합니다.

    $ oc create -f deploy/cr.yaml
  6. 네임스페이스 테스트가 생성되었는지 확인합니다.

    $ oc get namespace

    출력 예

    NAME          STATUS    AGE
    default       Active    28d
    kube-public   Active    28d
    kube-system   Active    28d
    test          Active    3s

  7. deploy/cr.yaml 파일을 수정하여 state 필드를 absent 로 설정합니다.

    apiVersion: "test1.example.com/v1alpha1"
    kind: "Test1"
    metadata:
      name: "example"
    spec:
      state: "absent"
  8. 변경 사항을 적용하고 네임스페이스가 삭제되었는지 확인합니다.

    $ oc apply -f deploy/cr.yaml
    $ oc get namespace

    출력 예

    NAME          STATUS    AGE
    default       Active    28d
    kube-public   Active    28d
    kube-system   Active    28d