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执行
如果用表格表示标签和执行任务之间的关系,如下所示。
解释
在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 运行的代码
如果将标签与执行任务的关系表示成表格,将如下所示。
说明
即使在dependencies指定的角色内部的任务上,也将正确评估标签。即使在Q5-3和Q5-4中指定了role-hoge和include-hoge标签,并且在role-fuga内没有运行任务,它仍然会对role-hoge进行标签评估。
最后
制限する項目が多くなり、誤解を招きやすいと感じました。
-
- 在操作 role-fuga 之前一定要先操作 role-hoge(使用 dependencies)。
- 希望能够选择在 role-fuga 中执行的一部分任务(使用 tags)。
当以指定的标签为依据进行配置时,尽管已在dependencies中指定了相应的任务,但role-hoge的任务可能无法运行。在问题中,Q5-2可能与这种情况相似。在这种情况下,role-hoge任务可能需要添加always标签,但这可能会比较困难。
标签是非常方便的功能,
请合理使用!
我认为被这样做可能是好的。