Ansible API 2.3.2.0标签传递给playbook但不运行带标签的任务

时间:2017-12-05 14:01:17

标签: ansible ansible-2.x

我成功传递了代码,因为该剧本只运行我指定的任务tags: always

分配我正在传递的标记的任务不会运行。

三项测试任务:

  - name: debug if tag was provided
    debug: var=tags
    tags: always

  - name: if tag restart was provided
    debug: var=tags
    tags: restart

  - name: if no tag was provided
    debug: var=tags

当我将'restart'作为标记传递时,只运行第一个任务,所有三个任务在没有提供标记时运行。我想让中间人在重启时运行。

有没有办法看到剧本看作标签的内容?

调试的输出是:

{
    "tags": "VARIABLE IS NOT DEFINED!"
}

以下是我通过api发送标签的方式

Options = namedtuple('Options', ['connection',  'forks', 'become', 'become_method', 'become_user', 'check',
                                 'listhosts', 'listtasks', 'listtags', 'syntax', 'module_path', 'diff', 'tags'])
options = Options(connection='ssh', forks=5, become=None, become_method=None, become_user=None, check=False,
                  listhosts=False, listtasks=False, listtags=False, syntax=False, module_path="", diff=True, tags=_tag)

PlaybookExecutor(playbooks=[playbook_path], inventory=inventory, variable_manager=variable_manager,
                            loader=loader, options=options, passwords=passwords)

_tag 是一个字符串

3 个答案:

答案 0 :(得分:0)

alwaysspecial tag

  

除非特别跳过(--skip-tags always

,否则会有一个始终运行任务的特殊always标记

因此,如果您在指定restart标记时不希望它运行,请为第一个任务使用不同的标记名称。

答案 1 :(得分:0)

  

有没有办法看到剧本看作标签的内容?

由于Ansible 2.5(目前在GitHub上作为devel分支提供),您可以使用新的magic variable ansible_run_tags

例如ansible-playbook playbook.yml --tags restart

TASK [debug if tag was provided] ***************************************************************************************************************
ok: [localhost] => {
    "ansible_run_tags": [
        "restart"
    ]
}

TASK [if tag restart was provided] *************************************************************************************************************
ok: [localhost] => {
    "ansible_run_tags": [
        "restart"
    ]
}

如果您未为ansible-playbook提供代码,则此变量的值为all

TASK [debug if tag was provided] ***************************************************************************************************************
ok: [localhost] => {
    "ansible_run_tags": [
        "all"
    ]
}

TASK [if tag restart was provided] *************************************************************************************************************
ok: [localhost] => {
    "ansible_run_tags": [
        "all"
    ]
}

TASK [if no tag was provided] ******************************************************************************************************************
ok: [localhost] => {
    "ansible_run_tags": [
        "all"
    ]
}

答案 2 :(得分:0)

看起来问题是我将标记作为字符串传递,API将其作为列表读取。当我将标记设置为python集时,它运行时没有问题

TASK = os.environ['TASK'].lower()
if TASK in authorized_tags:
    _tasks = 'none'
    _tag = {TASK}
    execute_playbook()