Ansible标签测验

首先

大家好,全球60亿Ansible用户!这次我想给大家出一个关于你们熟悉的标签功能的小测验。

环境信息

我们将在下面的环境中提问这道问题。请注意,由于现在流行的是 Ansible 2.0,请留意。

各种版本

[root@controller ~]# cat /etc/centos-release
CentOS release 6.7 (Final)

[root@controller ~]# python --version
Python 2.6.6

[root@controller ~]# ansible --version
ansible 2.0.0.2
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides

Ansible的配置

手册将以这个配置为基础。
如果需要进行更改,请明确指出更改的部分,但请注意未提及的部分将保持原状。

ansible/
├─roles/
│ ├─role-hoge/
│ │ └─tasks/
│ │    ├─main.yml
│ │    └─hoge.yml
│ └─role-fuga/
│   ├─meta/
│   │  └─main.yml
│   └─tasks/
│      └─main.yml
└─main.yml

壁虎。

在执行ansible-playbook命令时,有一个执行目标 ansible/main.yml。

- hosts: targets
  user: root
  tasks:
    - debug: msg="play"

完成了基本的测验之后,我们会根据这本playbook来阅读角色信息。

角色-霍格。

这只是一个简单的回复消息的角色。
在这里,我们将向角色添加任务或标签,并提出关于角色对标签的基本操作的问题。

- debug: msg="hoge"

角色-逃亡/

role-fuga 对于 role-hoge 存在依赖关系。

- debug: msg="fuga"
dependencies:
  - role-hoge

问题的核心部分

这个问答游戏总共有5个问题。
即使只看每个问题,你可能也能明白,但还是希望按照顺序来解答。

1. 标签的设定

疑問

我对“playbook”进行了一些修改,添加了一个名为“play”的标签。

  tasks:
    - debug: msg="play"
      tags: play

Q1. 使用下面的每个命令 debug:msg=”play” 是否会执行任务?

[root@controller ~]# ansible-playbook main.yml
[root@controller ~]# ansible-playbook main.yml --tags
[root@controller ~]# ansible-playbook main.yml --tags all
[root@controller ~]# ansible-playbook main.yml --tags play
[root@controller ~]# ansible-playbook main.yml --tags PLAY

回答

现在,你觉得怎么样呢?

只需要一个选项,将以下句子用汉语母语进行改写:
在Q1-1、Q1-3和Q1-4上执行。

在Q1-2时执行的命令参数错误。

[root@controller ansible]# ansible-playbook main.yml --tags
Usage: ansible-playbook playbook.yml

ansible-playbook: error: --tags option requires an argument

另外,Q1-5不会产生错误,但是 debug: msg=”play” 不会被执行。

说明

通过为任务添加tags属性,可以给任务打上标签。
打上标签的任务可以通过在执行ansible-playbook命令时使用–tags选项来指定目标标签来执行。
如果没有指定–tags选项,则所有任务都会被隐式执行,但如果要明确指定这一选项,则需要指定all标签。
另外,从Q1-5的结果可知,标签是区分大小写的。

2. 指定多个标签

问题

如何为任务添加多个标签才能完成?

[root@controller ~]# ansible-playbook main.yml --tags play1
[root@controller ~]# ansible-playbook main.yml --tags play2
[root@controller ~]# ansible-playbook main.yml --tags play3

Q2. 如果想要仅使用指定了 play1 和 play2 标签的命令来执行 debug: msg=”play” 任务,正确的标签方式是以下哪个?

  tasks:
    - debug: msg="play"
      tags: play1, play2
  tasks:
    - debug: msg="play"
      tags: { play1, play2 }
  tasks:
    - debug: msg="play"
      tags: [ play1, play2 ]
  tasks:
    - debug: msg="play"
      tags:
        - play1
        - play2

回答

除了问题2-2以外的所有内容

在Q2-2中会出现语法错误。

[root@controller ansible]# ansible-playbook main.yml --tags play1
ERROR! tags must be specified as a list

The error appears to have been in '/ansible/main.yml': line 5, column 13, but may
be elsewhere in the file depending on the exact syntax problem.

The offending line appears to be:

    - debug: msg="play"
      tags: { play1, play2 }
            ^ here

说明

如果想给任务添加多个标签,可以在tags属性中使用逗号分隔或使用序列来指定标签。个人认为使用换行符的序列来指定多个标签,比使用逗号分隔的方式更好,因为使用逗号分隔的方式会使每个标签难以分辨。顺便提一下,在题目中特意提到了play3,但如果只需要play1和play2就能正常运行的话,也可以使用always标签。

3. 对角色进行标记

问题

将 role-hoge 导入到 main.yml 中。

  tasks:
    - debug: msg="play"

  roles:
    - role: role-hoge

Q3. 当 role-hoge 在 play-hoge 指定标签时执行的标记是以下哪一个?

[root@controller ansible]# ansible-playbook main.yml --tags play-hoge
  roles:
    - role: role-hoge
      tags: 
        - play-hoge
  roles:
    - { role: role-hoge, tags: [ play-hoge ] }
  roles:
    - { role: role-hoge, tags=play-hoge }

回答

A3 Q3-1 和 Q3-2

问题3-3,可以执行命令,但是 role-hoge 不会被执行。

解說 (jiě shuō)

