如何在playbook中使用ansible标记

时间:2020-01-09 10:34:04  来源:igfitidea点击:

Ansible标签是另一个很好的特性,它可以执行playbook中相应的任务。默认情况下,playbook中的所有任务都会执行,但是通过标记,我们可以控制这种行为,并且只执行具有匹配标记的任务。

了解标记

  • 标记在资源级别上用于为特定资源命名

  • "--tags"选项与"ansible playbook"一起使用,只运行带有特定标记的资源

  • 当任务文件包含在剧本中时,可以在include语句中对其进行标记

  • 当使用"ansible playbook--tags"tagname"时,只有标记了这些标记的资源才会运行。这意味着,如果同一级别的资源没有标记,那么它就不会运行

  • 使用 -skip tags"tagname"排除带有特定标记的资源

  • 特殊标记可用于确保始终执行资源,除非用"--skip标记明确排除`

  • "--tags"选项可以将3个特定的标记作为参数

  • taged运行任何标记的资源

  • untaged排除所有标记的资源

  • all运行所有任务(这也是未指定标记时的默认行为)

说明:

我们应该注意缩进,标记应采用与模块定义相同的空白量,即tasks部分下的"module name"或者"name"(但不带连字符)。

示例1:向所有任务添加标记

在本例中,我将准备示例"playbook ansible-tags-1.yml",其中包含四个任务,它们只在控制台上打印一条消息。我将为每个任务添加一个不同的标记,以便我们可以使用这些单独的标记来执行映射任务

--
 - name: Ansible Tags
   hosts: localhost
   gather_facts: false
   tasks:
     - debug:
         msg: "This is first task"
       tags: first
     - debug:
         msg: "This is second task"
       tags: second
     - debug:
         msg: "This is third task"
       tags: third
     - debug:
         msg: "This is fourth task"
       tags: fourth

现在,如果我在没有任何添加命令行参数的情况下执行这个playbook,那么默认情况下将执行所有任务:

[ansible@controller ~]$ ansible-playbook ansible-tags-1.yml
PLAY [Ansible Tags] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is first task"
}
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is second task"
}
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is third task"
}
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is fourth task"
}
PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ***
localhost                  : ok=4    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

但是我们可以通过使用"tags"来控制这种行为,假设我们只希望"执行第一个任务",这样我们就可以使用"-tags first"和相同的命令:

[ansible@controller ~]$ ansible-playbook ansible-tags-1.yml --tags first
PLAY [Ansible Tags] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is first task"
}
PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ***
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

所以其他任务都被排除在外。我们可以向列表中添加更多标记,例如"调用task1和task3",我们将使用:

[ansible@controller ~]$ ansible-playbook ansible-tags-1.yml --tags first,third
PLAY [Ansible Tags] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is first task"
}
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is third task"
}
PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ***
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

所以我们只需要给出映射标记名来执行相应的任务

示例2:使用标记排除任务

现在在上面的示例中,我们使用映射标记名来执行任务。但是,如果我们有100个标记,并且只希望排除一些任务,那么通过命令行提供所有这些标记并不是一个好的做法。

在这种情况下,我们可以使用"-skip tags"来调用除提供的带有"-skip tags"的标记之外的所有其他标记。例如,我其中执行所有的标记,除了用"tag fourth"映射的任务`

[ansible@controller ~]$ ansible-playbook ansible-tags-1.yml --skip-tags fourth
PLAY [Ansible Tags] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is first task"
}
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is second task"
}
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is third task"
}
PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ***
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

示例3:对多个任务使用同一标记

我们还可以对多个任务使用相同的标记名,这样就可以用一个标记名执行多个任务。我已经更新了我的剧本,为我的第一个和第三个任务分配了另一个标签名。

--
 - name: Ansible Tags
   hosts: localhost
   gather_facts: false
   tasks:
     - debug:
         msg: "This is first task"
       tags:
         - first
         - general
     - debug:
         msg: "This is second task"
       tags: second
     - debug:
         msg: "This is third task"
       tags:
         - third
         - general
     - debug:
         msg: "This is fourth task"
       tags: fourth

我为第一个和第三个任务创建了一个添加的标记"general",因此现在我只能在执行第一个和第三个任务时使用此标记,而不是一直使用两个不同的标记:

让我们验证一下这个配置

[ansible@controller ~]$ ansible-playbook ansible-tags-1.yml --tags general
PLAY [Ansible Tags] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is first task"
}
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is third task"
}
PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ***
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

示例4:使用标记禁用一个或者多个任务

我们知道,默认情况下,所有的任务都会执行,但出于某种调试目的,如果我们希望禁用某个任务,那么我们可以使用标记来实现这一点。我们只需分配相应的task"never"标记,默认情况下不会执行该任务,除非我们特别调用该任务的标记名。

例如,我在第四个任务中添加了"never"标记

--
 - name: Ansible Tags
   hosts: localhost
   gather_facts: false
   tasks:
     - debug:
         msg: "This is first task"
       tags:
         - first
         - general
     - debug:
         msg: "This is second task"
       tags: second
     - debug:
         msg: "This is third task"
       tags:
         - third
         - general
     - debug:
         msg: "This is fourth task"
       tags:
        - fourth
        - never

让我在没有任何命令行参数的情况下执行playbook:

[ansible@controller ~]$ ansible-playbook ansible-tags-1.yml
PLAY [Ansible Tags] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is first task"
}
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is second task"
}
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is third task"
}
PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ***
localhost                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

所以第四个任务没有其中执行。但是我们可以通过使用"--tags-fourth来执行第四个任务`

[ansible@controller ~]$ ansible-playbook ansible-tags-1.yml --tags fourth
PLAY [Ansible Tags] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **
TASK [debug] ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** *****
ok: [localhost] => {
    "msg": "This is fourth task"
}
PLAY RECAP ** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** **** ***
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

在这种情况下,"never"标记控件将被具有更高优先级的命令行参数覆盖。