Ansible 导入角色有条件地运行

问题描述

我正在编写一个父 ansible 角色,该角色通过 import_role 运行另一个角色。这个同级角色 (staticdev.pyenv) 仅在传递参数 pyenv_python_versions 时运行的想法,否则会被跳过。

根据official documentation,我尝试了以下方法

父/任务/main.yml

---
- name: Install pyenv
  import_role:
    name: staticdev.pyenv
  vars:
    pyenv_owner: "{{ ansible_env.USER }}"
    pyenv_path: "{{ ansible_env.HOME }}/pyenv"
    pyenv_global: "{{ pyenv_global }}"
    pyenv_python_versions: "{{ pyenv_python_versions }}"
    pyenv_virtualenvs: []
  when: pyenv_python_versions

我目前使用的是 ansible 4.1.0(核心 2.11.1),当我在 Debian 11 上测试它时(图片:cisagov/docker-debian11-ansible:latest)它无论如何都会执行这个角色,即使没有任何价值pyenv_python_versionswhen 没有被考虑,我也尝试过 include_role。可以在 here 中找到完整的日志。

有什么想法吗?

更新:按照@lonetwin 的建议,将条件 when 从更改为 pyenv_python_versions。

解决方法

问题在于角色导入是从导入的角色(pyenv_global、pyenv_python_versionspyenv_virtualenvs)复制变量,在这种情况下,您只需省略导入的角色参数(如果您为它们创建新的默认值,它们将被覆盖)。

解决方案:

---
- name: Install pyenv
  import_role:
    name: staticdev.pyenv
  vars:
    pyenv_owner: "{{ ansible_env.USER }}"
    pyenv_path: "{{ ansible_env.HOME }}/pyenv"
  when: pyenv_python_versions