Як встановити Ansible AWX на Ubuntu 24.04|22.04|20.04

Як встановити Ansible AWX на Ubuntu 24.04|22.04|20.04

 

Ласкаво просимо до сьогоднішнього посібника про те, як встановити Ansible AWX на Ubuntu 24.04|22.04|20.04 за допомогою зворотного проксі-сервера Nginx і додаткового сертифіката Let’s Encrypt SSL. Ansible AWX — це інструмент з відкритим вихідним кодом, який надає веб-інтерфейс користувача, REST API та двигун завдань для легкого та спільного керування Ansible Playbooks та Inventories.

AWX дозволяє централізовано керувати ігровими книгами Ansible, інвентарями, секретами та запланованими завданнями з веб-інтерфейсу. Встановити AWX на систему Ubuntu Linux легко. Скористайтеся наведеними нижче кроками, щоб встановити та налаштувати Ansible AWX на сервері Ubuntu Linux.

Починаючи з версії 18.0 AWX, рекомендований спосіб встановлення – через AWX Operator. Оскільки метод встановлення оператором вимагає Kubernetes Cluster, ми виконаємо встановлення Kubernetes на один вузол Kubernetes на Ubuntu Linux за допомогою k3s.

Мінімальні вимоги до налаштування

  • Сервер Ubuntu 24.04|22.04|20.04 LTS
  • Принаймні 16 ГБ оперативної пам’яті – чим більше, тим краще
  • 4vcpus –  більше, якщо у вас є
  • 20 ГБ  дискового простору
  • root або користувач із sudo для ssh

Крок 1: Оновіть систему Ubuntu

Оновлюйте та модернізуйте свою систему

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

Крок 2: Встановіть єдиний вузол k3s Kubernetes

Ми розгорнемо один вузол kubernetes за допомогою полегшеного інструменту k3s. K3s — це сертифікований дистрибутив Kubernetes, призначений для робочих навантажень виробництва в неконтрольованих середовищах з обмеженими ресурсами. Перевага k3s полягає в тому, що ви можете додати більше вузлів Worker на більш пізньому етапі, якщо виникне така потреба.

K3s надає сценарій встановлення, який є зручним способом встановити його як службу на системах на основі systemd або openrc

Давайте виконаємо наступну команду для встановлення K3s на нашу систему Ubuntu:

curl -sfL https://get.k3s.io | sudo bash -

Висновок процесу монтажу:

[INFO]  Finding release for channel stable
[INFO]  Using v1.27.4+k3s1 as release
[INFO]  Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.27.4+k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.27.4+k3s1/k3s
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[INFO]  Skipping installation of SELinux RPM
[INFO]  Creating /usr/local/bin/kubectl symlink to k3s
[INFO]  Creating /usr/local/bin/crictl symlink to k3s
[INFO]  Creating /usr/local/bin/ctr symlink to k3s
[INFO]  Creating killall script /usr/local/bin/k3s-killall.sh
[INFO]  Creating uninstall script /usr/local/bin/k3s-uninstall.sh
[INFO]  env: Creating environment file /etc/systemd/system/k3s.service.env
[INFO]  systemd: Creating service file /etc/systemd/system/k3s.service
[INFO]  systemd: Enabling k3s unit
Created symlink /etc/systemd/system/multi-user.target.wants/k3s.service → /etc/systemd/system/k3s.service.
[INFO]  systemd: Starting k3s

Файл kubeconfig, що зберігається в, використовується для налаштування доступу до кластера Kubernetes. Ви можете встановити дозволи та встановити глобальний доступ./etc/rancher/k3s/k3s.yamlKUBECONFIG

sudo chmod 644 /etc/rancher/k3s/k3s.yaml
export KUBECONFIG=/etc/rancher/k3s/k3s.yaml
kubectl get pods --all-namespaces

Ви також можете копіювати на комп’ютер, розташований за межами кластера, як ./etc/rancher/k3s/k3s.yaml~/.kube/config

mkdir ~/.kube
sudo cp /etc/rancher/k3s/k3s.yaml ~/.kube/config

Перевірте встановлення K3s:

Наступним кроком буде перевірка нашої установки K3s за допомогою команди kubectl, яка була встановлена і налаштована скриптом інсталятора.

$ kubectl get nodes
NAME    STATUS   ROLES                  AGE   VERSION
jammy   Ready    control-plane,master   81s   v1.27.4+k3s1

Ви також можете підтвердити розгорнуту версію Kubernetes за допомогою наступної команди:

