DevOPS CI/CD Kubernetes

Hướng dẫn cài đặt Ansible Server (AWX)

1. Mở đầu

Chào mừng bạn đến bài viết hướng dẫn về cách cài đặt Ansible AWX trên Ubuntu 20.04|18.04 với Nginx Reverse Proxy và sử dụng mã hóa Let’s Encrypt SSL Certificate. Ansible AWX là một chương trình mã nguồn mở, cung cấp tính năng giao diện web interface, REST API, và giúp các kỹ sư quản lý các task của  Ansible Playbook dễ dàng hơn. 

AWX cho phép bạn quản lý tập trung các Ansible playbook, inventories, Secrets, các scheduled job từ giao diện web. Nó khá dễ dàng để cài đặt trên Ubuntu 20.04|18.04 (Bionic Beaver). Tiếp theo đây, chúng tôi sẽ chia sẻ các bước để có thể cài đặt và cấu hình Ansible AWX  trên server Ubuntu 20.04|18.04 . 

Để bắt đầu với AWX phiên bản 18.0, chúng tôi khuyên bạn nên cài thông qua AWX Operator. Với Operator này, nó yêu cầu bạn cần phải có một Kubernetes Cluster, chúng tôi sẽ hướng dẫn bạn tạo một cluster kubernetes ( k8s ) với single Node với  k3s.

2. Yêu Cầu

  • Ubuntu 20.04|18.04 LTS Server
  • tối thiểu 8GB of RAM 
  • tối thiểu 4 cpu
  • 10GB free disk storage
  • có quyền root hoặc  quyền sudo 

3. Cài Đặt

Bước 1: Cập nhật hệ thống ubuntu

Update và upgrade hệ thống

sudo apt update && sudo apt -y upgrade
sudo reboot

Bước 2: Cài đặt Single Node k3s Kubernete

Chúng ta sẽ deploy single node kubernetes  với tool k3s. K3s là một tool hỗ trợ để triển khai môi trường K8s trên môi trường Production, nó có ưu điểm là chúng ta có thể thêm/bớt các Worker node một cách dễ dàng và nhanh chóng.

K3s cung cấp một scritps hỗ trợ việc cài đặt, rất tiện lợi. 

Chạy câu lệnh sau để tiến hành cài đặt K3s trên ubuntu:

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

Quá  trình cài đặt bắt đầu: 

