Table des matières

Introduction

AWX permet de gérer de manière centralisée les playbooks Ansible, les inventaires, les secrets et les tâches planifiées depuis une interface web. Il est facile d'installer AWX sur le système Linux Ubuntu 20.04|18.04 (Bionic Beaver).

À partir de la version 18.0 de AWX, la méthode d'installation recommandée est celle de l'opérateur AWX. Comme la méthode d'installation par l'opérateur nécessite un cluster Kubernetes, nous allons effectuer une installation Kubernetes à un seul nœud sur Ubuntu Linux en utilisant k3s.

Pré requis

Ubuntu 20.04|22.04 LTS Server Au minimum 8 GB RAM Au moins 4 vcpus 40 GB d'espace disque

Mise à jour OS

$ sudo apt update && sudo apt -y upgrade
$ [ -f /var/run/reboot-required ] && sudo reboot -f

Installer un nœud unique k3s Kubernetes

Nous allons déployer un nœud unique de Kubernetes en utilisant l'outil K3s.

K3s est une distribution Kubernetes certifiée conçue pour les charges de travail de production dans des environnements sans surveillance et avec des ressources limitées.

L'avantage de K3s est que vous pouvez ajouter d'autres nœuds de travail à un stade ultérieur si nécessaire.

K3s fournit un script d'installation qui est un moyen pratique de l'installer en tant que service sur les systèmes basés sur systemd ou openrc.

Pour installer K3s sur notre système Ubuntu :

$ curl -sfL https://get.k3s.io | sudo bash -
$ sudo chmod 644 /etc/rancher/k3s/k3s.yaml

Vérification K3S

L'étape suivante consiste à valider notre installation de K3s en utilisant la commande kubectl qui a été installée et configurée par le script d'installation.

$ kubectl get nodes
NAME        STATUS   ROLES                  AGE   VERSION
awx   Ready    control-plane,master   2m53s   v1.24.3+k3s1

Nous pouvons également confirmer la version de Kubernetes déployée à l'aide de la commande suivante :

$ kubectl version --short
Client Version: v1.24.3+k3s1
Server Version: v1.24.3+k3s1

Le service K3s sera configuré pour redémarrer automatiquement après le redémarrage des nœuds ou si le processus s'arrête ou est tué.

Déployer AWX Operator

Cet opérateur Kubernetes doit être déployé dans le cluster Kubernetes, qui dans notre cas est alimenté par K3s.

L'opérateur que nous allons déployer peut gérer une ou plusieurs instances AWX dans n'importe quel espace de noms.

Installez les outils git et make :

$ sudo apt update
$ sudo apt install git build-essential

Cloner le code de déploiement de l'opérateur :

$ git clone https://github.com/ansible/awx-operator.git
Cloning into 'awx-operator'...
remote: Enumerating objects: 6306, done.
remote: Counting objects: 100% (315/315), done.
remote: Compressing objects: 100% (189/189), done.
remote: Total 6306 (delta 160), reused 236 (delta 115), pack-reused 5991
Receiving objects: 100% (6306/6306), 1.54 MiB | 19.74 MiB/s, done.
Resolving deltas: 100% (3598/3598), done.

Créer un espace de nom où l'opérateur sera déployé.

$ kubectl create ns awx

Passez au répertoire awx-operator :

$ cd awx-operator/

Sauvegardez la dernière version de l'opérateur AWX en tant que variable RELEASE_TAG puis effectuez un checkout sur la branche en utilisant git.

$ sudo apt install curl jq
RELEASE_TAG=`curl -s https://api.github.com/repos/ansible/awx-operator/releases/latest | grep tag_name | cut -d '"' -f 4`
$ echo $RELEASE_TAG
$ git checkout $RELEASE_TAG

Déployez AWX Operator dans votre cluster :

$ export NAMESPACE=awx
$ make deploy

Sortie de commande :

...
namespace/awx configured
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-awx-manager-role created
role.rbac.authorization.k8s.io/awx-operator-leader-election-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-awx-manager-rolebinding created
rolebinding.rbac.authorization.k8s.io/awx-operator-leader-election-rolebinding created
clusterrolebinding.rbac.authorization.k8s.io/awx-operator-proxy-rolebinding created
configmap/awx-operator-awx-manager-config created
service/awx-operator-controller-manager-metrics-service created
deployment.apps/awx-operator-controller-manager created

Attendez quelques minutes et awx-operator devrait fonctionner

$ kubectl get pods -n awx
NAME                                               READY   STATUS    RESTARTS   AGE
awx-operator-controller-manager-49d246bedf-r46h6   2/2     Running   0          40s

Déployer Ansible AWX

Créer un PVC pour la persistance de données

$ cat <<EOF | kubectl create -f -
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: static-data-pvc
  namespace: awx
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: local-path
  resources:
    requests:
      storage: 10Gi
EOF

Le PVC ne sera pas lié tant que le pod qui l'utilise ne sera pas créé

$ kubectl get pvc -n awx
NAME                     STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
static-data-pvc          Pending   

Créons maintenant le fichier de déploiement AWX avec des informations de base

$ nano awx-deploy.yml
...
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:
  name: awx
