Aller au contenu

Installer Ansible AWX avec une BDD externe

logo ansible

Il y a quelques mois, je vous expliquais comment installer et upgrader AWX via l’utilisation de l’opérateur Kubernetes AWX. Mais voilà lors d’un upgrade et je suis impardonnable, j’ai perdu le secret stockant le mot de passe de connexion à la base de données Postgres en effaçant le namespace AWX. Donc j’ai décidé d’utiliser une base de données installée sur un autre serveur. Voyons comment procéder.

Création de la base de données Postgres

Installation et configuration de Postgres

Sur un serveur, je vais commencer par installer le serveur postgres et créer une base de données AWX. Commençons par installer postgres :

Terminal window
sudo apt install postgresql postgresql-contrib

Il faut modifier la configuration pour autoriser les connexions depuis les adresses IP des nodes du cluster kubernetes. Pour cela, on cherche quelles sont les adresses IP assignées :

Terminal window
kubectl get pod -A -o wide
NAMESPACE NAME READY STATUS RESTARTS AGE IP NODE
kube-system helm-install-traefik-p9cq9 0/1 Completed 0 95d 10.42.0.20 devbox1
kube-system helm-install-traefik-crd-m9n92 0/1 Completed 0 95d 10.42.0.19 devbox1
kube-system svclb-traefik-a41b7bef-7svcf 2/2 Running 8 (18h ago) 95d 10.42.0.119 devbox1
kube-system traefik-7cd4fcff68-45spm 1/1 Running 4 (18h ago) 95d 10.42.0.124 devbox1
kube-system metrics-server-ff9dbcb6c-4fkws 1/1 Running 13 (18h ago) 274d 10.42.0.121 devbox1
default gitlab-runner-gitlab-runner-5559f558cc-l9rpr 1/1 Running 10 (18h ago) 246d 10.42.0.123 devbox1

Je vais autoriser les connexions depuis le réseau 10.42.0.0/24. J’ajoute les ranges d’adresses dans la configuration de postgres, en incluant celui de mon réseau (192.168.1.1/24).

Terminal window
sudo vi /etc/postgresql/14/main/pg_hba.conf
# IPv4 local connections:
host all all 127.0.0.1/32 scram-sha-256
host all all 10.42.0.0/24 trust
host all all 192.168.1.1/24 trust

Il faut aussi modifier sur quelle adresse postgress écoute :

Terminal window
sudo vi /etc/postgresql/14/main/postgresql.conf

Rechercher listen_addresses copier la ligne et remplacer localhost par ’*’ :

# - Connection Settings -
#listen_addresses = 'localhost' # what IP address(es) to listen on;
listen_addresses = '*' # what IP address(es) to listen on;
## Installation d'Ansible AWX sur un cluster Kubernetes

On peut relancer postgres :

Terminal window
sudo systemctl restart postgres

Création de la base de données AWX

Il faut, avant d’installer l’opérateur, créer la base de données, un user et lui donner les droits en écriture. Depuis un terminal :

Terminal window
sudo su - postgres
psql
create database awx;
create user awx with encrypted password 'mypass';
grant all privileges on database awx to awx;
\q

C’est bon tout est prêt, passons à l’installation de l’opérateur AWX.

Installation de l’opérateur AWX

Récupérer le projet AWX-Operator

Un simple git clone dans un répertoire va suffire :

Terminal window
git clone https://github.com/ansible/awx-operator.git
cd awx-operator

Paramétrage de l’opérateur AWX

Vous allez voir c’est très simple. On va dans un premier temps retrouver la dernière version disponible et créer le namespace AWX :

Terminal window
export NAMESPACE=awx
export RELEASE_TAG=`curl -s https://api.github.com/repos/ansible/awx-operator/releases/latest | grep tag_name | cut -d '"' -f 4`
kubectl create ns ${NAMESPACE}
kubectl config set-context --current --namespace=$NAMESPACE
git checkout $RELEASE_TAG

Passons au déploiement de l’opérateur Kubernetes :

Terminal window
make deploy
cd config/manager && /home/user/awx-operator/bin/kustomize edit set image controller=quay.io/ansible/awx-operator:0.14.0
/home/user/awx-operator/bin/kustomize build config/default | kubectl apply -f -
namespace/my-namespace created
customresourcedefinition.apiextensions.k8s.io/awxbackups.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxrestores.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxs.awx.ansible.com created
serviceaccount/awx-operator-controller-manager created
role.rbac.authorization.k8s.io/awx-operator-leader-election-role created
role.rbac.authorization.k8s.io/awx-operator-manager-role created
clusterrole.rbac.authorization.k8s.io/awx-operator-metrics-reader created
clusterrole.rbac.authorization.k8s.io/awx-operator-proxy-role created
rolebinding.rbac.authorization.k8s.io/awx-operator-leader-election-rolebinding created
rolebinding.rbac.authorization.k8s.io/awx-operator-manager-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/awx-operator-proxy-rolebinding created
configmap/awx-operator-manager-config created
service/awx-operator-controller-manager-metrics-service created
deployment.apps/awx-operator-controller-manager created

