Ansible ist ein Opensource Werkzeug, um einen oder mehrere PCs per SSH verwalten zu können und zielt primär auf System ab, die auf Linux basieren. Jedoch kann seit einiger Zeit auch Windows System damit verwalten. Mit den sogenannten Playbook kann man komplette Abläufe über einen oder mehrere Hosts komplett automatisieren und bei Bedarf erneut ausführen.
Das ist in Kombination beispielsweise mit Virtuellen Maschinen in Kombination mit Snapshots sehr praktisch um etwas auszuprobieren.
Als Beispiel deklariert man als erstes eine „hosts“ Datei mit folgendem Inhalt:
[control_plane]
master1.kube.local ansible_host=192.168.0.80
[workers]
worker1.kube.local ansible_host=192.168.0.91
worker2.kube.local ansible_host=192.168.0.91
[cluster:children]
control_plane
workers
Die IP-Adressen muss man dementsprechend anpassen. In dem Beispiel gehe ich davon aus, das 3 Systeme mit einer Ubuntu Version per Vagrant vorinstalliert sind.
Das untere Beispiel macht folgende Schritte:
– Deaktivierung von automatischen Updates (Ungünstig bei Kubernetes, die Systempflege der Updates muss per Hand erfolgen.)
– Legt einen neuen Benutzer „kube“ mit dem Passwort „kubernetes“ an und erlaubt es „kube“ sudo Befehle ohne Passwort auszuführen.
– Kopiert in dem Fall aus dem Home-Verzeichnis ~/.ssh/authorized_keys einen SSH-Key, den ich in der Regel zum Login verwende, das kann je nach eigenen Bedürfnissen angepasst werden.
– Updatet das System auf das aktuelle Patchlevel bevor Kubernetes installiert wird und löscht von der Installation vorhandene und überflüssige Pakete
– Deaktiviert das Swap von RAM, da Kubernetes damit nicht klar kommt.
– Legt innerhalb der Datei /etc/hosts statische Einträge an, damit der Kubernetes Cluster für den Start nicht auf einen funktionierenden DNS-Server angewiesen ist.
– Installiert containerd als Ersatz zu Docker. Docker gilt mittlerweile seit Version 1.20 als Deprecated.
– Passt das IP Forwarding an, damit Pods von außen erreicht werden können.
– Installiert die Kubernetes Cluster Pakete und aktiviert diese automatisch beim Systemstart.
Folgende Datei als kube-dependencies.yml speichern:
---
- hosts: all
become: yes
tasks:
- name: Disable auto upgrades
copy:
src: /usr/share/unattended-upgrades/20auto-upgrades-disabled
dest: /etc/apt/apt.conf.d/20auto-upgrades
remote_src: yes
- name: Create kube superuser user with pass kubernetes
user:
name: kube
password: $6$5dqHns.IJ$FpCGaCbY9ySKo0mh.ydPo57A2kgUdjv3U8IUZXnfw8DNGQw4g0hO27XpMSIhwHvcO8QdEVucnlY9tYyTEg3CN/
shell: /bin/bash
groups: sudo
- name: Allow kube to use sudo without a password
copy:
content: "kube ALL=(ALL) NOPASSWD:ALL"
dest: /etc/sudoers.d/kube
- name: upload ssh key
authorized_key:
user: kube
state: present
manage_dir: yes
key: "{{ lookup('pipe', 'cat ~/.ssh/authorized_keys') }}"
- name: Updating System to latest Packages
apt: update_cache=yes upgrade=dist force_apt_get=yes
- name: Clean unwanted olderstuff
apt:
autoremove: yes
purge: yes
- name: Remove swapfile from /etc/fstab
mount:
name: "{{ item }}"
fstype: swap
state: absent
with_items:
- swap
- none
- name: Disable swap
command: swapoff -a
when: ansible_swaptotal_mb > 0
- name: Add IPs to /etc/hosts on master and workers
lineinfile:
dest: /etc/hosts
regexp: '.*{{ item }}$'
line: "{{ hostvars[item].ansible_host }} {{item}}"
state: present
when: hostvars[item].ansible_host is defined
with_items: "{{ groups.all }}"
- name: Install containerd
apt:
name: containerd
state: present
update_cache: true
- name: Create containerd config file
file:
path: "/etc/modules-load.d/containerd.conf"
state: "touch"
- name: Add conf for containerd
blockinfile:
path: "/etc/modules-load.d/containerd.conf"
block: |
overlay
br_netfilter
- name: modprobe
shell: |
sudo modprobe overlay
sudo modprobe br_netfilter
- name: Set system configurations for Kubernetes networking
file:
path: "/etc/sysctl.d/99-kubernetes-cri.conf"
state: "touch"
- name: Add IP Forward and IPtables for containerd
blockinfile:
path: "/etc/sysctl.d/99-kubernetes-cri.conf"
block: |
net.bridge.bridge-nf-call-iptables = 1
net.ipv4.ip_forward = 1
net.bridge.bridge-nf-call-ip6tables = 1
- name: Apply new sysctl settings
command: sudo sysctl --system
- name: install APT Transport HTTPS
apt:
name: apt-transport-https
state: present
- name: Add Kubernetes apt-key
apt_key:
url: https://packages.cloud.google.com/apt/doc/apt-key.gpg
state: present
- name: Add Kubernetes APT repository
apt_repository:
repo: deb http://apt.kubernetes.io/ kubernetes-xenial main
state: present
filename: 'kubernetes'
- name: Installing Kubernetes Cluster Packages.
apt:
name:
- kubeadm
- kubectl
- kubelet
state: present
- name: Enable service kubelet, and enable persistently
service:
name: kubelet
enabled: yes
- name: Disable multipathd
service:
name: multipathd
enabled: no
- name: Disable unattended-upgrades
service:
name: unattended-upgrades
enabled: no
- name: Disable cron
service:
name: cron
enabled: no
- name: Reboot all the kubernetes nodes.
reboot:
post_reboot_delay: 10
reboot_timeout: 40
connect_timeout: 60
test_command: uptime
Um das Playbook zu starten tippt man folgendes ein:
ansible-playbook -i hosts kube-dependencies.yml
Das wird einige Zeit dauern, Zeit um eine kleine Pause zu machen.