spec:
  service_type: nodeport
  projects_persistence: true
  projects_storage_access_mode: ReadWriteOnce
  web_extra_volume_mounts: |
    - name: static-data
      mountPath: /var/lib/projects
  extra_volumes: |
    - name: static-data
      persistentVolumeClaim:
        claimName: static-data-pvc

Nous avons défini le nom de la ressource awx et le type de service comme nodeport pour nous permettre d'accéder à AWX à partir de l'adresse IP du nœud et du port donné.

Nous avons également ajouté un montage PV supplémentaire sur le pod du serveur web.

On applique notre manifest de configuration

$ kubectl apply -f awx-deploy.yml
awx.awx.ansible.com/awx created

Attendez quelques minutes puis vérifiez le déploiement de l'instance AWX :

$ kubectl get pods -n awx -l "app.kubernetes.io/managed-by=awx-operator"
NAME                   READY   STATUS    RESTARTS   AGE
awx-postgres-0         1/1     Running   0          82s
awx-6c4y754h43-scefd   4/4     Running   0          68s

Vous pouvez suivre le processus d'installation dans les journaux de l'opérateur

$ kubectl logs -f deployments/awx-operator-controller-manager -c awx-manager

Vérification des journaux AWX

Le pod awx-xxx-yyy aura quatre conteneurs, à savoir :

Vous devrez fournir le nom du conteneur après le pod

$ kubectl -n awx  logs deploy/awx -c redis
$ kubectl -n awx  logs deploy/awx -c awx-web
$ kubectl -n awx  logs deploy/awx -c awx-task
$ kubectl -n awx  logs deploy/awx -c awx-e

Accéder au shell du conteneur AWX

Voici comment accéder au shell de chaque conteneur :

$ kubectl exec -ti deploy/awx  -c  awx-task -- /bin/bash
$ kubectl exec -ti deploy/awx  -c  awx-web -- /bin/bash
$ kubectl exec -ti deploy/awx  -c  awx-ee -- /bin/bash
$ kubectl exec -ti deploy/awx  -c  redis -- /bin/bash

Accéder au tableau de bord Ansible AWX

Lister tous les services disponibles et vérifier awx-service Nodeport

$ kubectl get svc -l "app.kubernetes.io/managed-by=awx-operator" -n awx
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
awx-postgres   ClusterIP   None            <none>        5432/TCP       4h20m
awx-service    NodePort    10.43.229.192   <none>        80:30080/TCP   4h19m

Nous pouvons voir que le type de service est défini sur NodePort.

Pour accéder à notre service depuis l'extérieur du cluster Kubernetes en utilisant l'adresse IP du nœud k3s et en donnant le port du nœud.

Note:

Pour information, l'adresse IP 10.43.229.192 est un IP interne à kubernetes et alloué au service awx-service

Dans notre cas, on utilisera l'adresse IP du serveur : http://10.75.168.45:30080

Le nom d'utilisateur de la connexion est admin

Pour obtenir le mot de passe de l'utilisateur admin en décodant le secret avec la valeur du mot de passe :

$ kubectl get secret awx-admin-password -o jsonpath="{.data.password}" | base64 --decode  
pMadDyIodXcHvin5NIb9LVvkcQwAbcgB

Même resultat, mais mieux présenté :

$ 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}}'

Nous voici connecté à l'interface AWX.

Troubleshooting

Crash Postgresql

Vérifier l'état du Pod PostgreSQL :

$ kubectl get pods -l "app.kubernetes.io/managed-by=awx-operator"
NAME                   READY   STATUS             RESTARTS   AGE
awx-postgres-0         0/1     CrashLoopBackOff   4          2m38s
awx-66c64f8d67-qvfk9   3/4     ImagePullBackOff   0          2m27s

Vérifiez les journaux du Pod :

$ kubectl logs awx-postgres-0
mkdir: cannot create directory ‘/var/lib/postgresql/data’: Permission denied

Cela signifie que le pod Postgres ne peut pas écrire dans le répertoire du volume persistant dans /var/lib/rancher/k3s/storage/ :

# ls -lh /var/lib/rancher/k3s/storage/ | grep awx-postgres-0
total 0
drwx------ 3 root root      4.0K Jul 29 08:53 pvc-cc5e5d1a-5a48-4f7a-b44e-8404af7ed6a1_awx_postgres-awx-postgres-0

Définir le mode de répertoire à 777

$ chmod -R 777  /var/lib/rancher/k3s/storage/*

Pour relancer le déploiement, il nous suffira de supprimer les pods lié à l'opérateur AWX

$ kubectl delete pods -l "app.kubernetes.io/managed-by=awx-operator"
pod "awx-66c64f8d67-qvfk9" deleted
pod "awx-postgres-0" deleted

On vérifie.

# kubectl get pods -l "app.kubernetes.io/managed-by=awx-operator"
NAME                   READY   STATUS             RESTARTS   AGE
awx-postgres-0         1/1     Running            0          42s
awx-66c64f8d67-4qmh5   4/4     Running            0          42s

Annexe

https://github.com/ansible/awx

https://docs.ansible.com/ansible-tower/latest/html/userguide/projects.html