如何在 Ansible Playbook 中使用标签

在这篇文章中,我们将学习什么是 Ansible 标签 以及使用标签的有效方法 Ansible 剧本 仅运行特定任务。

内容

  1. 什么是 Ansible 标签?
  2. 任务级 Ansible 标签
  3. 多标签
  4. 获取标签信息
  5. 玩关卡标签
  6. 特殊标签
  7. 标记与取消标记
  8. 将标签应用到块
  9. 结论

什么是 Ansible 标签?

当你运行 playbook 时,ansible 会从上到下阅读 playbook 并一一运行任务。 有时我们可能只需要执行特定的任务。 在这种情况下, Ansible 标签 允许您根据需要运行或跳过任务。

关键字标签应用于创建标签。 可以为戏剧、单个任务、块、导入和角色创建标签。

任务级 Ansible 标签

看看 apt 下面我创建了两个任务的包管理手册。 将这两个任务都标记为 标签关键字.

- name: Package Installation   hosts: ubuntu.anslab.com   gather_facts: false   become: true    tasks:      - name: Updating cache ( sudo apt update )       apt:         update_cache: true       tags: cache_update      - name: Remove packages - no dependency       apt:         autoremove: yes       tags: remove

如果我运行这个剧本,与标签相关的任何事情都不会发生,ansible 将像往常一样从上到下运行所有​​任务。 您应该告诉 ansible 应该运行具有特定标签的任务以及应该跳过哪些任务。

随着 ansible-playbook 命令,使用 --tags 或者 -t 标记并传递标签名称以仅运行该特定任务。

$ ansible-playbook tags_testing.yml --tags <tag names> $ ansible-playbook tags_testing.yml --tags cache_update

样本输出:

PLAY [Package Installation] ****************************************************************************************************************  TASK [Updating cache ( sudo apt update )] ************************************************************************************************** changed: [ubuntu.anslab.com]  PLAY RECAP ********************************************************************************************************************************* ubuntu.anslab.com          : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

您还可以将多个标签传递给 --tags 通过用分隔值来标记 逗号.

$ ansible-playbook tags_testing.yml --tags "cache_update,remove"

样本输出:

PLAY [Package Installation] ****************************************************************************************************************  TASK [Updating cache ( sudo apt update )] ************************************************************************************************** changed: [ubuntu.anslab.com]  TASK [Remove packages - no dependency] ***************************************************************************************************** ok: [ubuntu.anslab.com]  PLAY RECAP ********************************************************************************************************************************* ubuntu.anslab.com          : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

要跳过特定标签并运行所有其他标签,您可以使用 --skip-tags 旗帜。 同样,您也可以将多个标签作为参数传递,方法是用 逗号--skip-tags 旗帜。

$ ansible-playbook tags_testing.yml --skip-tags cache_update $ ansible-playbook tags_testing.yml --skip-tags "cache_update,remove"  # MULTIPLE TAGS

样本输出:

PLAY [Package Installation] ****************************************************************************************************************  TASK [Remove packages - no dependency] ***************************************************************************************************** ok: [ubuntu.anslab.com]  PLAY RECAP ********************************************************************************************************************************* ubuntu.anslab.com          : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

多标签

您可以使用 YAML 列表格式。 如果你看到下面的剧本,一个 第二个标签 (IE pkg_mt) 被添加到这两个任务中。

 tasks:      - name: Updating cache ( sudo apt update )       apt:         update_cache: true       tags:            - cache_update           - pkg_mt      - name: Remove packages - no dependency       apt:         autoremove: yes       tags:            - remove           - pkg_mt

您还可以使用 python 列表表示法来创建多个标签。

 tasks:      - name: Updating cache ( sudo apt update )       apt:         update_cache: true       tags: ["cache_update", "pkg_mt"]      - name: Remove packages - no dependency       apt:         autoremove: yes       tags: ["remove", "pkg_mt"]

现在,运行剧本:

$ ansible-playbook tags_testing.yml --tags pkg_mt

样本输出:

PLAY [Package Installation] ****************************************************************************************************************  TASK [Updating cache ( sudo apt update )] ************************************************************************************************** changed: [ubuntu.anslab.com]  TASK [Remove packages - no dependency] ***************************************************************************************************** ok: [ubuntu.anslab.com]  PLAY RECAP ********************************************************************************************************************************* ubuntu.anslab.com          : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

获取标签信息

要从剧本中获取标签列表,您可以使用 --list-tags 旗帜。

