Installation de AWX / Ansible

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 :

6 thoughts on “Installation de AWX / Ansible”

  1. Bonjour,
    Merci beacoup pour ce tutorial.
    Je vais essayer d’installer awx operator version 0.30.0 dans un cluster K8S sour rancher en suivant cet exemple.

    Merciiiiiiiiiiiiiiiiiii

  2. Bonjour,
    j’ai bien suivi le modele pour installer awx tag 0.30.0
    la dernière étape où j’ai un prob.

    Je n’ai pas compris la commande:

  3. c’est bon, en fait, moi j’ai utilisé un cluster k8s géré par rancher.
    Le prob que j’ai est comment recupérer l’adresse ip affectée par le Loadbalancer derrière

  4. comment peut on scaler independammenet les deployments task et web faisant partie de awx operator ?

  5. est ce qu’il y a un moyen d’executer des commandes en mode sudo à l’intérieur du pod web et task. j’ai besoin d’installer le package 7z afin de l’utiliser dans mon playbook.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.