1. 简介

在重构、调试或对大型 Playbook 做任何调整时,我们常常只需要运行其中少数几个任务,甚至只是一个任务。Ansible 提供了多种方式来实现这一需求,包括使用 tagswhen 条件判断,以及 –step 和 –start-at-task 等命令行参数。

本文将介绍几种在 Ansible Playbook 中仅运行一个任务的方法,并结合示例说明其适用场景和使用技巧。


2. 使用 ansible-playbook--step--start-at-task

Ansible 提供了两个非常实用的命令行参数:

  • --step:交互式执行 Playbook,每个任务执行前会提示用户是否执行(y/n/c)
  • --start-at-task:从指定名称的任务开始执行

结合使用这两个参数,可以精准控制只执行某个任务。

示例 Playbook

- name: Display Time and Install Curl
  hosts: localhost
  become: yes
  gather_facts: false

  tasks:
    - name: Display Current Time
      command: date

    - name: Install curl
      apt:
        name: curl
        state: present

执行命令

$ ansible-playbook playbook.yml --start-at-task='Install curl' --step

执行后,Ansible 会从 Install curl 任务开始逐个提示是否执行:

Perform task: TASK: Install curl (N)o/(y)es/(c)ontinue:

优点:控制粒度细,适合调试
缺点:如果有多个后续任务,需要手动拒绝执行,操作繁琐

优化建议

如果不想看到 Gathering Facts 提示,可以在 Play 中设置:

gather_facts: false

3. 使用 Tags

在任务中添加 tags 属性,可以为任务打标签,之后通过 --tags 指定只运行带有该标签的任务。

示例 Playbook

- name: Display Time and Install Curl
  hosts: localhost
  become: yes

  tasks:
    - name: Display Current Time
      command: date
      tags: date_only

    - name: Install curl
      apt:
        name: curl
        state: present

执行命令

$ ansible-playbook playbook.yml --tags "date_only" -v

输出将仅包含 Display Current Time 任务的执行结果:

TASK [Display Current Time] ********************************************************************************************
changed: [localhost] => {"changed": true, "cmd": ["date"], ...}

优点:简洁高效,适合多任务标签化管理
缺点:需要提前规划好标签结构


4. 使用 When 条件判断

通过 when 关键字,可以为任务设置执行条件。结合变量控制,可以实现只运行某个任务。

示例 Playbook

- name: Display Time and Install Curl
  hosts: localhost
  become: yes

  tasks:
    - name: Display Current Time
      command: date
      when: run_date

    - name: Install curl
      apt:
        name: curl
        state: present
      when: not run_date

执行命令

控制执行哪个任务:

$ ansible-playbook playbook.yml --extra-vars '{run_date: True}'

此时只会执行 Display Current Time 任务,另一个任务会被跳过。

反之:

$ ansible-playbook playbook.yml --extra-vars '{run_date: False}'

此时只会执行 Install curl 任务。

优点:逻辑清晰,适合切换执行路径
缺点:不适合大型 Playbook 中仅运行单个任务的场景


5. 总结

方法 适用场景 推荐程度
--step + --start-at-task 调试时交互式执行 ⭐⭐⭐
tags 任务标签化管理 ⭐⭐⭐⭐⭐
when 条件判断 任务逻辑切换 ⭐⭐⭐⭐

📌 推荐优先使用 tags 方法,配置简单、执行高效,是控制 Playbook 中任务执行的首选方式。
📌 如果是调试场景,--step + --start-at-task 是非常实用的组合。
📌 when 更适合控制任务组的执行流程,而不是单独运行一个任务。

在实际开发中,合理使用这些技巧,可以大幅提升 Ansible Playbook 的灵活性和可维护性。


原始标题:Run Only One Task in Ansible Playbook