$ ansible-playbook tags_testing.yml --list-tags  playbook: tags_testing.yml    play #1 (ubuntu.anslab.com): Package Installation    TAGS: [pkg_mt]       TASK TAGS: [cache_update, pkg_mt, remove]

要获取具有特定标签的任务列表,您可以结合 --tags 标志和 --list-tasks 标志。

$ ansible-playbook tags_testing.yml --list-tasks --tags remove  playbook: tags_testing.yml    play #1 (ubuntu.anslab.com): Package Installation    TAGS: [pkg_mt]     tasks:       Remove packages - no dependency    TAGS: [pkg_mt, remove]

你也可以使用 --list-tasks 单独的标签将打印标签名称和任务/播放名称。

$ ansible-playbook tags_testing.yml --list-tasks  playbook: tags_testing.yml    play #1 (ubuntu.anslab.com): Package Installation    TAGS: [pkg_mt]     tasks:       Updating cache ( sudo apt update )    TAGS: [cache_update, pkg_mt]       Remove packages - no dependency    TAGS: [pkg_mt, remove]

玩关卡标签

标签也可以应用于游戏级别。 该标签将被剧中的所有任务继承。 在下面的剧本中,我添加了一个名为 pkg_mt 到戏剧。

- name: Package Installation   hosts: ubuntu.anslab.com   gather_facts: false   become: true   tags: pkg_mt    tasks:      - name: Updating cache ( sudo apt update )       apt:         update_cache: true       tags: cache_update      - name: Remove packages - no dependency       apt:         autoremove: yes       tags: remove

你可以跑 --list-tasks 并查看标签 “pkg_mt” 被剧中所有任务继承。

$ ansible-playbook tags_testing.yml --list-tasks  playbook: tags_testing.yml    play #1 (ubuntu.anslab.com): Package Installation    TAGS: [pkg_mt]     tasks:       Updating cache ( sudo apt update )    TAGS: [cache_update, pkg_mt]       Remove packages - no dependency    TAGS: [pkg_mt, remove]

特殊标签

有两个名为 always 和 never 的特殊标签。

  • 总是 – 除非您明确使用,否则始终运行任务 --skip-tags 停止运行任务。
  • 绝不 – 除非您明确使用 --tags 运行任务的标志。

在任何情况下,如果您想跳过带有 “总是” 标记然后你必须 使用跳过标签.

$ ansible-playbook tags_testing --skip-tags always

在任何情况下,如果您希望运行带有标记的任务 “绝不” 标记,将其显式传递给 --tags 旗帜。

$ ansible-playbook tags_testing --tags never

标记与取消标记

剧本可能由带标签和不带标签的任务组成。 您可以选择运行没有标签或至少有一个或多个标签的任务。

要运行没有标签的任务,请将 untagged 传递给 --tags 旗帜。 这样,ansible 将检查并运行在 playbook 中没有任何标签映射到它们的任务。

$ ansible-playbook tags_testing --tags untagged

要运行至少有一个标签映射到它们的任务,请将标签传递给 --tags 旗帜。

$ ansible-playbook tags_testing --tags tagged

将标签应用到块

块允许您对任务进行逻辑分组。 Block-rescue-always 用于 ansible 中的异常处理。 您可以将任务分组到块下并将标签应用于块,而不是将标签应用于游戏中的每个任务。

下面是触发 shell 脚本和发送电子邮件的伪代码。 在这里我应用了标签 “管道” 在块级别。 当我使用管道标签运行剧本时,块中的所有任务都将运行。

- block:     - name: Trigger Pipeline script      script: /home/dev/project1/trigger_pipeline.sh     - name: Send email to dev team      mail:        host: smtp.dummy.com        port: 587        username: [email protected]        to: [email protected]        subject: Pipeline triggered.        body: Input file generated for today. Pipeline triggered.      delegate_to: localhost    tags: pipeline

结论

在本文中,我们讨论了什么是 Ansible 标签以及如何在 playbook 中的 play 和 task 级别使用标签。 我们还看到了预定义标签“总是”和“从不”以及如何在剧本中使用它们。 最后,我们研究了如何将标签与块一起使用。

标签似乎是一个基本概念,但对任务进行分组并允许我们以一种我们控制应该运行什么任务以及应该如何运行的方式来构建剧本是非常有用的。

资源:

  • Ansible 标签官方文档

AnsibleAnsible 命令Ansible PlaybooksAnsible 系列Ansible 标签Ansible 教程DevOpsIT 自动化LinuxLinux 管理