如何在playbook中使用ansible标记
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"标记控件将被具有更高优先级的命令行参数覆盖。