Skip to content

Ansible 进阶

更新: 10/15/2025 字数: 0 字 时长: 0 分钟

本章将介绍 Ansible Playbook 的一些高级功能,包括条件判断、任务标签和角色(Roles),这些功能可以帮助你编写更灵活、模块化和可维护的自动化剧本。

when 条件判断

when 语句允许你根据变量或任务执行结果等条件来决定是否执行一个任务。

使用场景:

  • 根据操作系统的类型执行不同的任务。
  • 当上一个任务成功执行或其状态发生改变时,才执行下一个任务。
  • 当某个文件或目录存在(或不存在)时执行任务。

示例:根据上一个任务的状态执行

我们可以使用 register 关键字捕获一个任务的输出,然后用 when 语句检查其 changed 状态。只有当 changedtrue 时(即任务对系统做出了更改),后续任务才会执行。

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 的机制,它允许你将相关的 taskshandlersvarsfilestemplates 等资源打包成一个独立的、可复用的单元。

使用 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

  1. 创建 Role 目录:在你的项目根目录下创建一个 roles 目录,并在其中创建你的角色(例如 nginx)。
  2. 填充内容:在角色目录中创建相应的子目录和 main.yml 文件,并将你的任务、变量等逻辑拆分进去。
  3. 在 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 只负责调用,大大提高了代码的整洁度和可维护性。

贡献者

The avatar of contributor named as LI SIR LI SIR

页面历史