$ kubectl version --short
Client Version: v1.27.4+k3s1
Kustomize Version: v5.0.1
Server Version: v1.27.4+k3s1

Служба K3s буде налаштована на автоматичний перезапуск після перезавантаження вузла або якщо процес вийде з ладу або буде припинено.

Крок 3: Розгорніть AWX Operator на Kubernetes

Цей Kubernetes Operator має бути розгорнутий у вашому Kubernetes кластері, який у нашому випадку працює на K3s. Оператор, якого ми розгорнемо, може керувати одним або кількома екземплярами AWX у будь-якому просторі імен.

Встановіть git та зробіть інструменти:

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

Код розгортання оператора клонування:

$ git clone https://github.com/ansible/awx-operator.git
Cloning into 'awx-operator'...
remote: Enumerating objects: 8773, done.
remote: Counting objects: 100% (1388/1388), done.
remote: Compressing objects: 100% (201/201), done.
remote: Total 8773 (delta 1223), reused 1275 (delta 1184), pack-reused 7385
Receiving objects: 100% (8773/8773), 2.35 MiB | 17.69 MiB/s, done.
Resolving deltas: 100% (5033/5033), done.

Далі ми створюємо простір імен, де буде розгорнуто оператор. Ми назвемо це awx:

export NAMESPACE=awx
kubectl create ns ${NAMESPACE}

Встановіть поточний контекст на значення, встановлене в змінній NAMESPACE:

# kubectl config set-context --current --namespace=$NAMESPACE 
Context "default" modified.

Перейдіть до директорії awx-оператора:

cd awx-operator/

Збережіть останню версію з релізів AWX Operator як змінну RELEASE_TAG, а потім перейдіть до гілки за допомогою git.

sudo apt install curl jq -y
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

Розгорніть AWX Operator у своєму кластері:

export NAMESPACE=awx
make deploy

Вихід команди:

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

Зачекайте кілька хвилин, і awx-оператор повинен запуститися:

# kubectl get pods
NAME                                               READY   STATUS    RESTARTS   AGE
awx-operator-controller-manager-68d787cfbd-z75n4   2/2     Running   0          40s