在中文中,您可以像对待任务一样给角色进行标记。 Q3-1 是最基本的写法,但您也可以像 Q3-2 一样用大括号 { } 括起整个句子,这样就无需使用换行来书写。

顺便提一下,下面的情况会如何执行呢?
与Q3-1几乎相同,但请注意tags的位置。

  roles:
    - role: role-hoge
  tags:
    - play-hoge

当我们尝试实际执行时,我们可以发现不仅执行了”role”,而且还执行了”task”。

[root@controller ansible]# ansible-playbook main.yml --tags play-hoge

PLAY ***************************************************************************
 (略)
TASK [role-hoge : debug] *******************************************************
ok: [192.168.100.20] => {
    "msg": "hoge"
}

TASK [debug] *******************************************************************
ok: [192.168.100.20] => {
    "msg": "play"
}
 (略)

因为缩进位置的改变,tags属性不仅适用于roles,还适用于tasks,所以会发生这样的情况。
由于Python和YAML都对缩进有很重要的意义,所以在不熟悉的情况下需要注意。
此外,在与Chef进行比较时,Ansible被称为“按顺序执行的Ansible”,从这个例子中我们可以看出,在role和task中,先执行role。

4. 在卷内进行标记

问题

我计划让角色-好哥担任这次的包含任务。

  tasks:
    - debug: msg="play"

  roles:
    - role: role-hoge
      tags:
        - play-hoge

在角色 “hoge” 中添加 “include”。

- debug: msg="hoge"
  tags:
    - role-hoge

- include: hoge.yml
- debug: msg="included hoge"
  tags:
    - include-hoge

当执行下面的命令时,role-hoge内的debug: msg=”hoge”任务会被执行吗?
Suggested paraphrase:
当执行下述命令时,会执行在role-hoge内的debug: msg=”hoge”任务吗?

[root@controller ~]# ansible-playbook main.yml --tags play-hoge
[root@controller ~]# ansible-playbook main.yml --tags role-hoge
[root@controller ~]# ansible-playbook main.yml --tags include-hoge

回答

用A.4 Q4-1和Q4-2执行

如果用表格表示标签和执行任务之间的关系,如下所示。

タグdebug: msg=”hoge”debug: msg=”included hoge”play-hoge○○role-hoge○×include-hoge×○

解释

在playbook中没有指定标签时,我们可以在角色内部指定标签并执行相应的任务。

然而,正如从include-hoge标签的示例中可以明显看出的那样,不是所有层级的任务都会被执行,所以需要注意。

顺便提一句,对于任务,我们可以使用下面的tags变量来添加标签。

- include: hoge.yml tags=include-hoge

然而,由于 Ansible 2.0 开始,这个 tags 变量已经成为废弃的方法,因此在执行 Ansible 2.0 时会出现这样的警告。

[DEPRECATION WARNING]: You should not specify tags in the include parameters. All tags should be specified
using the task-level option. This feature will be removed in a future release. Deprecation warnings can be
disabled by setting deprecation_warnings=False in ansible.cfg.

此外,还需要注意,如果同时使用标签属性和标签变量进行标签指定,则可能会产生错误的情况。

ERROR! Include tasks should not specify tags in more than one way (both via args and directly on the task)

5. 依赖性和标签

问题 tí)

将 playbook 中直接指定的角色切换为 “role-fuga”。

  roles:
    - role: role-fuga
      tags:
        - play-fuga

然后,在 role-fuga 中使用 dependencies 来确保 role-hoge 也被执行。

- debug: msg="fuga"
  tags:
    - role-fuga
dependencies:
  - role-hoge

由于 role-hoge 的状况与问题4相同,所以具有 role-hoge 标签和 include-hoge 标签。

当执行以下命令时,role-hoge 内的 debug: msg=”hoge” 任务会被执行吗?

[root@controller ~]# ansible-playbook main.yml --tags play-fuga
[root@controller ~]# ansible-playbook main.yml --tags role-fuga
[root@controller ~]# ansible-playbook main.yml --tags role-hoge
[root@controller ~]# ansible-playbook main.yml --tags include-hoge

答案

5 Q5-1 和 Q5-3 运行的代码

如果将标签与执行任务的关系表示成表格,将如下所示。

タグdebug: msg=”fuga”debug: msg=”hoge”debug: msg=”included hoge”play-fuga○○○role-fuga○××role-hoge×○×include-hoge××○

说明

即使在dependencies指定的角色内部的任务上,也将正确评估标签。即使在Q5-3和Q5-4中指定了role-hoge和include-hoge标签,并且在role-fuga内没有运行任务,它仍然会对role-hoge进行标签评估。

最后

制限する項目が多くなり、誤解を招きやすいと感じました。

    1. 在操作 role-fuga 之前一定要先操作 role-hoge(使用 dependencies)。

 

    希望能够选择在 role-fuga 中执行的一部分任务(使用 tags)。

当以指定的标签为依据进行配置时,尽管已在dependencies中指定了相应的任务,但role-hoge的任务可能无法运行。在问题中,Q5-2可能与这种情况相似。在这种情况下,role-hoge任务可能需要添加always标签,但这可能会比较困难。

标签是非常方便的功能,

请合理使用!

我认为被这样做可能是好的。

广告
将在 10 秒后关闭
bannerAds