Ansible:已定义变量,但错误显示未定义

Ansible:已定义变量,但错误显示未定义,ansible,Ansible,我有一本ansible剧本,如下所示: --- - name: test variables hosts: all tasks: - name: test command: echo {{ ansible_role_dir }} register: result - name: show result debug: msg="{{ result.stdout }}" #roles: #line12 # - &q

我有一本ansible剧本,如下所示:

---
- name: test variables
  hosts: all
  tasks:
  - name: test
    command: echo {{ ansible_role_dir }}
    register: result
  - name: show result
    debug:
      msg="{{ result.stdout }}"

  #roles:  #line12
  #  - "{{ ansible_role_dir }}/testrole" #line13
变量ansible_role_dir在group_vars/all.yaml下定义


如果我运行注释了第12行和第13行的剧本,它会正确地显示变量的结果。显然,它知道变量ansible_role_dir的定义位置。但如果我取消注释第12行和第13行,它将显示error
error!'ansible_role_dir'未定义
。为什么这次不知道ansible_role_dir是在哪里定义的?

ansible不喜欢没有引号的jinja标记。试试这个:

---
- name: test variables
  hosts: all
  tasks:
  - name: test
    command: "echo {{ ansible_role_dir }}"
    register: result
  - name: show result
    debug:
      msg="{{ result.stdout }}"

  #roles:  #line12
  #  - "{{ ansible_role_dir }}/testrole" #line13
编辑: 对不起,我想我误解了这个问题


你有没有试着用实路径代替var,看看它是否有效?通常ansible的配置中给出了角色路径,我从未见过它们以直接路径运行,
group\u vars/all
stuff将变量分配给主机。解析器还不知道任何主机,它只是试图解析剧本。应该在
ansible.cfg
中设置
roles\u path
变量来执行您正在执行的操作。谢谢Jack,您能提供更多详细信息吗?如果注释掉第12行和第13行,则可以执行
命令:echo{{ansible\u role\u dir}
,这意味着解析器知道{{ansible\u role\u dir},解析器不知道
ansible\u role\u dir
,否。
命令:echo{ansible\u role\u dir}
中的变量替换在运行时完成,为每个主机使用变量。如果您的任务不是
角色
,而是
-include\u-role:“{{ansible\u-role\u-dir}}}/testrole”
,那么它可能会起作用。但是为什么呢?对于不同的主机,您有不同的
testrole
吗?
testrole
是您的角色名称。除非您有特定的非标准设置/目录体系结构,否则不需要任何其他内容来引用它。让上述示例正常工作的唯一方法是直接在命令行上将var设置为额外的_var。你不想那样。如果您的角色有非标准路径(即主目录
.ansible
文件夹和playbook旁边的
角色
文件夹),只需在ansible.cfg(全局或项目中)中设置即可。如果不使用这种方式,则将在ansible.cfg中配置角色路径。谢谢Jack和Zeitounathorthanks Ehud:把真正的路径付诸实践。i、 e.将第13行更改为-../../logrotate/roles/logrotate works虽然系统地引用包含jinja2标记的字符串是一种良好的做法,但只有在ansible中,如果给定的字符串以小胡子(大括号)字符开头,它才是强制性的。在最近的版本中,ansible无论如何都会在这种情况下出错。谢谢,@Zeitounator,我每天都学到新东西:)。从未想过要重新测试这些错误。user389955-我能想到的另一件事是,内联任务和下面的角色调用之间的某些东西会让事情变得更糟。我将查看角色的默认dir、vars dir和main.yml tasks文件。确定,将不使用这种方式,然后在ansible.cfg中配置角色的路径。谢谢你,埃胡德