Як видалити AWX Operator (Не запускайте це, якщо ви не впевнені, що він видаляється!»

Ви завжди можете видалити оператора та всі пов’язані з ним CRD, виконавши команду нижче:

# export NAMESPACE=awx
# make undeploy
/root/awx-operator/bin/kustomize build config/default | kubectl delete -f -
namespace "awx" deleted
customresourcedefinition.apiextensions.k8s.io "awxbackups.awx.ansible.com" deleted
customresourcedefinition.apiextensions.k8s.io "awxrestores.awx.ansible.com" deleted
customresourcedefinition.apiextensions.k8s.io "awxs.awx.ansible.com" deleted
serviceaccount "awx-operator-controller-manager" deleted
role.rbac.authorization.k8s.io "awx-operator-leader-election-role" deleted
role.rbac.authorization.k8s.io "awx-operator-manager-role" deleted
clusterrole.rbac.authorization.k8s.io "awx-operator-metrics-reader" deleted
clusterrole.rbac.authorization.k8s.io "awx-operator-proxy-role" deleted
rolebinding.rbac.authorization.k8s.io "awx-operator-leader-election-rolebinding" deleted
rolebinding.rbac.authorization.k8s.io "awx-operator-manager-rolebinding" deleted
clusterrolebinding.rbac.authorization.k8s.io "awx-operator-proxy-rolebinding" deleted
configmap "awx-operator-manager-config" deleted
service "awx-operator-controller-manager-metrics-service" deleted
deployment.apps "awx-operator-controller-manager" deleted

Крок 4: Встановіть Ansible AWX на Ubuntu за допомогою Operator

Створення статичних даних PVC – збереження даних Ref AWX:

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: 5Gi
EOF

PVC не буде зв’язаний, доки не буде створено капсулу, яка його використовує.

# kubectl get pvc -n awx
NAME                     STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
static-data-pvc          Pending                                      local-path     43s

Тепер давайте створимо файл розгортання AWX з основною інформацією про те, що встановлено:

vim 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

Ми визначили ім’я ресурсу як awx, а тип служби як nodeport, щоб дозволити нам отримати доступ до AWX з IP-адреси вузла та вказаного порту. Ми також додали додаткове фотоелектричне кріплення на блоці веб-сервера.

Застосуйте файл маніфесту конфігурації:

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

Зачекайте кілька хвилин, а потім перевірте розгорнутий екземпляр AWX:

watch kubectl get pods -l "app.kubernetes.io/managed-by=awx-operator"

Після запуску ви можете підтвердити за допомогою таких команд:

$ kubectl get pods -l "app.kubernetes.io/managed-by=awx-operator"
NAME                        READY   STATUS    RESTARTS   AGE
awx-postgres-13-0           1/1     Running   0          7m58s
awx-task-6874d8656b-v75s4   4/4     Running   0          7m10s
awx-web-6c797b8657-sllzt    3/3     Running   0          5m52s

Ви можете відстежувати процес встановлення в журналах подів оператора:

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

Виправлення Postgres Pod у стані CrashLoopBackOff (Пропустити, якщо у вас немає цього повідомлення про помилку)

Перевірте статус PostgreSQL Pod:

$ 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

Перевірте журнали Pod:

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

Це означає, що под Postgres не може записувати в постійний каталог тому всередині /var/lib/rancher/k3s/storage/:

# ls -lh /var/lib/rancher/k3s/storage/ | grep awx-postgres-0
total 0
drwx------ 3 root root 4.0K Aug 24 09:18 pvc-b2acb2d0-6d2f-457b-a40c-390cff5ec6d2_default_postgres-awx-postgres-0

Спробуйте встановити режим каталогу на 777

# chmod -R 777  /var/lib/rancher/k3s/storage/*
# kubectl delete pods -l "app.kubernetes.io/managed-by=awx-operator"
pod "awx-66c64f8d67-qvfk9" deleted
pod "awx-postgres-0" deleted

Контейнерний контейнер Postgres повинен з’явитися за кілька секунд:

# 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            042s

Якщо у вас виникли проблеми із запуском Pods, перевірте журнали розгортання:

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

Стійкість даних

Дані бази даних будуть постійними, оскільки вони зберігаються в постійному обсязі:

$ kubectl get pvc
NAME                            STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
postgres-13-awx-postgres-13-0   Bound    pvc-1ff27783-a9d7-46c0-8160-803615784267   8Gi        RWO            local-path     20m
static-data-pvc                 Bound    pvc-cac663a8-0f9d-4d8e-96a2-4821576fab97   5Gi        RWO            local-path     21m
awx-projects-claim              Bound    pvc-e49c3bd8-79d4-4640-acd1-990578ca27c1   8Gi        RWO            local-path     19m

Томи створюються за допомогою локального шляху-provisioner і шляху хоста

$ ls -1 /var/lib/rancher/k3s/storage/
pvc-1ff27783-a9d7-46c0-8160-803615784267_awx_postgres-13-awx-postgres-13-0
pvc-cac663a8-0f9d-4d8e-96a2-4821576fab97_awx_static-data-pvc
pvc-e49c3bd8-79d4-4640-acd1-990578ca27c1_awx_awx-projects-claim

Перевірка логів AWX Container

У капсулі awx-xxx-yyy буде чотири контейнери, а саме:

  • redis
  • awx-web
  • awx-task
  • awx-ee

Отримайте розгортання:

$ kubectl get deploy
NAME                              READY   UP-TO-DATE   AVAILABLE   AGE
awx-operator-controller-manager   1/1     1            1           22m
awx-task                          1/1     1            1           20m
awx-web                           1/1     1            1           19m

Список Pods:

$ kubectl get pod
NAME                                               READY   STATUS    RESTARTS   AGE
awx-operator-controller-manager-74889d49c8-kch8t   2/2     Running   0          36m
awx-postgres-13-0                                  1/1     Running   0          34m
awx-task-6874d8656b-v75s4                          4/4     Running   0          33m
awx-web-6c797b8657-sllzt                           3/3     Running   0          32m

Список контейнерів у модулі Pod

$ kubectl get pods  awx-web-6c797b8657-sllzt -o jsonpath='{range .spec.containers[*]}{.name}{"\n"}{end}'
redis
awx-web
awx-rsyslog

$ kubectl get pods  awx-postgres-13-0 -o jsonpath='{range .spec.containers[*]}{.name}{"\n"}{end}'
postgres

$ kubectl get pods  awx-task-6874d8656b-v75s4  -o jsonpath='{range .spec.containers[*]}{.name}{"\n"}{end}'
redis
awx-task
awx-ee
awx-rsyslog

$ kubectl get pods  awx-operator-controller-manager-74889d49c8-kch8t  -o jsonpath='{range .spec.containers[*]}{.name}{"\n"}{end}'
kube-rbac-proxy
awx-manager

Для перевірки логів під час розгортання.

# kubectl -n awx  logs deploy/awx-web
Defaulted container "redis" out of: redis, awx-web, awx-rsyslog, init (init), init-projects (init)
1:C 16 Jun 2023 10:26:05.653 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
1:C 16 Jun 2023 10:26:05.653 # Redis version=7.0.11, bits=64, commit=00000000, modified=0, pid=1, just started
1:C 16 Jun 2023 10:26:05.653 # Configuration loaded
1:M 16 Jun 2023 10:26:05.654 * monotonic clock: POSIX clock_gettime
1:M 16 Jun 2023 10:26:05.655 * Running mode=standalone, port=0.
1:M 16 Jun 2023 10:26:05.655 # Server initialized
1:M 16 Jun 2023 10:26:05.655 * The server is now ready to accept connections at /var/run/redis/redis.sock
1:M 16 Jun 2023 10:31:06.022 * 100 changes in 300 seconds. Saving...
1:M 16 Jun 2023 10:31:06.023 * Background saving started by pid 21
21:C 16 Jun 2023 10:31:06.030 * DB saved on disk
21:C 16 Jun 2023 10:31:06.031 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB
1:M 16 Jun 2023 10:31:06.123 * Background saving terminated with success
1:M 16 Jun 2023 10:36:07.077 * 100 changes in 300 seconds. Saving...
1:M 16 Jun 2023 10:36:07.077 * Background saving started by pid 22
22:C 16 Jun 2023 10:36:07.088 * DB saved on disk
22:C 16 Jun 2023 10:36:07.089 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB
1:M 16 Jun 2023 10:36:07.178 * Background saving terminated with success
1:M 16 Jun 2023 10:41:08.027 * 100 changes in 300 seconds. Saving...
1:M 16 Jun 2023 10:41:08.028 * Background saving started by pid 23
23:C 16 Jun 2023 10:41:08.038 * DB saved on disk
23:C 16 Jun 2023 10:41:08.039 * Fork CoW for RDB: current 0 MB, peak 0 MB, average 0 MB
1:M 16 Jun 2023 10:41:08.129 * Background saving terminated with success

Вам потрібно буде вказати назву контейнера після pod:

kubectl -n awx  logs deploy/awx-web -c redis
kubectl -n awx  logs deploy/awx-web -c awx-web
kubectl -n awx  logs deploy/awx-web -c awx-rsyslog

Доступ до оболонки контейнера AWX

Ось як отримати доступ до оболонки кожного контейнера:

kubectl exec -ti deploy/awx-web -c redis -- /bin/bash
kubectl exec -ti deploy/awx-web  -c  awx-web -- /bin/bash
kubectl exec -ti awx-postgres-13-0  -c  postgres -- /bin/bash

Крок 5: Отримайте доступ до інформаційної панелі Ansible AWX

Перерахуйте всі доступні послуги та перевірте awx-service Nodeport

$ kubectl get svc -l "app.kubernetes.io/managed-by=awx-operator"
NAME              TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)        AGE
awx-postgres-13   ClusterIP   None            <none>        5432/TCP       153m
awx-service       NodePort    10.43.179.217   <none>        80:30059/TCP   152m

