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)
标签在运行时不可用。标签定义将执行哪些任务。您可以使用它将标签转换为事实:
- 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)
但对我来说,这感觉不对。这不是标签的目的。标签不应定义主机上安装的软件。这应该在您的组/主机变量中定义。然后,标签应该简单地限制执行任务的子集,例如更新包、重新启动服务等。
除了标签之外,您还可以使用额外变量来存档相同的内容。这也给了你更多的控制权。如果您在未提供任何标签的情况下调用剧本,则将执行所有任务。