Як встановити 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.yaml
KUBECONFIG
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 вам буде представлена інформаційна панель привітання, подібна до тієї, що наведена нижче.
Ім’я користувача для входу – 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}}'
Вхід за допомогою імені адміністратора та розшифрованого пароля:
Новий інтерфейс AWX чудово оформлений з любов’ю. Це серйозний редизайн з хорошим поліруванням.
У наступних статтях ми розглянемо адміністрування та використання Ansible AWX у повторюваних завданнях інфраструктури автоматизації.
Перегляньте ресурси Kubernetes Node, щоб переконатися, що їх достатньо для роботи AWX:
$ kubectl top nodes --use-protocol-buffers
NAME CPU(cores) CPU% MEMORY(bytes) MEMORY%
ubuntu 102m 1% 2534Mi 15%