为什么 ansible returns 'ansible_local' 未定义

why ansible returns 'ansible_local' is undefined

我对 ansible_local 变量有疑问: 我在我的 ansible 目标

上定义了以下 facts.d
[role]
version=roles/version

我可以使用 ansible 设置模块或以下 playbook 成功访问此事实

- name: "test"

  hosts: "{{ myhost }}"
  gather_facts: yes

  vars:

    my_role_path: "{{ ansible_local.test.role.version }}"

  tasks:

      - name: debug
        ansible.builtin.debug:
           msg: "{{ my_role_path }}"
      

标准输出:

TASK [debug] **************************************************************************************************
ok: [rhel8-test-2] => {
    "msg": "roles/version"
}

PLAY RECAP **************************************************************************************************
rhel8-test-2               : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

现在,我想使用 var my_role_path 来调用位于我的 ansible 服务器的“my_role_path”文件夹中的名为“echo”的角色。

我添加以下声明:

 tasks:
    - name: debug
      ansible.builtin.debug:
        msg: "{{ my_role_path }}"


  roles:

      - "{{ my_role_path }}/echo"



现在 ansible returns :

ERROR! {{ ansible_local.test.role.version }}: 'ansible_local' is undefined

是我变量的命名空间或范围的问题吗?欢迎提供任何线索。 谢谢。

静态导入(roles:import_role)发生在 playbook 解析时,因此用于导入操作的所有变量(例如在文件名中)必须在此时可用。事实是在剧本执行期间收集的,因此不能这样使用。 (可能可以通过启用事实缓存并确保缓存永不过期来实现这一点,但这是一个脆弱的前景。)

您应该改用 dynamic include,它将在执行期间而不是在解析期间进行处理。

 tasks:
    - name: debug
      ansible.builtin.debug:
        msg: "{{ my_role_path }}"

    - ansible.builtin.include_role:
        name: "{{ my_role_path }}/echo"