Loading search data...

Ansible - Installer AWX sur un cluster Kubernetes avec une BDD externe

Publié le : 25 novembre 2022 | Mis à jour le : 25 novembre 2022

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 :

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 :

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).

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 :

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 :

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 :

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 :

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 :

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 :

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 :

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 :

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 :

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.

tee awx-postrges.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).

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 :

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 :

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 :

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://'

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

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 !

Mots clés :

devops kubernetes tutorials ansible

Si vous avez apprécié cet article de blog, vous pouvez m'encourager à produire plus de contenu en m'offrant un café sur  Ko-Fi. Vous pouvez aussi passer votre prochaine commande sur amazon, sans que cela ne vous coûte plus cher, via  ce lien . Vous pouvez aussi partager le lien sur twitter ou Linkedin via les boutons ci-dessous. Je vous remercie pour votre soutien.

Autres Articles


Commentaires: