AWX配置持久化 Playbook 目录
引言
AWX 是 Ansible Tower 的开源版本,提供了强大的自动化任务管理和 Web 界面,特别适合网络设备管理、服务器运维等场景。在 Minikube 上部署 AWX 可以快速搭建一个轻量级的 Kubernetes 测试环境,方便开发和调试。本文详细介绍如何在 Ubuntu 22.04 上使用 Minikube(v1.35.0,Docker 驱动)和 AWX Operator 2.19.0 部署 AWX,通过 hostPath 卷实现 Playbook 目录的持久化存储,并指导如何新增 Playbook 目录以扩展自动化任务。
本文基于一个经过验证的 AWX 配置,确保 Playbook 目录(如 /var/lib/awx/projects/my_playbooks)能在 AWX 界面正确加载。
AWX部署链接:AWX+Ansible 自动化运维:快速部署_ansible awx-CSDN博客
前提条件
- 操作系统:Ubuntu 22.04
- Minikube:v1.35.0,配置为 Docker 驱动
- kubectl:已安装并配置好,可与 Minikube 交互
- AWX Operator:2.19.0 版本,已部署在 ansible-awx 命名空间
- 硬件要求:Minikube 分配至少 6GB 内存和 5 个 CPU 核心
- 权限:具有 sudo 权限,用于管理 Minikube 虚拟机和文件权限
部署步骤
步骤 1:启动 Minikube 集群
确保 Minikube 集群正常运行,为 AWX 部署提供 Kubernetes 环境。
minikube status
解释:此命令检查 Minikube 集群的运行状态。如果集群未启动,输出会提示集群已停止或未配置。
如果集群未运行,启动 Minikube 并分配足够资源:
minikube start --driver=docker --memory=6144 --cpus=5
解释:该命令使用 Docker 驱动启动 Minikube 集群,分配 6GB 内存和 5 个 CPU 核心,以满足 AWX 的资源需求。启动后,集群运行 Kubernetes v1.32.0,kubectl 自动配置为使用 Minikube 集群。
预期输出:
步骤 2:配置 AWX 部署
使用 hostPath 卷配置 AWX,实现 Playbook 目录的持久化存储。
创建或编辑 AWX 配置文件:
nano ~/awx-operator-2.19.0/awx-ubuntu.yml
解释:此命令打开 nano 编辑器,用于创建或修改 AWX 自定义资源(CR)配置文件,定义 AWX 部署的详细参数。
确保文件内容如下:
---
apiVersion: awx.ansible.com/v1beta1
kind: AWX
metadata:name: awx-ubuntunamespace: ansible-awx
spec:service_type: NodePortimage_pull_policy: IfNotPresentprojects_persistence: falseextra_volumes: |- name: projectshostPath:path: /var/lib/awx/projectstype: Directoryweb_extra_volume_mounts: |- mountPath: /var/lib/awx/projectsname: projectstask_extra_volume_mounts: |- mountPath: /var/lib/awx/projectsname: projectsweb_resource_requirements:requests:cpu: 50mmemory: 128Mitask_resource_requirements:requests:cpu: 150mmemory: 384Miee_resource_requirements:requests:cpu: 150mmemory: 192Mi
解释:此 YAML 文件定义了名为 awx-ubuntu 的 AWX 资源,位于 ansible-awx 命名空间。主要配置包括:
- service_type: NodePort:通过 NodePort 暴露 AWX Web 界面。
- image_pull_policy: IfNotPresent:优先使用本地缓存的容器镜像,减少拉取时间。
- projects_persistence: false:禁用 PVC,使用 hostPath 存储 Playbook。
- extra_volumes:定义名为 projects 的 hostPath 卷,映射到 Minikube 节点的 /var/lib/awx/projects 目录。
- web_extra_volume_mounts 和 task_extra_volume_mounts:将 projects 卷挂载到 web 和 task pod 的 /var/lib/awx/projects 路径。
- 资源请求为 web、task 和执行环境(EE) pod 设置最低 CPU 和内存需求。
保存并退出(Ctrl+O,Enter,Ctrl+X)。
检查 Playbook 目录权限:
minikube ssh
ls -ld /var/lib/awx/projects
解释:此命令进入 Minikube 虚拟机,检查 /var/lib/awx/projects 目录是否存在及其权限状态。
drwxrwxrwx 3 docker 1000 4096 Apr 25 07:52 /var/lib/awx/projects
如果目录不存在或权限不正确,创建并配置:
sudo mkdir -p /var/lib/awx/projects
sudo chmod 777 /var/lib/awx/projects
sudo chown 1000:1000 /var/lib/awx/projects
exit
解释:
- sudo mkdir -p /var/lib/awx/projects:创建 Playbook 目录(包括父目录),如果不存在。
- sudo chmod 777 /var/lib/awx/projects:设置目录权限为所有人可读写执行,确保 AWX 访问无障碍。
- sudo chown 1000:1000 /var/lib/awx/projects:将目录所有者设置为 UID 1000(AWX 的 awx 用户),确保 pod 能正常访问。
- exit:退出 Minikube 虚拟机,返回主机。
验证 YAML 语法:
kubectl apply -f ~/awx-operator-2.19.0/awx-ubuntu.yml --dry-run=client
解释:此命令执行 kubectl apply 的客户端干运行,检查 YAML 文件语法是否正确,不实际应用更改。
预期输出:
awx.awx.ansible.com/awx-ubuntu configured (dry run)
应用 AWX 配置:
kubectl apply -f ~/awx-operator-2.19.0/awx-ubuntu.yml -n ansible-awx
解释:此命令将 AWX 配置应用到 ansible-awx 命名空间,创建或更新 AWX 部署。
预期输出:
awx.awx.ansible.com/awx-ubuntu configured
再次检查目录权限:
minikube ssh
ls -ld /var/lib/awx/projects
sudo chmod 777 /var/lib/awx/projects
sudo chown 1000:1000 /var/lib/awx/projects
exit
解释:此步骤确保应用配置后 /var/lib/awx/projects 目录权限未被重置,保持 AWX pod 的访问能力。
步骤 3:重启 AWX Pod
重启 AWX 的 task 和 web pod,确保新配置和 hostPath 卷挂载生效。
列出当前 pod:
kubectl get pods -n ansible-awx
解释:此命令列出 ansible-awx 命名空间中的所有 pod,方便识别 AWX 的 task 和 web pod(例如 awx-ubuntu-task-<hash> 和 awx-ubuntu-web-<hash>)。
预期输出:
删除 task 和 web pod:
kubectl delete pod -n ansible-awx awx-ubuntu-task-6cf54bb9f7-<hash> awx-ubuntu-web-556774d489-<hash>
解释:此命令删除指定的 task 和 web pod,触发 Kubernetes 自动创建新 pod,应用最新配置。需将 <hash> 替换为实际 pod 名称(例如 k4wrh、p5cjj)。
预期输出:
pod "awx-ubuntu-task-6cf54bb9f7-<hash>" deleted
pod "awx-ubuntu-web-556774d489-<hash>" deleted
等待新 pod 启动:
kubectl get pods -n ansible-awx
解释:此命令检查新 pod 是否已启动并运行,确保 task 和 web pod 状态为 Running。
预期输出:
再次验证目录权限:
minikube ssh
ls -ld /var/lib/awx/projects
sudo chmod 777 /var/lib/awx/projects
sudo chown 1000:1000 /var/lib/awx/projects
exit
解释:此步骤确保 pod 重启后 /var/lib/awx/projects 目录权限正确,防止挂载失败。
步骤 4:配置端口转发
设置端口转发,以便通过浏览器访问 AWX Web 界面。
获取当前 web pod 名称:
kubectl get pods -n ansible-awx | grep awx-ubuntu-web
解释:此命令过滤 ansible-awx 命名空间中的 pod,显示最新的 awx-ubuntu-web pod 名称,用于端口转发。
预期输出:
awx-ubuntu-web-556774d489-<new-hash> 3/3 Running 0 10s
配置端口转发:
nohup kubectl port-forward awx-ubuntu-web-556774d489-<new-hash> 8052:8052 -n ansible-awx --address 0.0.0.0 &
解释:此命令在后台运行 kubectl port-forward,将 web pod 的 8052 端口映射到主机的 8052 端口,允许外部访问 AWX 界面。nohup 确保进程在终端关闭后继续运行,--address 0.0.0.0 允许所有网络接口访问。需将 <new-hash> 替换为实际 pod 名称。
预期输出:
[1] <进程ID>
nohup: ignoring input and appending output to 'nohup.out'
验证端口转发:
cat nohup.out
解释:此命令显示 nohup.out 文件内容,确认端口转发是否正常工作。输出应包含 Forwarding 信息。
预期输出:
Forwarding from 0.0.0.0:8052 -> 8052
获取 AWX 管理员密码:
kubectl get secret awx-ubuntu-admin-password -n ansible-awx -o jsonpath="{.data.password}" | base64 -d
解释:此命令从 awx-ubuntu-admin-password Secret 中提取 AWX 管理员密码,解码后显示,用于登录 AWX 界面。
示例输出:
praymwaE6t9I1Bh7kcGvqGxJ2JXlhy9Q
步骤 5:创建初始 Playbook 文件
在 Minikube 节点创建 Playbook 文件,通过 hostPath 卷挂载到 AWX pod。
进入 Minikube 虚拟机:
minikube ssh
解释:此命令登录 Minikube 虚拟机,允许直接操作节点上的文件系统。
创建 Playbook 目录和文件,这里已我写的获取交换机全部配置的文件举例:
sudo mkdir -p /var/lib/awx/projects/my_playbooks/outputs
sudo tee /var/lib/awx/projects/my_playbooks/get_h3c_config.yml > /dev/null <<EOF
---
- name: Get H3C device configurationhosts: h3c_devicegather_facts: notasks:- name: Run display current-configuration commandansible.builtin.command: "display current-configuration"register: config_outputdelegate_to: "{{ inventory_hostname }}"connection: network_clivars:ansible_network_os: h3c- name: Save configuration to fileansible.builtin.copy:content: "{{ config_output.stdout }}"dest: "/var/lib/awx/projects/my_playbooks/outputs/h3c_config_{{ inventory_hostname }}.txt"delegate_to: localhost
EOF
sudo chown -R 1000:1000 /var/lib/awx/projects
sudo chmod -R 755 /var/lib/awx/projects
解释:
- sudo mkdir -p /var/lib/awx/projects/my_playbooks/outputs:创建 Playbook 目录及其子目录 outputs,用于存储输出文件。
- sudo tee ... > /dev/null:创建 get_h3c_config.yml Playbook 文件,配置华三设备的配置获取任务。
- sudo chown -R 1000:1000 /var/lib/awx/projects:设置目录及文件的所有者为 UID 1000(AWX 用户)。
- sudo chmod -R 755 /var/lib/awx/projects:设置目录权限为所有者可读写执行,其他用户可读执行。
创建另一个 Playbook 文件:
sudo tee /var/lib/awx/projects/my_playbooks/new_playbook.yml > /dev/null <<EOF
---
- name: New Playbookhosts: localhosttasks:- name: Print messageansible.builtin.debug:msg: "This is a new playbook"
EOF
sudo chown -R 1000:1000 /var/lib/awx/projects
sudo chmod -R 755 /var/lib/awx/projects
解释:创建 new_playbook.yml,一个简单的 Playbook 用于调试,输出一条消息。权限和所有者设置与上一步相同。
验证文件:
ls -l /var/lib/awx/projects/my_playbooks
解释:列出 my_playbooks 目录内容,确认 Playbook 文件及其权限正确。
预期输出:
退出 Minikube 虚拟机:
exit
解释:退出 Minikube 虚拟机,返回主机终端。
步骤 6:验证 AWX Pod 中的 Playbook 文件
确认 AWX 的 task pod 能通过 hostPath 卷访问 Playbook 文件。
获取 task pod 名称:
kubectl get pods -n ansible-awx
解释:列出 ansible-awx 命名空间中的 pod,找出 awx-ubuntu-task-<hash> 的名称。
检查 pod 内 Playbook 目录:
kubectl exec -n ansible-awx awx-ubuntu-task-6cf54bb9f7-<new-hash> -- ls -l /var/lib/awx/projects/my_playbooks
解释:此命令在 task pod 中执行 ls -l,列出 /var/lib/awx/projects/my_playbooks 目录内容,验证 hostPath 挂载是否生效。需将 <new-hash> 替换为实际 pod 名称。
预期输出:
验证 pod 挂载配置:
kubectl describe pod -n ansible-awx awx-ubuntu-task-6cf54bb9f7-<new-hash>
解释:此命令显示 task pod 的详细信息,检查 awx-ubuntu-projects 卷是否为 hostPath 类型,确认挂载正确。
预期输出(部分):
awx-ubuntu-projects:Type: HostPath (bare host directory volume)Path: /var/lib/awx/projectsHostPathType: Directory
步骤 7: AWX查看效果