AWX est une interface web qui permet de planifier et déployer des playbooks ansible et d’automatiser la journalisation, l’audit et le suivi des systèmes.
Depuis la version 18, AWX nécessite une plateforme Kubernetes pour son déploiement.
Dans cet article, nous allons le déployer sur le cluster Kubernetes installé dans cet article. A noter, il faudra également que le LoadBalancer MetalLB soit installé comme détaillé ici.
Installation de PostgreSQL
Même si awx permet, lors de son déploiement, d’installer un serveur PostgreSQL, nous allons installer notre propre serveur dans le cadre de cette installation.
Nous allons forcer le déploiement du serveur sur worker-2 et nous allons créer un volume persistant sous /k8s/pgsql.
Sur worker-2, nous exécutons donc la commande suivante :
mkdir -p /k8s/pgsql
Depuis un noeud master, nous créons le fichier pgsql.yaml :
--- apiVersion: v1 kind: Namespace metadata: name: postgresql --- apiVersion: v1 kind: ConfigMap metadata: name: postgresql-config namespace: postgresql labels: app: postgresql data: POSTGRES_DB: awx POSTGRES_USER: awxuser POSTGRES_PASSWORD: awxuserpassword --- kind: PersistentVolume apiVersion: v1 metadata: name: postgresql-pv labels: type: local app: postgresql spec: storageClassName: manual capacity: storage: 100Gi accessModes: - ReadWriteOnce hostPath: path: "/k8s/pgsql" --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: postgresql-pvc namespace: postgresql labels: app: postgresql spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 100Gi --- apiVersion: apps/v1 kind: StatefulSet metadata: name: postgresql-statefulset namespace: postgresql labels: app: postgresql spec: serviceName: "postgresql" replicas: 1 selector: matchLabels: app: postgresql template: metadata: labels: app: postgresql spec: nodeName: worker-2 containers: - name: postgresql image: postgres:14 envFrom: - configMapRef: name: postgresql-config ports: - containerPort: 5432 volumeMounts: - name: postgresql-data mountPath: /var/lib/postgresql/data volumes: - name: postgresql-data persistentVolumeClaim: claimName: postgresql-pvc --- apiVersion: v1 kind: Service metadata: name: postgresql-service namespace: postgresql labels: app: postgresql spec: ports: - port: 5432 type: ClusterIP selector: app: postgresql
Puis nous exécutons la commande :
kubectl create -f pgsql.yaml
Nous pouvons ensuite vérifier que le déploiement a bien été effectué :
Installation de AWX
L’ensemble des manipulations se fera depuis un noeud master (ici master-1).
Installation de Kustomize
Kustomize est un outil de transformation de configuration Kubernetes qui permet de personnaliser les fichiers YAML en laissant les fichiers d’origine intacts. Nous allons installer le binaire kustomize dans /usr/local/bin :
curl -s "https://raw.githubusercontent.com/kubernetes-sigs/kustomize/master/hack/install_kustomize.sh" | bash mv kustomize /usr/local/bin chmod +rx /usr/local/bin/kustomize
Installation de ingress-nginx
L’ingress-nginx va permettre de gérer les connexions extérieures et notamment le chiffrement https.
Récupérons le fichier yaml de déploiement :
wget https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.2.0/deploy/static/provider/baremetal/deploy.yaml
Ensuite, dans ce fichier, modifions la partie :
apiVersion: v1 kind: Service ... app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx type: NodePort
en :
apiVersion: v1 kind: Service ... app.kubernetes.io/instance: ingress-nginx app.kubernetes.io/name: ingress-nginx type: LoadBalancer
Ensuite, installons Ingress-nginx à l’aide de la commande :
kubectl create -f deploy.yaml
Installation de awx
Créons tout d’abord un namespace awx :
kubectl create namespace awx
Puis nous allons créer un secret nommé awx-tls dans le namespace awx qui comportera le certificat et la clé de chiffrement pour l’accès https au site.
En supposant que le répertoire courant comporte les fichiers server.key (clé privée) et server.crt (certificat), la commande à exécuter est :
kubectl create secret tls awx-tls --namespace awx --key server.key --cert server.crt
Nous allons créer maintenant un secret nommé awx-postgres-configuration dans le namespace awx qui contiendra les informations pour se connecter à la base de données créée précédemment.
Editons le fichier postgres_configuration_secret.yaml :
--- apiVersion: v1 kind: Secret metadata: name: awx-postgres-configuration namespace: awx stringData: host: "postgresql-service.postgresql" port: "5432" database: "awx" username: "awxuser" password: "awxuserpassword" sslmode: "prefer" type: "unmanaged" type: Opaque
Puis intégrons le avec la commande :
kubectl create -f postgres_configuration_secret.yaml
Nous allons utiliser (et installer) l’operateur AWX qui va gérer l’installation de l’application AWX sur notre cluster Kubernetes.
Créons un fichier kustomization.yaml :
apiVersion: kustomize.config.k8s.io/v1beta1 kind: Kustomization resources: - github.com/ansible/awx-operator/config/default?ref=0.22.0 - awx.yaml images: - name: quay.io/ansible/awx-operator newTag: 0.22.0 namespace: awx
Il est recommandé de remplacer la release (0.22.0) par le numéro de la dernière release disponible.
Créons ensuite un fichier awx-admin-password.yaml qui contiendra le mot de passe admin de notre instance awx :
--- apiVersion: v1 kind: Secret metadata: name: awx-admin-password namespace: awx stringData: password: "adminpassword"
Puis intégrons le avec la commande :
kubectl create -f awx-admin-password.yaml
Créons ensuite un fichier awx.yaml :
--- apiVersion: awx.ansible.com/v1beta1 kind: AWX metadata: name: awx spec: service_type: ClusterIP postgres_configuration_secret: awx-postgres-configuration ingress_type: ingress hostname: awx.be-root.com ingress_tls_secret: awx-tls
Attention, le hostname indiqué ici sera utilisé par nginx pour faire reverse-proxy vers le bon service.
Ensuite lançons la commande :
kustomize build . | kubectl apply -n awx -f -
Nous allons maintenant éditer l’ingress awx-ingress pour y ajouter la ligne kubernetes.io/ingress.class: nginx :
kubectl edit ingress awx-ingress -n awx
Nous pouvons maintenant vérifier que l’ensemble et fonctionnel :
Nous pouvons également remarquer que l’adresse externe 192.168.11.170 a été affectée par le LoadBalancer MetalLB à l’ingress-nginx. Nous pouvons donc faire une déclaration DNS pour faire pointer le hostname awx.be-root.com vers l’adresse 192.168.11.170.
Nous pouvons ensuite accéder à awx en https en ouvrant une page web et en utilisant le login admin et le mot de passe adminpassword :