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 클러스터와 통신합니다.
절차
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
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
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
Operator에서 이벤트의 리소스
Test1
을 모니터링하므로 CR을 생성하면 실행할 Ansible 역할이 트리거됩니다.deploy/cr.yaml
파일을 확인합니다.apiVersion: "test1.example.com/v1alpha1" kind: "Test1" metadata: name: "example"
spec
필드가 설정되지 않았기 때문에 추가 변수 없이 Ansible이 호출됩니다. 다음 섹션에서는 CR에서 Ansible로 추가 변수를 전달하는 방법을 설명합니다. 따라서 Operator에 적절한 기본값을 설정하는 것이 중요합니다.기본 변수
state
를present
로 설정하여Test1
의 CR 인스턴스를 생성합니다.$ oc create -f deploy/cr.yaml
네임스페이스
테스트가
생성되었는지 확인합니다.$ oc get namespace
출력 예
NAME STATUS AGE default Active 28d kube-public Active 28d kube-system Active 28d test Active 3s
deploy/cr.yaml
파일을 수정하여state
필드를absent
로 설정합니다.apiVersion: "test1.example.com/v1alpha1" kind: "Test1" metadata: name: "example" spec: state: "absent"
변경 사항을 적용하고 네임스페이스가 삭제되었는지 확인합니다.
$ oc apply -f deploy/cr.yaml
$ oc get namespace
출력 예
NAME STATUS AGE default Active 28d kube-public Active 28d kube-system Active 28d