2017-10-18 50 views
0

我的手册包含另一个主题时遇到了一些问题。我使用剧本来推出一个干净的虚拟机。之后,我想运行另一个剧本,以某种方式配置虚拟机。我已将新主机添加到库存并具有ssh访问权限。包含带有变量名称的演示手册,该变量名称在另一个主机上定义

我们的团队为每个servertype建立了一个项目。我在早期阶段(针对本地主机运行)检索了正确的项目路径,并使用set_fact将其置于“servertype_project”中。 我希望这个工作(在剧本层面,针对新的虚拟机上运行):

- name: "Run servertype playbook ({{ project }}) on VM" 
vars: 
    project: "{{ hostvars['localhost']['servertype_project'] }}" 
include: "{{ project }}/ansible/playbook.yml" 

但此消息未通过语法检查:

错误! {{HOSTVARS [ '本地主机'] [ 'servertype_project']}}: 'HOSTVARS' 是未定义

我可以检索正确的字符串,如果我指的是{{HOSTVARS [ '本地主机'] [ 'servertype_project'] }}从一个任务中,而不是从我可以包含另一个剧本的级别。

由于该值是在运行时确定的,我认为set_fact是存储变量的正确方法,但该方法是主机特定的。有什么办法可以将它传递给该主机?还是我错过了一些全球性的类似var的选项?

回答

1

你不会错过任何东西。这是预料之中的。事实是必然的主机和hostvars是不可访问的剧本范围。

没有办法定义在include声明中可访问的变量,除了在CLI中将其作为extra-vars参数传递。但是,如果您使用内存中的清单(这是一个合理的假设),那么调用另一个ansible-playbook实例就没有问题了。

我认为你应该重新考虑你的流程,而不是包括一个动态定义的播放,有静态定义的播放运行对内存中的库存,并有条件地包括角色。

相关问题