[INFO]  Finding release for channel stable
[INFO]  Using v1.21.3+k3s1 as release
[INFO]  Downloading hash https://github.com/k3s-io/k3s/releases/download/v1.21.3+k3s1/sha256sum-amd64.txt
[INFO]  Downloading binary https://github.com/k3s-io/k3s/releases/download/v1.21.3+k3s1/k3s
[INFO]  Verifying binary download
[INFO]  Installing k3s to /usr/local/bin/k3s
[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

Xác nhận cài đặt K3s 

Tiếp theo,  ta sẽ kiểm tra lại xem việc cài đặt K3s có thành công hay không bằng việc sử dụng câu lệnh kubectl 

$ kubectl get nodes
NAME     STATUS   ROLES                  AGE   VERSION
ubuntu   Ready    control-plane,master   33s   v1.21.3+k3s1

Chúng ta cũng kiểm tra luôn phiên bản của Kubernetes với câu lệnh:

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

K3s service sẽ được cấu hình tự động restart khi node reboot hoặc process bị crash hoặc bị kill. 

Bước 3: Deploy AWX Operator trên Kubernetes ( K8s )

Kubernetes Operator  này được deploy lên Kubernetes cluster, dùng để quản lý một hoặc nhiều AWX instance trên toàn bộ namespace. 

Kiểm tra trạng thái các pods đang running

$ kubectl get pods -A
NAMESPACE     NAME                                      READY   STATUS      RESTARTS   AGE
kube-system   metrics-server-86cbb8457f-8kk5w           1/1     Running     0          5m4s
kube-system   local-path-provisioner-5ff76fc89d-jwmc7   1/1     Running     0          5m4s
kube-system   coredns-7448499f4d-bk4r7                  1/1     Running     0          5m4s
kube-system   helm-install-traefik-crd-mm782            0/1     Completed   0          5m4s
kube-system   helm-install-traefik-zbwwl                0/1     Completed   1          5m4s
kube-system   svclb-traefik-k7kjh                       2/2     Running     0          4m52s
kube-system   traefik-97b44b794-hdlfg                   1/1     Running     0          4m52s

Chạy câu lệnh sau để deploy AWX Operator vào cluster: 

kubectl apply -f https://raw.githubusercontent.com/ansible/awx-operator/devel/deploy/awx-operator.yaml

Command output:

customresourcedefinition.apiextensions.k8s.io/awxs.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxbackups.awx.ansible.com created
customresourcedefinition.apiextensions.k8s.io/awxrestores.awx.ansible.com created
clusterrole.rbac.authorization.k8s.io/awx-operator created
clusterrolebinding.rbac.authorization.k8s.io/awx-operator created
serviceaccount/awx-operator created
deployment.apps/awx-operator created

Đợi một vài phút, bạn sẽ thấy pods awx-operator  ở trạng thái running: 

$ kubectl get pods
NAME                            READY   STATUS    RESTARTS   AGE
awx-operator-545497f7d5-dgjs8   1/1     Running   0          84s

Bước 4: Cài đặt Ansible AWX trên Ubuntu 20.04/18.04 sử dụng Operator 

Tạo một PersistentVolumeClaim (PVC) để lưu trữ dữ liệu : Tham khảo AWX data persistence:

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

Tiếp đến, tạo một file AWX deployment với các thông tin cơ bản như sau: 

vim awx-deploy.yml

Paste các nội dung sau vào file:

---
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/awx/public
  extra_volumes: |
    - name: static-data
      persistentVolumeClaim:
        claimName: static-data-pvc

Chúng ta vừa định nghĩa resource name là awx và service type là NodePort để có thể truy cập được dịch vụ, bạn có thể tìm hiểu thêm cách tạo Ingress cho K8s tại đây. 

Apply file  cấu hình: 

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

Đợi một vài phút, vầ kiểm tra trạng thái AWX:

$ kubectl get pods -l "app.kubernetes.io/managed-by=awx-operator"
NAME                   READY   STATUS    RESTARTS   AGE
awx-postgres-0         1/1     Running   0          75s
awx-7c5d846c88-mjlvm   4/4     Running   0          64s

Fix Postgres Pod báo lỗi CrashLoopBackOff

Kiểu tra trạng thái của 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

Kiểm tra Logs của Pod:

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

Điều này có nghĩa là Pod của Postgres không có quyền để ghi vào persistent volume: /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

Set quyền   777  cho thư mục

# 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

Đợi vài giây và kiểm tra lại Postgres container pod sẽ thấy running:

# 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

Bạn cũng có thể kiểm tra logs của Pods bằng cách sau: 

$ kubectl logs -f deployments/awx-operator

Như vậy, dữ liệu trong database  sẽ được lưu trữ lâu dài trong persistent volume mà ta đã tạo từ trước: 

$ kubectl get pvc
NAME                      STATUS   VOLUME                                     CAPACITY   ACCESS MODES   STORAGECLASS   AGE
postgres-awx-postgres-0   Bound    pvc-c0149545-8631-4aa1-a03f-2134a7f42aa6   8Gi        RWO            local-path     84s
static-data-pvc           Bound    pvc-6b6005de-0888-4634-b0a2-d5cc92eb85cc   1Gi        RWO            local-path     2m10s
awx-projects-claim        Bound    pvc-91e751e9-0e8e-40c8-9953-f8d9db5f612b   8Gi        RWO            local-path     77s

kiểm tra thử volume local-path-provisioner  và host path: 

$ ls /var/lib/rancher/k3s/storage/
pvc-edb29795-7dae-4a00-805f-2d989694fe3d_default_postgres-awx-postgres-0

Bước 5: Truy cập Ansible AWX Dashboard

List ra tất cả service đang chạy và kiểm tra port Nodeport của awx-service

$ kubectl get svc -l "app.kubernetes.io/managed-by=awx-operator"
NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
awx-postgres   ClusterIP   None           <none>        5432/TCP       2m5s
awx-service    NodePort    10.43.182.53   <none>        80:32708/TCP   116s

Bạn có thể chỉnh sửa Node Port nhưng lưu ý giá trị của port phải lớn hơn ( >= )  32000

$ kubectl edit svc awx-service
....
ports:
  - name: http
    nodePort: 32000
    port: 80
    protocol: TCP
    targetPort: 8052

Xác nhận lại thay đổi:

$ kubectl get svc -l "app.kubernetes.io/managed-by=awx-operator"
NAME           TYPE        CLUSTER-IP     EXTERNAL-IP   PORT(S)        AGE
awx-postgres   ClusterIP   None           <none>        5432/TCP       8m58s
awx-service    NodePort    10.43.182.53   <none>        80:32000/TCP   8m49s

Ansible AWX web portal giờ đã sẵn sàng truy cập tại: http://hostip_or_hostname:32000

Đăng nhập với usernameadmin

Để lấy password admin, chúng ta sẽ làm như sau: 

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

Hoặc định dạng lại output: 

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

Sau khi lấy được password, ta tiến hành đăng nhập: 

Giao diện mới của AWX được thiết kế khá bắt mắt 😀 

Review lại tài nguyên của Kubernetes Node, để đảm bảo là nó đủ để chạy AWX: 

$ kubectl top nodes --use-protocol-buffers
NAME     CPU(cores)   CPU%   MEMORY(bytes)   MEMORY%
ubuntu   102m         1%     2534Mi          15%

 

4. Kết bài

Như vậy, chúng ta vừa đi qua các bước để có thể cài đặt và cấu hình AWX, một  chương trình giúp các kỹ sư quản lý dễ dàng, linh hoạt hơn các task của Ansible. 

Chúc các bạn thành công !

      Nguồn:                  

congdonglinux.com

                   Nhấn Subcribe                    Like Facebook 

 

 

close

Đăng Ký Liền Tay

Nhận Ngay Bài Viết

We don’t spam! Read our privacy policy for more info.

Add Comment

Click here to post a comment