Ansible Playbook 完全指南:从入门到实践

目录

[一、什么是 Ansible Playbook?](#一、什么是 Ansible Playbook?)

[二、Playbook 的基本结构](#二、Playbook 的基本结构)

[一个最简单的 Playbook 例子](#一个最简单的 Playbook 例子)

结构拆解:

[三、YAML 格式的注意事项](#三、YAML 格式的注意事项)

关键规则:

[正确 vs 错误的缩进:](#正确 vs 错误的缩进:)

[编辑器小技巧(如果你用 Vim)](#编辑器小技巧(如果你用 Vim))

[四、Playbook 的组成部分详解](#四、Playbook 的组成部分详解)

[1. Play(一场"戏")](#1. Play(一场"戏"))

[2. Task(具体"动作")](#2. Task(具体"动作"))

[五、模块:Ansible 的"工具箱"](#五、模块:Ansible 的"工具箱")

什么是模块?

模块命名规则

哪里找模块?

[六、运行 Playbook](#六、运行 Playbook)

基本运行命令

运行效果示例

七、运行前的检查

[1. 语法检查(避免低级错误)](#1. 语法检查(避免低级错误))

[2. 空运行(看会做什么,但不真做)](#2. 空运行(看会做什么,但不真做))

[3. 详细模式(看更多信息)](#3. 详细模式(看更多信息))

八、重要特性:幂等性

什么是幂等性?

幂等性示例

九、实际编写技巧

技巧1:任务命名要有意义

技巧2:按逻辑顺序排列任务

技巧3:适当添加注释

十、完整的实战示例

部署一个简单的Web应用

[十一、总结:Playbook 的核心价值](#十一、总结:Playbook 的核心价值)

[为什么用 Playbook?](#为什么用 Playbook?)


一、什么是 Ansible Playbook?

想象一下,你要给家里的智能设备写一个"操作说明书",告诉它们:

  1. 早上7点:打开窗帘、煮咖啡

  2. 晚上10点:关灯、锁门、调整空调温度

Ansible Playbook 就是这样的"操作说明书",只不过它是给服务器用的。它是一个文本文件,里面写着:

  • 要对哪些服务器操作

  • 要按什么顺序执行什么任务

  • 每个任务要达到什么效果

简单说:Playbook = 剧本,告诉 Ansible 这台"导演"如何指挥服务器"演员"们表演。


二、Playbook 的基本结构

一个最简单的 Playbook 例子

bash 复制代码
---
# 这是一个完整的 Playbook
- name: 配置Web服务器      # 这场"戏"叫什么名字
  hosts: webservers        # 哪些"演员"上场(服务器列表)
  tasks:                   # 要执行的动作列表
    - name: 安装Apache     # 第一个动作:安装Web服务器
      ansible.builtin.dnf:
        name: httpd        # 要安装的软件包名
        state: present     # 确保已安装

结构拆解:

  1. ---:YAML 文件开头标记(就像文章的标题)

  2. name:给这个 Play 起个名字(方便识别)

  3. hosts:指定在哪些服务器上执行

  4. tasks:具体要做什么(可以多个任务)


三、YAML 格式的注意事项

关键规则:

  1. 只使用空格缩进(绝对不要用 Tab 键)

  2. 相同层级的要对齐(像写代码一样)

  3. 列表项用 - 开头(前面要有空格)

正确 vs 错误的缩进:

✅ 正确的:

bash 复制代码
tasks:
  - name: 安装软件
    ansible.builtin.dnf:
      name: nginx
      state: present

❌ 错误的:

bash 复制代码
tasks:
- name: 安装软件
ansible.builtin.dnf:    # 这里缩进错了!
  name: nginx
  state: present

编辑器小技巧(如果你用 Vim)

~/.vimrc 文件中添加这行,编辑 YAML 文件时会自动帮忙:

bash 复制代码
autocmd FileType yaml setlocal ai ts=2 sw=2 et

意思是:遇到 YAML 文件时,自动缩进,Tab 显示为2个空格。


四、Playbook 的组成部分详解

1. Play(一场"戏")

一个 Playbook 就好像剧本可以包含多场"戏",按顺序执行:

bash 复制代码
---
# 第一场戏:配置数据库
- name: 配置MySQL服务器
  hosts: db_servers
  tasks:
    - name: 安装MySQL
      ansible.builtin.dnf:
        name: mysql-server
        state: latest
bash 复制代码
# 第二场戏:配置Web服务器
- name: 配置Web应用
  hosts: web_servers
  tasks:
    - name: 安装Node.js
      ansible.builtin.dnf:
        name: nodejs
        state: present

2. Task(具体"动作")

每个 Task 使用一个模块来完成具体工作:

bash 复制代码
tasks:
  # 任务1:创建用户
  - name: 创建应用用户
    ansible.builtin.user:
      name: appuser
      uid: 1001
      state: present
  
  # 任务2:创建目录
  - name: 创建应用目录
    ansible.builtin.file:
      path: /opt/myapp
      state: directory
      owner: appuser
      mode: '0755'
  
  # 任务3:启动服务
  - name: 启动应用服务
    ansible.builtin.service:
      name: myapp
      state: started
      enabled: yes

五、模块:Ansible 的"工具箱"

什么是模块?

模块是 Ansible 完成具体工作的工具。就像:

  • 螺丝刀:拧螺丝(模块:安装软件)

  • 锤子:钉钉子(模块:创建文件)

  • 尺子:量尺寸(模块:检查状态)

模块命名规则

现在推荐使用全限定名称(FQCN):

bash 复制代码
# ✅ 推荐:使用完整名称
ansible.builtin.copy

# ⚠️ 可以用但不推荐:只用短名称
copy

哪里找模块?

  1. 内置模块ansible.builtin 集合(自带)

  2. 红帽认证模块:自动化中心(企业级,有支持)

  3. 社区模块:Ansible Galaxy(开源社区贡献)

查看可用模块:

bash 复制代码
# 查看所有集合和模块
ansible-navigator collections

六、运行 Playbook

基本运行命令

bash 复制代码
# 最简单的运行方式
ansible-navigator run playbook.yml

# 输出到屏幕(不进入交互模式)
ansible-navigator run -m stdout playbook.yml

运行效果示例

假设有一个安装 Nginx 的 Playbook:

bash 复制代码
---
- name: 安装和启动Nginx
  hosts: web01.example.com
  tasks:
    - name: 安装Nginx
      ansible.builtin.dnf:
        name: nginx
        state: latest

运行后你会看到:

bash 复制代码
PLAY [安装和启动Nginx] ******************************

TASK [Gathering Facts] ****************************
ok: [web01.example.com]

TASK [安装Nginx] *********************************
changed: [web01.example.com]  # changed表示有更改

PLAY RECAP ****************************************
web01.example.com: ok=2 changed=1 failed=0

说明

  • ok:已经符合要求,没做修改

  • changed:进行了修改

  • failed:执行失败


七、运行前的检查

1. 语法检查(避免低级错误)

bash 复制代码
# 检查YAML语法是否正确
ansible-navigator run -m stdout playbook.yml --syntax-check

# 输出示例(成功):
playbook: /home/user/playbook.yml
# 输出示例(失败):
ERROR! Syntax Error while loading YAML...

2. 空运行(看会做什么,但不真做)

bash 复制代码
# 模拟运行,看会有什么变化
ansible-navigator run -m stdout playbook.yml --check

就像"演习",告诉你会做什么,但不会真的修改服务器。

3. 详细模式(看更多信息)

bash 复制代码
# 不同详细程度
ansible-navigator run -m stdout playbook.yml -v      # 基础详情
ansible-navigator run -m stdout playbook.yml -vv     # 更多详情
ansible-navigator run -m stdout playbook.yml -vvv    # 连接详情
ansible-navigator run -m stdout playbook.yml -vvvv   # 完整详情

八、重要特性:幂等性

什么是幂等性?

幂等性 = 无论执行多少次,结果都一样

举例说明:

  • ✅ 幂等的:"确保用户tom存在"(存在就不创建)

  • ❌ 不幂等的:"创建用户tom"(每次都创建,第二次会失败)

Ansible 模块大多是幂等的,这意味着:

  1. 安全:可以放心多次运行

  2. 可靠:不会因为重复执行而出错

  3. 高效:只有需要时才执行操作

幂等性示例

bash 复制代码
- name: 确保文件存在
  ansible.builtin.file:
    path: /tmp/test.txt
    state: touch   # 幂等:文件存在就不动
    
- name: 确保服务运行
  ansible.builtin.service:
    name: nginx
    state: started  # 幂等:已经在运行就不动

九、实际编写技巧

技巧1:任务命名要有意义

bash 复制代码
# ✅ 好的命名
- name: 安装并配置MySQL服务器

# ❌ 不好的命名
- name: 执行dnf安装

技巧2:按逻辑顺序排列任务

bash 复制代码
tasks:
  # 1. 先准备环境
  - name: 安装必要软件
    ...
  
  # 2. 再配置服务
  - name: 配置应用
    ...
  
  # 3. 最后启动服务
  - name: 启动并启用服务
    ...

技巧3:适当添加注释

bash 复制代码
# 这个Playbook用于部署WordPress博客
---
# 第一部分:准备数据库
- name: 配置MySQL
  hosts: db_servers
  tasks:
    # 安装数据库软件
    - name: 安装MySQL服务器
      ansible.builtin.dnf:
        name: mysql-server
        state: latest

十、完整的实战示例

部署一个简单的Web应用

bash 复制代码
---
# 部署博客系统
- name: 准备服务器环境
  hosts: blog_servers
  tasks:
    - name: 更新系统软件包
      ansible.builtin.dnf:
        name: "*"
        state: latest
    
    - name: 安装Web服务器
      ansible.builtin.dnf:
        name: nginx
        state: present
    
    - name: 创建网站目录
      ansible.builtin.file:
        path: /var/www/blog
        state: directory
    
    - name: 部署网站文件
      ansible.builtin.copy:
        src: files/index.html
        dest: /var/www/blog/
    
    - name: 启动Nginx服务
      ansible.builtin.service:
        name: nginx
        state: started
        enabled: yes
    
    - name: 开放防火墙端口
      ansible.posix.firewalld:
        service: http
        permanent: yes
        state: enabled

十一、总结:Playbook 的核心价值

为什么用 Playbook?

  1. 可重复:一次编写,多次运行

  2. 可读性:像读说明书一样清晰

  3. 可版本控制:用 Git 管理,知道谁改了啥

  4. 可共享:团队共享,新人快速上手

  5. 可自动化:配合 CI/CD,完全自动

相关推荐
Suchadar2 小时前
Docker搭建Web测试靶场
运维·docker·容器
Yana.nice2 小时前
chrony中“prefer”指定首选服务器
运维·服务器
GAOJ_K2 小时前
弧形导轨与直线导轨:曲线运动与直线运动
运维·人工智能·科技·机器人·自动化·制造
小猪写代码2 小时前
Linux核心梳理
linux·运维·服务器
Cx330❀2 小时前
深入理解 Linux 基础 IO:从 C 库到系统调用的完整剖析
linux·运维·服务器·c语言·数据库·人工智能·科技
小草cys2 小时前
【未解决】华为鲲鹏920B服务器Ubuntu25下安装mindspore(搭载昇腾Ascend 910B AI 芯片
运维·服务器
swaveye90602 小时前
轻量服务器CentOS 7.9 64位 设置允许防火墙/HTTP/HTTPS访问
运维·服务器·centos
dashizhi20152 小时前
如何备份服务器文件、服务器文件机密数据自动备份的方法
运维·服务器
捷智算云服务2 小时前
捷智算GPU维修中心构建服务器整机系统级保障体系
运维·服务器