第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 的数据结构。