第309篇:AWX/Tower 可视化管理平台
关键词
AWX、Ansible Tower、可视化管理、自动化平台、Job Template、工作流、RBAC、网络自动化平台
一、AWX/Tower 简介
1.1 为什么需要管理平台
从 CLI 到平台的演进:
CLI 模式(ad-hoc/Playbook):
┌─ 工程师在终端执行命令
├─ 无访问控制(谁都能跑)
├─ 无审计记录(谁在何时做了什么)
├─ 无调度(手动触发)
└─ 无可视化(结果靠终端输出)
平台模式(AWX/Tower):
┌─ Web 界面操作
├─ RBAC 权限控制
├─ 完整审计日志
├─ 定时调度
├─ 可视化结果展示
├─ REST API 集成
└─ 团队协作
AWX 与 Tower 的关系:
┌─ AWX:Ansible 开源免费版(Red Hat 维护)
├─ Tower:AWX 的企业商业版(Red Hat Ansible Automation Platform)
├─ AWX 是 Tower 的上游项目
└─ 功能基本一致(Tower 有商业支持)
1.2 AWX 架构
AWX 组件架构:
| Web UI(Django + Angular) ▼ REST API(Django REST Framework) ▼ ┌────────────────────────────────────┐ └────────────────────────────────────┘ ▼ ┌────────────────────────────────────┐ └────────────────────────────────────┘ ▼ ┌────────────────────────────────────┐ └────────────────────────────────────┘ ▼ ▼ ▼ ┌──────┐ ┌──────┐ ┌──────┐ | AWX 服务 ┌──────┐ ┌──────┐ ┌───────────┐ └──────┘ └──────┘ └───────────┘ PostgreSQL(数据库) Ansible Runner(任务执行) ┌────┬────┬────┬────┬────┐ └────┴────┴────┴────┴────┘ 华为 | Job Template ISO | NXOS 思科 | Inventory Manager VRP | JunOS Juniper | Credential Manager ... | ||
|---|---|---|---|---|---|---|---|---|
1.3 安装方式
# 方式 1:Docker Compose 部署(推荐快速体验)
git clone https://github.com/ansible/awx.git
cd awx/tools/docker-compose/
# 编辑 inventory 文件设置密码
make docker-compose
# 方式 2:Kubernetes 部署(生产推荐)
# 使用 AWX Operator
kubectl apply -f https://raw.githubusercontent.com/ansible/awx-operator/devel/deploy/awx-operator.yaml
# 访问 AWX
# URL: http://localhost:8080
# 默认用户: admin
# 默认密码: 在 make docker-compose 时设置
二、AWX 核心概念
2.1 核心对象
AWX 的核心管理对象:
1. Organization(组织)
┌─ 顶层实体
├─ 包含 Teams、Users、Projects、Inventories
├─ 实现多租户隔离
└─ 例如:网络部、安全部
2. Team(团队)
┌─ 用户组
├─ 简化权限分配
└─ 例如:核心网团队、接入网团队
3. User(用户)
┌─ 本地账户或 LDAP 认证
├─ 分配角色权限
└─ 角色:Admin/Executor/Viewer
4. Credential(凭证)
┌─ SSH 密码/密钥
├─ Vault 密码
├─ 云平台 API Key
└─ 凭证可绑定到 Job Template
5. Inventory(清单)
┌─ 设备分组管理
├─ 支持手动/动态 Inventory
├─ 变量定义
└─ 可导入 Ansible Inventory 文件
6. Project(项目)
┌─ Playbook 源码管理
├─ 支持 Git/SVN
├─ 自动同步
└─ 版本管理
7. Job Template(作业模板)
┌─ 绑定 Inventory + Project + Credential
├─ 定义执行参数
├─ 支持额外变量
└─ 一次定义,多次执行
8. Workflow(工作流)
┌─ 多个 Job Template 编排
├─ 支持条件/并行/循环
└─ 实现复杂自动化流程
2.2 创建核心配置流程
# 通过 AWX API 创建资源的示例
# 1. 创建凭证
POST /api/v2/credentials/
{
"name": "Network SSH Credential",
"organization": 1,
"credential_type": 1, # Machine
"inputs": {
"username": "admin",
"password": "{{ vault_password }}"
}
}
# 2. 创建 Inventory
POST /api/v2/inventories/
{
"name": "Network Devices",
"organization": 1,
"variables": {
"ntp_server": "203.0.113.1",
"snmp_location": "Beijing-DC"
}
}
# 3. 创建 Job Template
POST /api/v2/job_templates/
{
"name": "Backup Network Config",
"project": 1,
"playbook": "playbooks/backup_config.yml",
"inventory": 1,
"credential": 1,
"job_type": "run",
"ask_variables_on_launch": false
}
三、AWX 网络自动化实战
3.1 配置 AWX 管理网络设备
Web UI 操作步骤:
Step 1: 创建 Organization
└─ Organizations → ADD → "Network-Team"
Step 2: 创建 Credential
└─ Credentials → ADD
├─ Name: "Huawei-SSH"
├─ Credential Type: Machine
├─ Username: admin
├─ Password: ****
└─ Privilege Escalation: 不需要
Step 3: 创建 Inventory
└─ Inventories → ADD → "Network-Prod"
├─ 手动添加主机
│ └─ HOSTS → ADD
│ ├─ Name: CORE-SW01
│ └─ Variables:
│ ansible_host: 10.0.0.1
│ ansible_network_os: huawei.vrp.vrp
└─ 或从文件导入
Step 4: 创建 Project
└─ Projects → ADD
├─ Name: "Network-Playbooks"
├─ SCM Type: Git
├─ SCM URL: https://git.corp.com/network/playbooks.git
└─ Update Revision: 自动
Step 5: 创建 Job Template
└─ Templates → ADD → Job Template
├─ Name: "Backup-All-Configs"
├─ Job Type: Run
├─ Inventory: Network-Prod
├─ Project: Network-Playbooks
├─ Playbook: playbooks/backup_config.yml
├─ Credential: Huawei-SSH
└─ Extra Variables: {}
3.2 编写适配 AWX 的 Playbook
# playbooks/awx_backup_config.yml
---
# 适配 AWX 的 Playbook
# 支持 AWX 的 Survey、Extra Variables、Callback 通知
- name: 网络配置备份(AWX 优化版)
hosts: all
gather_facts: no
vars:
# 默认值,可由 AWX Survey 覆盖
backup_dir: "/tmp/awx_config_backup"
notify_on_failure: true
max_backup_age_days: 30
tasks:
- name: 创建备份目录
delegate_to: localhost
file:
path: "{{ backup_dir }}/{{ ansible_date_time.date }}"
state: directory
- name: 获取设备配置
huawei.vrp.vrp_command:
commands: display current-configuration
register: config
ignore_errors: yes
- name: 保存配置到本地
delegate_to: localhost
copy:
content: "{{ config.stdout[0] }}"
dest: "{{ backup_dir }}/{{ ansible_date_time.date }}/{{ inventory_hostname }}_running.cfg"
when: config is success
- name: 记录备份结果
delegate_to: localhost
lineinfile:
path: "{{ backup_dir }}/backup_log.csv"
line: "{{ ansible_date_time.iso8601 }},{{ inventory_hostname }},{{ 'OK' if config is success else 'FAIL' }}"
create: yes
when: notify_on_failure
- name: 生成 AWX 自定义回调数据
set_fact:
awx_result:
host: "{{ inventory_hostname }}"
status: "{{ 'success' if config is success else 'failed' }}"
timestamp: "{{ ansible_date_time.iso8601 }}"
3.3 使用 Survey 变量
# AWX Survey 配置(Web UI 中配置,非 YAML)
# Survey 定义:
# ┌──────────────────────────────────────────┐
# │ 问题 类型 │
# ├──────────────────────────────────────────┤
# │ 备份目录路径(默认:/backup) Text │
# │ 是否发送通知(默认:是) Multiple │
# │ 保留天数(默认:30) Integer │
# │ 目标设备组(默认:all) Multiple │
# └──────────────────────────────────────────┘
# 用户启动 Job 时填写这些变量
# Playbook 中通过 {{ backup_dir }} 等获取
3.4 定时调度
# AWX Schedule 配置(在 Job Template 中设置)
# 每天凌晨 2:00 执行配置备份
Schedule:
Name: "Daily-Backup-2AM"
Start: "2025-01-01 02:00:00"
Frequency:
- Day: "Mon-Sun"
- Time: "02:00"
Timezone: "Asia/Shanghai"
# 每周日凌晨 3:00 执行合规检查
Schedule:
Name: "Weekly-Compliance-Sunday-3AM"
Start: "2025-01-05 03:00:00"
Frequency:
- Day: "Sun"
- Time: "03:00"
四、工作流(Workflow)
4.1 网络变更工作流
# AWX Workflow(在 Web UI 中可视化配置)
# 网络配置变更工作流:
#
# ┌──────────────────────────────────────────┐
# │ [Start] │
# │ │ │
# │ ▼ │
# │ ┌────────────────────┐ │
# │ │ Step 1: 配置备份 │ │
# │ │ Template: Backup │ │
# │ └────────┬───────────┘ │
# │ │ │
# │ ▼ │
# │ ┌────────────────────┐ │
# │ │ Step 2: 配置变更 │ │
# │ │ Template: Deploy │ │
# │ │ (需要审批) │ │
# │ └────────┬───────────┘ │
# │ │ │
# │ ┌─────┴─────┐ │
# │ ▼ ▼ │
# │ ┌────────┐ ┌────────┐ │
# │ │成功: │ │失败: │ │
# │ │Step 3a │ │Step 3b │ │
# │ │验证配置 │ │自动回滚│ │
# │ └───┬────┘ └───┬────┘ │
# │ │ │ │
# │ ▼ ▼ │
# │ ┌────────┐ ┌────────┐ │
# │ │Step 4a │ │Step 4b │ │
# │ │发送通知 │ │告警通知│ │
# │ └────────┘ └────────┘ │
# │ │ │ │
# │ └────┬─────┘ │
# │ ▼ │
# │ ┌────────────────────┐ │
# │ │ [End] │ │
# │ └────────────────────┘ │
# └──────────────────────────────────────────┘
4.2 创建 Workflow 的步骤
# AWX Web UI 中创建工作流
# 1. 创建 Workflow Template
# Templates → ADD → Workflow Template
# Name: "Network-Change-Workflow"
# Organization: Network-Team
# 2. 添加工作流节点
# WORKFLOW VISUALIZER → START
# 节点 1: Backup
# Template: Backup-All-Configs
# Success → 节点 2
# Failure → 发送告警
# 节点 2: 人工审批
# Template: Approval-Node
# Approver: network-admin@corp.com
# Timeout: 30 分钟
# Approved → 节点 3
# Denied → 发送通知
# 节点 3: Deploy Config
# Template: Deploy-VLAN-Config
# Success → 节点 4a
# Failure → 节点 4b
# 节点 4a: Verify Config
# Template: Verify-Config
# Success → 节点 5
# Failure → 节点 4b
# 节点 4b: Rollback
# Template: Rollback-Config
# 节点 5: Notify
# Template: Send-Notification
# 发送邮件给网络团队
五、AWX API 集成
5.1 通过 API 触发任务
#!/usr/bin/env python3
# awx_api_client.py — AWX API 客户端
import requests
import json
class AWXClient:
"""AWX REST API 客户端"""
def __init__(self, host, username, password, verify_ssl=False):
self.base_url = f"https://{host}/api/v2"
self.session = requests.Session()
self.session.verify = verify_ssl
self.session.auth = (username, password)
def get_templates(self):
"""获取所有 Job Template"""
resp = self.session.get(f"{self.base_url}/job_templates/")
resp.raise_for_status()
return resp.json()["results"]
def launch_template(self, template_id, extra_vars=None):
"""启动一个 Job Template"""
data = {}
if extra_vars:
data["extra_vars"] = json.dumps(extra_vars)
resp = self.session.post(
f"{self.base_url}/job_templates/{template_id}/launch/",
json=data,
)
resp.raise_for_status()
return resp.json()
def get_job_status(self, job_id):
"""查询 Job 状态"""
resp = self.session.get(f"{self.base_url}/jobs/{job_id}/")
resp.raise_for_status()
return resp.json()
def wait_for_job(self, job_id, timeout=300, interval=5):
"""等待 Job 完成"""
import time
start = time.time()
while time.time() - start < timeout:
status = self.get_job_status(job_id)
if status["status"] in ["successful", "failed", "canceled"]:
return status
time.sleep(interval)
raise TimeoutError("Job 执行超时")
# 使用示例
client = AWXClient(
host="awx.corp.com",
username="admin",
password="your_password",
)
# 获取模板
templates = client.get_templates()
for t in templates:
print(f" ID: {t['id']}, Name: {t['name']}")
# 启动备份任务
backup_template = next(t for t in templates if "backup" in t["name"].lower())
result = client.launch_template(
backup_template["id"],
extra_vars={"backup_dir": "/backup/prod"},
)
print(f"Job started: {result['id']}")
# 等待完成
final = client.wait_for_job(result["id"])
print(f"Job status: {final['status']}")
print(f"Job elapsed: {final.get('elapsed', 'N/A')}s")
5.2 Webhook 触发
# AWX Webhook 配置
# 场景:Git push → 自动触发 Playbook
# 1. 在 Job Template 中启用 Webhook
# Templates → [选择 Template] → Webhook
# └─ Enable Webhook: ON
# └─ Webhook Key: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# 2. 在 GitLab 配置 Webhook
# Settings → Webhooks
# URL: https://awx.corp.com/api/v2/job_templates/{ID}/webhook/
# Secret Token: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
# Trigger: Push events
# 3. 效果
# ┌─ 工程师 Push 代码到 Git
# ├─ GitLab 触发 AWX Webhook
# ├─ AWX 自动执行 Playbook
# └─ 完成后发送通知
六、RBAC 权限管理
6.1 角色与权限模型
AWX 角色体系:
Organization 级别:
┌─ Organization Admin:管理该组织所有资源
├─ Organization Auditor:只读查看所有资源
└─ Organization Member:基本成员
Inventory 级别:
┌─ Admin:管理 Inventory 及其主机/组
├─ Update:执行 Inventory 同步
├─ Adhoc:执行 ad-hoc 命令
└─ Use:在 Job Template 中使用
Project 级别:
┌─ Admin:管理 Project
├─ Use:在 Job Template 中使用
└─ Update:同步 Project
Job Template 级别:
┌─ Admin:管理 Template
├─ Execute:执行 Job
└─ Read:查看但不能执行
典型权限分配:
┌─ 网络负责人 → Organization Admin
├─ 资深工程师 → Inventory Admin + Job Template Execute
├─ 值班工程师 → Job Template Execute(只允许部分 Template)
└─ 审计人员 → Organization Auditor
6.2 权限配置示例
# AWX 权限配置操作(Web UI)
# 角色分配示例:
# 用户: wang@corp.com(网络负责人)
# └─ Organization: Network-Team → Admin
# 用户: li@corp.com(核心网工程师)
# └─ Organization: Network-Team → Member
# └─ Inventory: Core-Network → Admin
# └─ Template: Core-Config-Deploy → Execute
# └─ Template: Core-Backup → Execute
# 用户: zhang@corp.com(接入网值班)
# └─ Organization: Network-Team → Member
# └─ Inventory: Access-Network → Use
# └─ Template: Access-Backup → Execute
# └─ Template: Access-Rollback → Execute
# 用户: audit@corp.com(审计)
# └─ Organization: Network-Team → Auditor
七、生产环境最佳实践
7.1 高可用部署
AWX 生产部署建议:
1. 数据库
┌─ PostgreSQL 主从复制
├─ 自动备份(pg_dump)
└─ 数据持久化 PVC
2. 执行节点
┌─ 多个 Execution Node
├─ 容器化隔离执行
├─ 资源限制(CPU/内存)
└─ 任务队列分配
3. 存储
┌─ 项目文件持久化
├─ 备份文件归档
├─ 日志集中管理(ELK)
└─ 定期清理旧数据
4. 安全
┌─ HTTPS 证书(Let's Encrypt)
├─ LDAP/SSO 认证
├─ 网络隔离(内网访问)
└─ 审计日志留存
7.2 监控与告警
# Playbook 中集成 AWX 通知
# AWX 支持的通知类型:
# ┌─ Email(SMTP)
# ├─ Slack
# ├─ Webhook
# ├─ PagerDuty
# └─ 自定义脚本
# 创建通知模板:
# Notifications → ADD → Email
# Name: "Network-Team-Email"
# Type: Email
# Recipients: network@corp.com
# Subject: "{{ job.name }} - {{ job.status }}"
# 绑定到 Job Template:
# Template → [选择] → Notifications
# └─ On Success: 可选
# └─ On Failure: 发送给网络团队
7.3 运维检查清单
AWX 日常运维检查:
每日:
┌─ 检查定时任务执行状态
├─ 检查失败的 Job
└─ 查看资源使用率
每周:
┌─ 清理旧的 Job 记录
├─ 同步 Git Project
├─ 检查磁盘空间
└─ 审查用户权限
每月:
┌─ 数据库备份验证
├─ 更新 AWX 版本
├─ 审计日志审查
└─ 性能评估
应急:
┌─ Job 执行失败 → 查看日志
├─ 数据库故障 → 主从切换
├─ 磁盘满 → 清理旧数据
└─ 安全事件 → 审计追踪
八、AWX vs 其他方案
8.1 方案对比
| 特性 | AWX | Jenkins | Rundeck |
|---|---|---|---|
| 专注网络 Ansible 集成 Inventory Credential Web UI RBAC Workflow 学习成本 开源 | ✓ 原生 内置 内置管理 优秀 完善 可视化 低 ✓ | ✗ 插件 手动 手动 一般 基础 Pipeline 中 ✓ | ✗ 插件 手动 内置 良好 良好 基础 低 ✓ |
选择建议: ┌─ 网络自动化为主 → AWX ├─ CI/CD 为主 → Jenkins ├─ 运维任务调度 → Rundeck └─ 大型企业 → Red Hat AAP(Tower)
九、总结
AWX/Tower 的核心价值:
从"人管机器"到"平台管人管机器"
┌─ 标准化:所有操作通过统一平台
├─ 安全化:RBAC + 审计日志
├─ 可视化:Web UI + 结果展示
└─ 自动化:定时调度 + Workflow
网络自动化成熟度提升:
L2(脚本) → L3(平台) → L4(闭环)
CLI AWX/Tower 自治网络
AWX 落地路径:
1. 部署 AWX 平台
2. 导入设备 Inventory
3. 配置 SSH Credential
4. 创建备份/巡检 Template
5. 设置定时调度
6. 配置变更 Workflow
7. 集成通知/审批
8. 对接 CMDB/ITSM
下篇预告:第310篇 — YANG 数据建模语言,将介绍 YANG 模型在网络设备配置标准化中的作用,以及如何通过 YANG 理解 NETCONF/RESTCONF 的数据结构。