Ansible server setup with Kubernetes Cluster

As you may already heard or know, Ansible is a very powerful tool we can use for Configuration management and orchestration. Today I’m going to discuss how we can setup Ansible server setup alone with Kubernetes to test out your cluster automation.

I’m going to use one server as Ansible server, and two other servers for Kubernetes cluster which includes one master node and one worker node (It is advised to have atleast 2 worker nodes for a cluster, but since we are doing only a demonstration, I’m using only one worker node).

First Im going to set up the Kubernetes cluster. I will start with Kubernetes Master node. We need to get the gpg keys for Docker and Kubernetes and add it to your repository.

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository “deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable”

curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -

cat << EOF | sudo tee /etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF

sudo apt-get update

Once you have executed above in Kubernetes master, you have to run them in worker nodes as well.

After updating the repository, it is time to install the components. You have to run below command to install Docker, kubelet, kubeadm and kubectl in both the servers. It will install the mentioned component versions.

sudo apt install -y docker-ce=18.06.3~ce~3–0~ubuntu kubelet=1.18.5–00 kubeadm=1.18.5–00 kubectl=1.18.5–00

Next, we have to setup the kubernetes cluster. Following will initialize the cluster using kubeadm in master node.

sudo kubeadm init — pod-network-cidr=10.244.0.0/16

Once it is executed, it will output something like “kubeadm join 172.31.6.2:6443 — token pczgka.q9affhe4xxxxxxx \
— discovery-token-ca-cert-hash sha256:6xxxxxxxxxxxxxxxxx”. Keep that copied since we need it when connecting worker node with master node. To start using your cluster, you need to run the following as a regular user:

mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config

In master node, then we run below in order to apply fannel.

kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/master/Documentation/kube-flannel.yml

Next we login to worker node and run following command to join the worker node to the cluster.

kubeadm join 172.31.6.2:6443 — token pczgka.q9affhe4xxxxxxx \
— discovery-token-ca-cert-hash sha256:6xxxxxxxxxxxxxxxxx

Now kubernetes installation is complete. You can view the available namespaces, pods and services.

As the next step, we are going to install Ansible in to the dedicated server. Inside the server, it is best if we could install ansible to a virtual environment. Install virtual environment first. And then create a new virtual environment and activate it.

sudo apt-get install python3-venv

python3 -m venv ansible

source ansible/bin/activate

Install ansible in virtual environment.

sudo python -m pip install ansible

Once installation is done verify the correct version is installed.

(ansible) user@navoda2c:~$ ansible — version
ansible 2.10.8
config file = /etc/ansible/ansible.cfg
configured module search path = [‘/home/cloud_user/.ansible/plugins/modules’, ‘/usr/share/ansible/plugins/modules’]
ansible python module location = /usr/local/lib/python3.6/dist-packages/ansible
executable location = /usr/local/bin/ansible
python version = 3.6.9 (default, Jan 26 2021, 15:33:00) [GCC 8.4.0]

Then we have to have ssh connection with both Ansible server and Kubernetes master server. We are using ssl certificate exchange connection. So I’m going to generate the necessary certificates in Ansible server and will share the key with Kubernetes server.

ssh-keygen
cat mykey >> /home/user/.ssh/id_rsa
sudo chmod 400 /home/user/.ssh/id_rsa
sudo ssh-copy-id -i ~/.ssh/mykey kube_user@navoda3

Test the connection with logging in to Kubernetes server within Ansible server. Once connection tested, you will need to install openshift client in Kubernetes master node.

sudo pip install openshift

At last execute below to install the kubernetes collection in Ansible node.

ansible-galaxy collection install kubernetes.core

Now you are ready roll on. Let’s write a sample playbook and test if it is running. Initially you need to create file which include target host details. Let’s call it as host.ini. This file includes the group name and the server IPs or hostnames.

[kube_server]
127.0.0.1

Then we will write the playbook as a yaml file. Here we are creating a new namespace called “myapp”.

— -
- hosts: kube_server
gather_facts: false

tasks:
— name: Ensure the myapp Namespace exists.
kubernetes.core.k8s:
api_version: v1
kind: Namespace
name: myapp
state: present

And at last we will run the playbook.

$ ansible-playbook -i host.ini test.yml

Successfully executed playbook

You can go to Kubernetes server and verify whether there is a namespace named as “myapp”.

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store