验证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è .)

广告
将在 10 秒后关闭
bannerAds