验证Ansible v2:动态包含问题
动态包含问题
我以前写过这样的翻译文章。
Ansible 2.0发布!
这是关于Ansible v2于2016年1月正式发布的版本公告,在公告中提到了Dynamic Include Problems。
由于包括任务现在在运行时评估,Ansible 对尚未包括的文件中包含的任何任务不再提前知晓。这在几种情况下会出现问题(我们打算在未来的版本中进行修正):
在处理包括任务之前,无法看到任务上的标签,因此现在应该在包括任务上指定标签,而不是在包括中的独立任务上指定,否则将不会显示标签。同样,–list-tags 选项也不会显示仅包含在包括文件中的标签。
针对这部分内容,我进行如下翻译。
动态包含问题
通过这次重构,被包含的任务将在运行时被评估,Ansible将无法提前了解被包含并执行的任务。
这将在一些情况下引起问题(将在将来的版本中进行修复)。由于任务设置的标签在包含之前无法被看见,因此只有针对包含本身设置标签才会被评估,而不是针对每个被包含的任务。同样,适用于–list-tags选项。
根据所说的,
“include内部のタグが評価されない”可以翻译为”include内部的标签不被评估”。
我之前是把它看作是一个问题。
那真的吗?
前几天,我发现了这篇文章。
将正在使用的Ansible 1.x通过实际服务升级到Ansible 2.0,会发生什么?
这篇文章讨论了从Ansible v1升级到v2的迁移问题,但在谈到v2时,着重关注了上方的“动态包含问题”。
在这些内容当中,我个人特别关注的是“动态包含问题”的部分。
(略)
关于这部分,在阅读原文的时候,我不太明白被包含文件中的标签和处理器是在运行时评估,还是在运行时被忽略的。
因此,这方面的确认是通过实际验证来完成的。
总结起来,给包含在文件中的每个任务分配标签似乎在实际使用中没有问题。然而,在包含的文件中定义的处理程序会被忽略而不会引发错误。这表明在迁移之前必须进行重写。
根据这个结论做出了这样的决定。
因为那篇有关Ansible 2.0版本发布翻译的文章似乎被很多人阅读了,我觉得这不太妙,所以我也准备自己进行验证。
准备验证
在进行验证之前,需要做各种准备工作。
检验环境
[root@controller ~]# cat /etc/centos-release
CentOS release 6.7 (Final)
[root@controller ~]# python --version
Python 2.6.6
为了切换多个版本,我从Github上获取了Ansible的原始版本。
[root@controller ~]# cd /opt
[root@controller opt]# git clone https://github.com/ansible/ansible.git
Initialized empty Git repository in /opt/ansible/.git/
remote: Counting objects: 113219, done.
remote: Compressing objects: 100% (72/72), done.
remote: Total 113219 (delta 34), reused 6 (delta 6), pack-reused 113135
Receiving objects: 100% (113219/113219), 39.52 MiB | 600 KiB/s, done.
Resolving deltas: 100% (67362/67362), done.
测试对象
除了alpha和beta之外,我们将验证v2的内容。
[root@controller ansible]# git tag -l | grep v2 | grep -Ev "alpha|beta"
v2.0.0-0.6.rc1
v2.0.0-0.7.rc2
v2.0.0-0.8.rc3
v2.0.0-0.9.rc4
v2.0.0.0-1
v2.0.0.1-1
v2.0.0.2-1
v2.0.1.0-0.1.rc1
v2.0.1.0-0.2.rc2
v2.0.1.0-1
切换二进制文件可以使用带标签的git checkout命令结合hacking/env-setup进行组合使用。
#!/bin/bash
VERSION=${1}
cd /opt/ansible
git checkout refs/tags/${VERSION}
source ./hacking/env-setup > /dev/null
ansible --version
测试项目
我将使用下列的playbook来执行任务。
- hosts: targets
user: root
tasks:
- debug: msg="main always play"
tags:
- always
- debug: msg="main no play"
- debug: msg="main play"
tags:
- main
- include: include.yml
tags:
- include
- debug: msg="sub always play"
tags:
- always
- debug: msg="sub no play"
- debug: msg="sub play"
tags:
- sub
以下是验证项目。
-
- –list-tagsで出力されるタグ
-
- –tags mainで実行されるタスク
- –tags noneで実行されるタスク
验证结果
–列出标签
以原生中文进行改述:
“按照Shell的风格大致地粗略运行。
由于main.yml和include.yml明确指定了四种类型[always, main, sub, include],只要有这四种类型就是正常的。”
[root@controller ansible]# for ver in $(cat target-ver.list) ; do echo "# ${ver}" ; ./change_ver.sh "${ver}" 2&>1 > /dev/null ; ansible --version | grep -E "^ansible" ; ansible-playbook -i inventory/hosts main.yml --list-tags | grep "TASK TAGS" ; echo "" ; done
# v2.0.0-0.6.rc1
ansible 2.0.0 (detached HEAD f2225395f9) last updated 2016/03/17 17:27:36 (GMT +100)
# v2.0.0-0.7.rc2
ansible 2.0.0 (detached HEAD cc98528ecb) last updated 2016/03/17 17:27:37 (GMT +100)
# v2.0.0-0.8.rc3
ansible 2.0.0 (detached HEAD a2120a3d63) last updated 2016/03/17 17:27:38 (GMT +100)
TASK TAGS: [always, include, main]
# v2.0.0-0.9.rc4
ansible 2.0.0 (detached HEAD 502ad88506) last updated 2016/03/17 17:27:38 (GMT +100)
TASK TAGS: [always, include, main]
# v2.0.0.0-1
ansible 2.0.0.0 (detached HEAD 06ec219982) last updated 2016/03/17 17:27:39 (GMT +100)
TASK TAGS: [always, include, main]
# v2.0.0.1-1
ansible 2.0.0.1 (detached HEAD a50d1ea756) last updated 2016/03/17 17:27:40 (GMT +100)
TASK TAGS: [always, include, main]
# v2.0.0.2-1
ansible 2.0.0.2 (detached HEAD 7de237c5a1) last updated 2016/03/17 17:27:41 (GMT +100)
TASK TAGS: [always, include, main]
# v2.0.1.0-0.1.rc1
ansible 2.0.1.0 (detached HEAD 870a4b8dc1) last updated 2016/03/17 17:27:41 (GMT +100)
TASK TAGS: [always, include, main]
# v2.0.1.0-0.2.rc2
ansible 2.0.1.0 (detached HEAD bec698052f) last updated 2016/03/17 17:27:42 (GMT +100)
TASK TAGS: [always, include, main]
# v2.0.1.0-1
ansible 2.0.1.0 (detached HEAD bb6cadefa2) last updated 2016/03/17 17:27:43 (GMT +100)
TASK TAGS: [always, include, main]
整体来看,TASK TAGS中出现的标签是[always, include, main],所以sub标签不足。
由于sub标签确实写在包含的任务标签中,根据发布说明,我们可以知道它没有起作用。
一方面,v2.0.0-0.6.rc1和v2.0.0-0.6.rc2版本的输出并不完美。
我们尝试去掉grep “TASK TAGS”来查看输出。
[root@controller ansible]# for ver in $(cat tmp.list) ; do echo "# ${ver}" ; ./change_ver.sh "${ver}" 2&>1 > /dev/null ; ansible --version | grep -E "^ansible" ; ansible-playbook -i inventory/hosts main.yml --list-tags ; echo "" ; done
# v2.0.0-0.6.rc1
ansible 2.0.0 (detached HEAD f2225395f9) last updated 2016/03/17 17:33:26 (GMT +100)
playbook: main.yml
PLAY: #1
tasks:
TASK: meta
TASK: debug msg=main always play TAGS: [always]
TASK: debug msg=main no play
TASK: debug msg=main play TAGS: [main]
TASK: include TAGS: [include]
TASK: meta
TASK: meta
# v2.0.0-0.7.rc2
ansible 2.0.0 (detached HEAD cc98528ecb) last updated 2016/03/17 17:33:26 (GMT +100)
playbook: main.yml
PLAY: #1
tasks:
TASK: meta (flush_handlers)
TASK: debug msg=main always play TAGS: [always]
TASK: debug msg=main no play
TASK: debug msg=main play TAGS: [main]
TASK: include TAGS: [include]
TASK: meta (flush_handlers)
TASK: meta (flush_handlers)
看起来从v2.0.0-0.7.rc3版本开始,–list-tags的输出格式已经改变了。
不过,由于仍然只有除了sub之外的三个标签有反应,所以从行为上看似乎还是一样的。
– 主要标签
如果指定了main标签,并且按照发布说明的方式进行操作,那么include.yml文件中的标签将不会被评估,也不会被完全执行。
[root@controller ansible]# for ver in $(cat target-ver.list) ; do echo "# ${ver}" ; ./change_ver.sh "${ver}" 2&>1 > /dev/null ; ansible --version | grep -E "^ansible" ; ansible-playbook -i inventory/hosts main.yml --tags main | grep msg ; echo "" ; done
# v2.0.0-0.6.rc1
ansible 2.0.0 (detached HEAD f2225395f9) last updated 2016/03/17 17:39:13 (GMT +100)
TASK [debug msg=main always play] **********************************************
"msg": "main always play"
TASK [debug msg=main play] *****************************************************
"msg": "main play"
TASK [debug msg=sub always play] ***********************************************
"msg": "sub always play"
# v2.0.0-0.7.rc2
ansible 2.0.0 (detached HEAD cc98528ecb) last updated 2016/03/17 17:39:14 (GMT +100)
TASK [debug msg=main always play] **********************************************
"msg": "main always play"
TASK [debug msg=main play] *****************************************************
"msg": "main play"
TASK [debug msg=sub always play] ***********************************************
"msg": "sub always play"
# v2.0.0-0.8.rc3
ansible 2.0.0 (detached HEAD a2120a3d63) last updated 2016/03/17 17:39:15 (GMT +100)
"msg": "main always play"
"msg": "main play"
"msg": "sub always play"
# v2.0.0-0.9.rc4
ansible 2.0.0 (detached HEAD 502ad88506) last updated 2016/03/17 17:39:16 (GMT +100)
"msg": "main always play"
"msg": "main play"
"msg": "sub always play"
# v2.0.0.0-1
ansible 2.0.0.0 (detached HEAD 06ec219982) last updated 2016/03/17 17:39:17 (GMT +100)
"msg": "main always play"
"msg": "main play"
"msg": "sub always play"
# v2.0.0.1-1
ansible 2.0.0.1 (detached HEAD a50d1ea756) last updated 2016/03/17 17:39:19 (GMT +100)
"msg": "main always play"
"msg": "main play"
"msg": "sub always play"
# v2.0.0.2-1
ansible 2.0.0.2 (detached HEAD 7de237c5a1) last updated 2016/03/17 17:39:20 (GMT +100)
"msg": "main always play"
"msg": "main play"
"msg": "sub always play"
# v2.0.1.0-0.1.rc1
ansible 2.0.1.0 (detached HEAD 870a4b8dc1) last updated 2016/03/17 17:39:21 (GMT +100)
"msg": "main always play"
"msg": "main play"
"msg": "sub always play"
# v2.0.1.0-0.2.rc2
ansible 2.0.1.0 (detached HEAD bec698052f) last updated 2016/03/17 17:39:22 (GMT +100)
"msg": "main always play"
"msg": "main play"
"msg": "sub always play"
# v2.0.1.0-1
ansible 2.0.1.0 (detached HEAD bb6cadefa2) last updated 2016/03/17 17:39:23 (GMT +100)
"msg": "main always play"
"msg": "main play"
"msg": "sub always play"
这边也确实与v2.0.0-0.6.rc1、v2.0.0-0.6.rc2的输出有所不同,但内容都是相同的。
尽管在预期情况下”msg”: “sub always play”不应该被执行,但在正确包含的任务中,标签仍然被正确评估。
请原生中文翻译以下内容,不需要标签:
– 无标签
这是最后了。我们尝试运行一个不存在的标签“none”。
如果按照发布说明,包括本身是无法正常工作的,所以包括内部任务应该都不会执行。
[root@controller ansible]# for ver in $(cat target-ver.list) ; do echo "# ${ver}" ; ./change_ver.sh "${ver}" 2&>1 > /dev/null ; ansible --version | grep -E "^ansible" ; ansible-playbook -i inventory/hosts main.yml --tags none | grep msg ; echo "" ; done
# v2.0.0-0.6.rc1
ansible 2.0.0 (detached HEAD f2225395f9) last updated 2016/03/17 17:46:57 (GMT +100)
TASK [debug msg=main always play] **********************************************
"msg": "main always play"
TASK [debug msg=sub always play] ***********************************************
"msg": "sub always play"
# v2.0.0-0.7.rc2
ansible 2.0.0 (detached HEAD cc98528ecb) last updated 2016/03/17 17:46:58 (GMT +100)
TASK [debug msg=main always play] **********************************************
"msg": "main always play"
TASK [debug msg=sub always play] ***********************************************
"msg": "sub always play"
# v2.0.0-0.8.rc3
ansible 2.0.0 (detached HEAD a2120a3d63) last updated 2016/03/17 17:46:59 (GMT +100)
"msg": "main always play"
"msg": "sub always play"
# v2.0.0-0.9.rc4
ansible 2.0.0 (detached HEAD 502ad88506) last updated 2016/03/17 17:47:01 (GMT +100)
"msg": "main always play"
"msg": "sub always play"
# v2.0.0.0-1
ansible 2.0.0.0 (detached HEAD 06ec219982) last updated 2016/03/17 17:47:02 (GMT +100)
"msg": "main always play"
"msg": "sub always play"
# v2.0.0.1-1
ansible 2.0.0.1 (detached HEAD a50d1ea756) last updated 2016/03/17 17:47:03 (GMT +100)
"msg": "main always play"
"msg": "sub always play"
# v2.0.0.2-1
ansible 2.0.0.2 (detached HEAD 7de237c5a1) last updated 2016/03/17 17:47:04 (GMT +100)
"msg": "main always play"
"msg": "sub always play"
# v2.0.1.0-0.1.rc1
ansible 2.0.1.0 (detached HEAD 870a4b8dc1) last updated 2016/03/17 17:47:05 (GMT +100)
"msg": "main always play"
"msg": "sub always play"
# v2.0.1.0-0.2.rc2
ansible 2.0.1.0 (detached HEAD bec698052f) last updated 2016/03/17 17:47:06 (GMT +100)
"msg": "main always play"
"msg": "sub always play"
# v2.0.1.0-1
ansible 2.0.1.0 (detached HEAD bb6cadefa2) last updated 2016/03/17 17:47:08 (GMT +100)
"msg": "main always play"
"msg": "sub always play"
在包括的任务中,应该执行的任务已经被执行,因此似乎正在按照标签指定的行为进行。
总结
关于标签功能,我了解到以下内容。
-
- include内部に付けたタグでも、実行には問題がない
- include内部に付ける場合、–list-tagsでタグが拾えなくなる
关于处理程序也将在以后进行验证,并且
那么原文到底是在说什么?
我会进一步调查这部分内容。 (Wǒ huì zhè .)