Installer Ansible AWX avec une BDD externe
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 wideNAMESPACE NAME READY STATUS RESTARTS AGE IP NODEkube-system helm-install-traefik-p9cq9 0/1 Completed 0 95d 10.42.0.20 devbox1kube-system helm-install-traefik-crd-m9n92 0/1 Completed 0 95d 10.42.0.19 devbox1kube-system svclb-traefik-a41b7bef-7svcf 2/2 Running 8 (18h ago) 95d 10.42.0.119 devbox1kube-system traefik-7cd4fcff68-45spm 1/1 Running 4 (18h ago) 95d 10.42.0.124 devbox1kube-system metrics-server-ff9dbcb6c-4fkws 1/1 Running 13 (18h ago) 274d 10.42.0.121 devbox1default 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-256host all all 10.42.0.0/24 trusthost 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 - postgrespsqlcreate 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.gitcd 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=awxexport 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=$NAMESPACEgit checkout $RELEASE_TAG
Passons au déploiement de l’opérateur Kubernetes :
make deploycd 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 createdcustomresourcedefinition.apiextensions.k8s.io/awxbackups.awx.ansible.com createdcustomresourcedefinition.apiextensions.k8s.io/awxrestores.awx.ansible.com createdcustomresourcedefinition.apiextensions.k8s.io/awxs.awx.ansible.com createdserviceaccount/awx-operator-controller-manager createdrole.rbac.authorization.k8s.io/awx-operator-leader-election-role createdrole.rbac.authorization.k8s.io/awx-operator-manager-role createdclusterrole.rbac.authorization.k8s.io/awx-operator-metrics-reader createdclusterrole.rbac.authorization.k8s.io/awx-operator-proxy-role createdrolebinding.rbac.authorization.k8s.io/awx-operator-leader-election-rolebinding createdrolebinding.rbac.authorization.k8s.io/awx-operator-manager-rolebinding createdclusterrolebinding.rbac.authorization.k8s.io/awx-operator-proxy-rolebinding createdconfigmap/awx-operator-manager-config createdservice/awx-operator-controller-manager-metrics-service createddeployment.apps/awx-operator-controller-manager created
On vérifie que l’installation s’est correctement terminée. Vous devriez retrouver un pod :
kubectl get podNAME READY STATUS RESTARTS AGEawx-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: v1kind: PersistentVolumeClaimmetadata: name: awx-projects-claimspec: accessModes: - ReadWriteOnce volumeMode: Filesystem resources: requests: storage: 2Gi storageClassName: local-pathEOF
kubectl apply -f awx-pvc.yml
Idem, nous créons un seul Persistent Volume qui stockera les projets :
tee awx-pv.yml <<EOF---apiVersion: v1kind: PersistentVolumemetadata: name: awx-projects-volumespec: accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain capacity: storage: 2Gi storageClassName: local-path hostPath: path: /data/projectsEOF
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-postgres.yml <<EOF---apiVersion: v1kind: Secretmetadata: name: awx-postgres-configuration namespace: awxstringData: host: "192.168.1.101" port: "5432" database: awx username: awx password: awx sslmode: prefer type: unmanagedtype: OpaqueEOFkubectl 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/v1beta1kind: AWXmetadata: name: awxspec: # 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: traefikEOF
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 AGEawx-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) AGEawx-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-managerkubectl logs -f awx-596c5cd8b4-jzzrm awx-webkubectl logs -f awx-596c5cd8b4-jzzrm awx-taskskubectl logs -f awx-596c5cd8b4-jzzrm awx-eekubectl 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 :
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
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 !