在我的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,这是不方便的,因为我想在可以由多个剧本引用的全局变量中定义文件路径,而不是在所有剧本中对其进行硬编码。有没有解决这个问题的方法?
答案 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 Hierarchy和Running Playbooks。