Ansible 进阶
更新: 10/15/2025 字数: 0 字 时长: 0 分钟
本章将介绍 Ansible Playbook 的一些高级功能,包括条件判断、任务标签和角色(Roles),这些功能可以帮助你编写更灵活、模块化和可维护的自动化剧本。
when
条件判断
when
语句允许你根据变量或任务执行结果等条件来决定是否执行一个任务。
使用场景:
- 根据操作系统的类型执行不同的任务。
- 当上一个任务成功执行或其状态发生改变时,才执行下一个任务。
- 当某个文件或目录存在(或不存在)时执行任务。
示例:根据上一个任务的状态执行
我们可以使用 register
关键字捕获一个任务的输出,然后用 when
语句检查其 changed
状态。只有当 changed
为 true
时(即任务对系统做出了更改),后续任务才会执行。
yaml
- hosts: web
tasks:
- name: 安装 Nginx
apt:
name: nginx
state: latest
register: nginx_install_status
- name: 仅当 Nginx 被新安装时才安装 wget
apt:
name: wget
state: latest
when: nginx_install_status.changed
tags
任务标签
当 Playbook 变得庞大复杂时,你可能只想执行其中的一部分任务。tags
功能允许你为任务“打标签”,然后在执行时通过标签选择性地运行或跳过特定任务。
为任务添加标签:
yaml
- hosts: web
tasks:
- name: 安装 Nginx
apt:
name: nginx
state: latest
tags:
- install
- nginx
- name: 配置 Nginx
template:
src: nginx.conf.j2
dest: /etc/nginx/nginx.conf
tags:
- configure
- nginx
- name: 启动 Nginx 服务
systemd:
name: nginx
state: started
tags:
- service
- nginx
执行 Playbook 时使用标签:
bash
# 只执行带有 'install' 标签的任务
ansible-playbook my_playbook.yml --tags install
# 执行带有 'nginx' 和 'service' 标签的任务
ansible-playbook my_playbook.yml --tags "nginx,service"
# 跳过带有 'configure' 标签的任务
ansible-playbook my_playbook.yml --skip-tags configure
查看 Playbook 中的任务列表:
bash
ansible-playbook my_playbook.yml --list-tasks
roles
角色
随着自动化规模的扩大,将所有任务都写在一个庞大的 Playbook 中会变得难以维护。roles
是一种组织 Playbook 的机制,它允许你将相关的 tasks
、handlers
、vars
、files
、templates
等资源打包成一个独立的、可复用的单元。
使用 roles
的好处:
- 结构化:将复杂的 Playbook 分解为逻辑清晰、独立的组件。
- 可复用:可以在不同的 Playbook 中轻松复用同一个角色。
- 解耦合:便于团队协作,不同成员可以分工负责不同的角色。
roles
目录结构
一个标准的 role
包含以下目录结构。你只需要创建你用得到的目录即可。
txt
roles/
└── my_role/
├── tasks/ # 存放任务文件,main.yml 是主入口
├── handlers/ # 存放 handler 文件,main.yml 是主入口
├── files/ # 存放需要被 copy 模块等引用的静态文件
├── templates/ # 存放需要被 template 模块引用的模板文件 (通常是 .j2 后缀)
├── vars/ # 存放该角色的变量文件,main.yml 是主入口
├── defaults/ # 存放该角色的默认变量,优先级最低
└── meta/ # 存放角色的元数据,如依赖关系
如何使用 roles
- 创建 Role 目录:在你的项目根目录下创建一个
roles
目录,并在其中创建你的角色(例如nginx
)。 - 填充内容:在角色目录中创建相应的子目录和
main.yml
文件,并将你的任务、变量等逻辑拆分进去。 - 在 Playbook 中调用 Role:创建一个顶层的 Playbook(例如
site.yml
),在其中调用你创建的角色。
示例:使用 role
部署 Nginx
1. 目录结构:
txt
.
├── site.yml
└── roles/
└── nginx/
├── files/
│ └── game.conf
├── tasks/
│ └── main.yml
└── templates/
└── index.html.j2
2. roles/nginx/tasks/main.yml
:
yaml
- name: 安装 Nginx
apt:
name: nginx
state: latest
- name: 部署 Nginx 配置文件
copy:
src: game.conf
dest: /etc/nginx/sites-available/game.conf
- name: 部署网站首页
template:
src: index.html.j2
dest: /var/www/html/index.html
- name: 启动并启用 Nginx 服务
systemd:
name: nginx
state: started
enabled: yes
3. site.yml
(入口 Playbook):
yaml
- hosts: web
roles:
- nginx
4. 执行 Playbook:
bash
ansible-playbook site.yml
通过这种方式,我们将部署 Nginx 的所有逻辑都封装在了 nginx
这个角色中,site.yml
只负责调用,大大提高了代码的整洁度和可维护性。