On vérifie que l’installation s’est correctement terminée. Vous devriez retrouver un pod :

Terminal window
kubectl get pod
NAME READY STATUS RESTARTS AGE
awx-operator-controller-manager-6d959bd7dd-gxkh5 2/2 Running 0 3m

C’est ce pod qui est chargé d’installer AWX à partir d’une configuration que nous allons lui indiquer.

Configurer l’installation d’Ansible AWX

Dans un premier pour rendre persistante l’installation, nous allons définir un Persistent Volume Claim :

Terminal window
tee awx-pvc.yml <<EOF
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: awx-projects-claim
spec:
accessModes:
- ReadWriteOnce
volumeMode: Filesystem
resources:
requests:
storage: 2Gi
storageClassName: local-path
EOF
kubectl apply -f awx-pvc.yml

Idem, nous créons un seul Persistent Volume qui stockera les projets :

Terminal window
tee awx-pv.yml <<EOF
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: awx-projects-volume
spec:
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
capacity:
storage: 2Gi
storageClassName: local-path
hostPath:
path: /data/projects
EOF
kubectl apply -f awx-pv.yml

Il faut aussi créer le secret permettant à AWX de se connecter à la base de données de postgres.

Terminal window
tee awx-postgres.yml <<EOF
---
apiVersion: v1
kind: Secret
metadata:
name: awx-postgres-configuration
namespace: awx
stringData:
host: "192.168.1.101"
port: "5432"
database: awx
username: awx
password: awx
sslmode: prefer
type: unmanaged
type: Opaque
EOF
kubectl apply -f awx-postgres.yml

Maintenant créons la déclaration de notre serveur AWX. L’opérateur se charge de créer l’ingress, donc modifier avec votre nom de domaine (hostname).

Terminal window
tee awx-deployment.yml<<EOF
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
name: awx
spec:
# These parameters are designed for use with AWX Operator 0.29.0
# and AWX 21.6.0
postgres_configuration_secret: awx-postgres-configuration
projects_persistence: true
garbage_collect_secrets: false
projects_existing_claim: awx-projects-claim
web_resource_requirements: {}
task_resource_requirements: {}
ee_resource_requirements: {}
service_type: ClusterIP
ingress_type: ingress
hostname: awx.robert.local
ingress_annotations: |
kubernetes.io/ingress.class: traefik
EOF
kubectl apply -f awx-deployment.yml

À présent, vous allez devoir patienter que l’installation se termine, cela peut être long (plusieurs minutes). Vous pouvez vérifier que tout se passe bien.

Les pods sont ils en running :

Terminal window
kubectl get pods -l "app.kubernetes.io/managed-by=awx-operator"
NAME READY STATUS RESTARTS AGE
awx-596c5cd8b4-jzzrm 4/4 Running 162 (35m ago) 17h

Les services sont ils déclarés :

Terminal window
kubectl get svc -l "app.kubernetes.io/managed-by=awx-operator"
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
awx-service ClusterIP 10.43.124.154 <none> 80/TCP 17h

Si vous avez des problèmes, vous pouvez vérifier les logs des containers ou les événements :

Terminal window
kubectl logs -f deployments/awx-operator-controller-manager -c awx-manager
kubectl logs -f awx-596c5cd8b4-jzzrm awx-web
kubectl logs -f awx-596c5cd8b4-jzzrm awx-tasks
kubectl logs -f awx-596c5cd8b4-jzzrm awx-ee
kubectl get events

Accès à l’interface d’AWX depuis votre navigateur

Vous pouvez vous connecter à l’interface web via l’url **http://<votre-domaine>'**

Le user est admin et le mot de passe est stocké dans les secrets :

Terminal window
kubectl get secret awx-admin-password -o go-template='{{range $k,$v := .data}}{{printf "%s: " $k}}{{if not $v}}{{$v}}{{else}}{{$v | base64decode}}{{end}}{{"\n"}}{{end}}'
password: 4QZfWjot1JkrleSXvGnLZDXjr6oXWeoF

architecture kubernetes

Maintenant reste plus qu’à mettre en place une sauvegarde de la base de données. Avant tout upgrade un petit backup de celle-ci et du répertoire projects, et les problèmes ne devraient plus arriver !