Ми бачимо, що тип сервісу встановлено на NodePort. Щоб отримати доступ до нашого сервісу з-за меж кластера Kubernetes за допомогою IP-адреси вузла k3s та порту вузла

http://hostip_or_hostname:30080

Ви можете відредагувати порт вузла та встановити фігуру за своїми уподобаннями, але вона повинна бути в діапазоні 30000-32768

Після входу на веб-портал AWX вам буде представлена інформаційна панель привітання, подібна до тієї, що наведена нижче.

Як встановити Ansible AWX на Ubuntu 24.04

Ім’я користувача для входу – admin

Отримайте пароль користувача адміністратора, розшифрувавши секрет зі значенням пароля:

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

Кращий формат виведення:

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

Вхід за допомогою імені адміністратора та розшифрованого пароля:

Як встановити Ansible AWX на Ubuntu 24.04

Новий інтерфейс AWX чудово оформлений з любов’ю. Це серйозний редизайн з хорошим поліруванням.

Як встановити Ansible AWX на Ubuntu 24.04

У наступних статтях ми розглянемо адміністрування та використання Ansible AWX у повторюваних завданнях інфраструктури автоматизації.

Перегляньте ресурси Kubernetes Node, щоб переконатися, що їх достатньо для роботи AWX:

$ kubectl top nodes --use-protocol-buffers
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
ubuntu   102m         1%     2534Mi          15%
Прокрутка до верху