5.4.3.3. 在 Operator 内测试 k8s Ansible 模块
熟悉在本地使用 k8s
Ansible 模块后,您可在 Operator 内触发自定义资源 (CR) 发生变化时的相同 Ansible 逻辑。本示例将 Ansible 角色映射到 Operator 所监视的特定 Kubernetes 资源。该映射在 watches.yaml
文件中完成。
5.4.3.3.1. 本地测试基于 Ansible 的 Operator
熟悉在本地测试 Ansible 工作流后,您可以在本地运行的基于 Ansible 的 Operator 内测试逻辑。
为此,请使用 Operator 项目顶层目录中的 operator-sdk run --local
命令。此命令读取 watches.yaml
文件,并使用 ~/.kube/config
文件与 Kubernetes 集群通信,就如同 k8s
Ansible 模块一样。
流程
因为
run --local
命令是从watches.yaml
文件中读取的,所以有一些选项可供 Operator 作者使用。如果role
独立存在(默认为/opt/ansible/roles/<name>
),则必须直接从 Operator 中复制该角色至/opt/ansible/roles/
目录。这很麻烦,因为更改不会反映在当前目录中。相反,可更改
role
字段以指向当前目录并注释掉现有行:- 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 设置合理的默认值的原因。创建
Test1
的 CR 实例,并将默认变量state
设置为present
:$ oc create -f deploy/cr.yaml
检查是否已创建命名空间
test
:$ 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