Ansible - 在运行时访问标签

sta*_*cks 4 jinja2 ansible ansible-playbook

如何在运行时访问通过命令行传递给 ansible playbook 的标签和跳过标签?

我正在尝试实现一个with_items循环,该循环可以使用when子句跳过或包含基于标签/跳过标签的项目。上一个 SO 问题涉及同一主题,但采用了不同的方法。我会在每次迭代中评估标签的存在。

例如:

-  name: Build docker images
    docker_image:
        name: "{{item.name}}"
        path: "{{build_folder}}/dockerfiles/{{item.name}}"
        dockerfile: "{{item.name}}.Dockerfile"
        state: build
        tag: "{{private_docker_registry}}/{{item.name}}"
    when: "{{ansible_host_vars['tags'][image1]}}" is defined
    with_items: 
        - image1
        - image2
        - image3
Run Code Online (Sandbox Code Playgroud)

小智 5

从 2.5 开始,ansible 添加了一些在运行时访问的魔法变量。其中一些是ansible_run_tags。这似乎是你所需要的。

参考:Ansible 2.5 更改日志


udo*_*dan 2

标签在运行时不可用。标签定义将执行哪些任务。您可以使用它将标签转换为事实:

- set_fact:
    image1: True
  tags: image1

- set_fact:
    image2: True
  tags: image2

- set_fact:
    image3: True
  tags: image3
Run Code Online (Sandbox Code Playgroud)

现在您有了与您的标签相对应的事实,并且可以在您的情况下使用它们:

...
when: hostvars[inventory_hostname][item] == True
with_items:
  - image1
  - image2
  - image3
Run Code Online (Sandbox Code Playgroud)

但对我来说,这感觉不对。这不是标签的目的。标签不应定义主机上安装的软件。这应该在您的组/主机变量中定义。然后,标签应该简单地限制执行任务的子集,例如更新包、重新启动服务等。

除了标签之外,您还可以使用额外变量来存档相同的内容。这也给了你更多的控制权。如果您在未提供任何标签的情况下调用剧本,则将执行所有任务。