包含带有变量名称的演示手册,该变量名称在另一个主机上定义
问题描述:
我的手册包含另一个主题时遇到了一些问题。我使用剧本来推出一个干净的虚拟机。之后,我想运行另一个剧本,以某种方式配置虚拟机。我已将新主机添加到库存并具有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的选项?
答
你不会错过任何东西。这是预料之中的。事实是必然的主机和hostvars
是不可访问的剧本范围。
没有办法定义在include
声明中可访问的变量,除了在CLI中将其作为extra-vars
参数传递。但是,如果您使用内存中的清单(这是一个合理的假设),那么调用另一个ansible-playbook
实例就没有问题了。
我认为你应该重新考虑你的流程,而不是包括一个动态定义的播放,有静态定义的播放运行对内存中的库存,并有条件地包括角色。