在Ansible中导入时,是否可以引用组变量?

时间:2019-08-07 23:09:17

标签: ansible jinja2 ansible-issue

在我的Ansible脚本中,导入剧本时是否可以引用路径变量?

我在Ansible文件层次结构中设置了一些指向不同文件的路径的变量,在导入并包括剧本和变量文件时要参考这些变量。路径变量是在group_vars / all /目录中的文件中定义的,因此它们会自动加载。

当我尝试导入剧本并引用我的一个路径变量时,出现错误,提示未定义该变量。

这是一个例子。我创建了一个名为play.yml的简单剧本文件:

---
- name: Include playbook
  import_playbook: "{{ base_dir }}/foo.yml"

剧本会在变量base_dir定义的目录中导入另一个名为foo.yml的剧本。

这是foo.yml:

---
- name:
  hosts: localhost
  gather_facts: no
  tasks:
    - name: Check that group_vars/all variable loaded
      debug:
        var: test_dir

在group_vars / all /目录中,我在名为dirs.yml的文件中定义base_dir和test_dir:

base_dir: "{{ playbook_dir }}"
test_dir: "{{ base_dir }}/foo"

当我跑步时:

ansible-playbook include.yml

我希望Ansible将导入并运行foo.yml,该命令会打印出引用base_dir的test_dir变量的值。

相反,我得到了错误:

ERROR! 'base_dir' is undefined

如果我跑步:

ansible-playbook include.yml --extra-vars base_dir="."

然后按预期运行。

似乎导入是在装入group_vars变量之前进行的。

如果为true,这是不方便的,因为我想在可以由多个剧本引用的全局变量中定义文件路径,而不是在所有剧本中对其进行硬编码。有没有解决这个问题的方法?

1 个答案:

答案 0 :(得分:0)

  

问:“我想在可以被多个剧本引用的全局变量中定义文件路径,而不是在所有剧本中对其进行硬编码。有没有解决此问题的方法?

A:可以合理地期望在导入剧本之前可能已经加载了group_vars / all。但是,无论是剧本还是与清单相关的group_vars / all都无法采用这种方式。此主题(locked and limited conversation to collaborators on Apr 27)上有封闭的问题,例如playbook_vars_root doesn't work for playbook imports #34239

没有解决方法。这些变量的scope是游戏。在游戏中认识主机之前,无法加载 goup_vars

FWIW。 ansible-runner是一种以系统且灵活的方式运行剧本的选项。参见Runner Input Directory HierarchyRunning Playbooks