让我的剧本包含另一部剧我遇到了一些麻烦。我使用playbook推出一个干净的VM。之后,我想运行另一个剧本,以某种方式配置VM。我已将新主机添加到广告资源,并具有ssh访问权限。
我们的团队已根据servertype建立了一个项目。我在早期阶段(针对localhost运行)检索了项目的正确路径,并使用set_fact将其放入" servertype_project"。 我希望这可以工作(在Playbook级别,针对新VM运行):
- name: "Run servertype playbook ({{ project }}) on VM"
vars:
project: "{{ hostvars['localhost']['servertype_project'] }}"
include: "{{ project }}/ansible/playbook.yml"
但它没有通过以下消息进行语法检查:
ERROR! {{hostvars [' localhost'] [' servertype_project']}}:' hostvars'未定义
如果我从任务中引用{{hostvars [' localhost'] [' servertype_project']}},我可以检索正确的字符串,但不能从我可以加入另一本剧本。
由于值是在运行时确定的,我认为set_fact是存储变量的正确方法,但是那个是特定于主机的。我有什么方法可以将它传递给这个主机吗?或者我是否错过了一些类似全局变量的选项?
答案 0 :(得分:2)
你没有遗漏任何东西。这是预料之中的。事实与主机绑定,并且在剧本范围内无法访问hostvars
。
除了在CLI中将其作为include
参数传递外,无法定义可在extra-vars
声明中访问的变量。但是如果你使用内存中的库存(这是一个合理的假设),那么调用另一个ansible-playbook
实例是不可能的。
我认为你应该重新考虑你的流程,而不是包含一个动态定义的游戏,对你的内存库存运行静态定义的游戏,并有条件地包括角色。