5.4.3.3. Operator 内での k8s Ansible モジュールのテスト
k8s Ansible モジュールをローカルで使用することに慣れたら、カスタムリソース (CR) の変更時に Operator 内で同じ 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 ファイルを使用して k8s Ansible モジュールが実行するように Kubernetes クラスターと通信します。
手順
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カスタムリソース定義 (CRD) およびカスタムリソース (CR)
Test1の適切なロールベースアクセス制御 (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.yamlrun --localコマンドを実行します。$ operator-sdk run --local出力例
[...] INFO[0000] Starting to serve on 127.0.0.1:8888 INFO[0000] Watching test1.example.com/v1alpha1, Test1, defaultOperator はリソース
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.yamlnamespace
testが作成されていることを確認します。$ oc get namespace出力例
NAME STATUS AGE default Active 28d kube-public Active 28d kube-system Active 28d test Active 3sdeploy/cr.yamlファイルを、stateフィールドをabsentに設定するように変更します。apiVersion: "test1.example.com/v1alpha1" kind: "Test1" metadata: name: "example" spec: state: "absent"変更を適用し、namespace が定義されていることを確認します。
$ oc apply -f deploy/cr.yaml$ oc get namespace出力例
NAME STATUS AGE default Active 28d kube-public Active 28d kube-system Active 28d