Ansible Operator
Ansible Operator - Memcached
Let’s create a new directory for our project:
mkdir -p $HOME/tutorial/memcached-operator
Navigate to the directory:
cd $HOME/tutorial/memcached-operator
Initialize a new Ansible-based Operator SDK project for the Memcached Operator:
operator-sdk init --plugins=ansible --domain example.com
Create the Memcached API and generate an Ansible role skeleton. This will ensure our controller is setup to watch the Memcached resource with APIVersion ‘cache.example.com/v1alpha1’ and Kind ‘Memcached’.
Typically, one would pass the --generate-role
flag, but because we will be
replacing this role with an existing role from Ansible Galaxy, we will leave
it off of this command.
operator-sdk create api --group cache --version v1alpha1 --kind Memcached
Inspect the memcached-operator directory structure for yourself with ‘tree’, and then ‘cd’ into it.
tree
To speed development of our Operator up, we can re-use an existing Role. We will install a Role from Ansible Galaxy into our Operator: dymurray.memcached_operator_role: galaxy.ansible.com (https://galaxy.ansible.com/dymurray/memcached_operator_role)
Run the following to install the Ansible Role inside of the project:
ansible-galaxy install dymurray.memcached_operator_role -p ./roles
We can use the ‘tree’ command to get a general sense of the memcached Role installed from Ansible Galaxy.
tree roles/dymurray.memcached_operator_role
This Role provides the user with a variable size
which is an integer to control the number of Deployment replicas to create. You can find the default for this variable in the memcached Role defaults/main.yml file:
# ---
# # defaults file for Memcached
# size: 1
Next, we’ll modify the necessary files to ensure that our Operator uses this
Role instead of the generated scaffolding Role. Let’s modify watches.yaml
.
By default, the memcached-operator watches Memcached
resource events as shown in watches.yaml
and executes Ansible Role Memcached
.
Since we have used a role from Ansible Galaxy, lets change the Watches file to reflect this:
---
- version: v1alpha1
group: cache.example.com
kind: Memcached
role: roles/dymurray.memcached_operator_role
Update this file by running the following command:
\cp /tmp/watches.yaml watches.yaml
In the next step, we’ll build and run our Ansible Operator. Before running the Operator, Kubernetes needs to know about the new custom resource definition the Operator will be watching.
Note: Before running the next step, delete your Go-based Operator’s memcacheds.cache.example.com/v1alpha1 CRD from the cluster.
oc delete -f $HOME/projects/memcached-operator/config/crd/bases/cache.example.com_memcacheds.yaml
Deploy the Ansible Operator Memcached CRD:
oc create -f config/crd/bases/cache.example.com_memcacheds.yaml
By running this command, we are creating a new resource type, memcached
, on the cluster. We will give our Operator work to do by creating and modifying resources of this type.
Create the Namespace/Project:
oc new-project tutorial
Start the Operator and set the WATCH_NAMESPACE variable
WATCH_NAMESPACE=tutorial make run
Open a 2nd terminal window and navigate to your Ansible Operator memcached project root directory
cd $HOME/tutorial/memcached-operator
Scope yourself to the tutorial
project:
oc project tutorial
Now that our Operator is running, let’s create a CR and deploy an instance of memcached.
There is a sample CR in the scaffolding created as part of the Operator SDK:
apiVersion: cache.example.com/v1alpha1
kind: Memcached
metadata:
name: memcached-sample
spec:
foo: bar
Inspect config/samples/cache_v1alpha1_memcached.yaml
, and then update the object to specify 3 replicas:
apiVersion: cache.example.com/v1alpha1
kind: Memcached
metadata:
name: memcached-sample
spec:
size: 3
Update this file by running the following command:
\cp /tmp/cache_v1alpha1_memcached.yaml config/samples/cache_v1alpha1_memcached.yaml
oc --namespace tutorial create -f config/samples/cache_v1alpha1_memcached.yaml
Ensure that the memcached-operator created the deployment for the CR:
oc get deployment
Check the pods to confirm 3 replicas were created:
oc get pods
Change the spec.size
field in config/samples/cache_v1alpha1_memcached.yaml
from 3 to 4.
apiVersion: cache.example.com/v1alpha1
kind: Memcached
metadata:
name: memcached-sample
spec:
size: 4
sed -i .orig 's/size: 3/size: 4/' config/samples/cache_v1alpha1_memcached.yaml
Now apply it:
oc --namespace tutorial apply -f config/samples/cache_v1alpha1_memcached.yaml
Confirm that the Operator changes the Deployment size:
oc get deployment
Inspect the YAML list of ‘memcached’ resources in your project, noting that the ‘spec.size’ field is now set to 4.
oc get memcached -o yaml
First, delete the ‘memcached’ CR, which will remove the 4 Memcached Pods and the associated Deployment.
oc --namespace tutorial delete -f config/samples/cache_v1alpha1_memcached.yaml
Verify the memcached CR and deployment have been properly removed.
oc get memcached
oc get deployment