将变量传递给包含的Ansible剧本
我想将一个变量传递给包含的Ansible剧本,如下所示:将变量传递给包含的Ansible剧本,ansible,ansible-playbook,ansible-2.x,Ansible,Ansible Playbook,Ansible 2.x,我想将一个变量传递给包含的Ansible剧本,如下所示: --- - hosts: localhost connection: local vars: my_group: foo - include: site.yml hosts={{ my_group }} 然后,在site.yml --- - hosts: "{{ hosts }}" ... 不幸的是,我得到一个错误,说my_group在site.yml中未定义。一定要说: 请注意,当一个剧本包含在另一个剧本中时,不能
---
- hosts: localhost
connection: local
vars:
my_group: foo
- include: site.yml hosts={{ my_group }}
然后,在site.yml
---
- hosts: "{{ hosts }}"
...
不幸的是,我得到一个错误,说my_group
在site.yml
中未定义。一定要说:
请注意,当一个剧本包含在另一个剧本中时,不能进行变量替换
这是我的案子吗?有办法解决吗?您可以使用此语法,但是必须在全局级别定义
my_group
。现在它是第一个剧本的本地版本——从缩进中甚至可以清楚地看到
您可以通过使用--extra vars my_group=foo
运行您的剧本来确认这一点
但一般来说,您似乎想要实现的是使用内存中的清单文件和。以此为例:
- hosts: localhost
gather_facts: no
vars:
target_host: foo
some_other_variable: bar
tasks:
- add_host:
name: "{{ target_host }}"
groups: dynamically_created_hosts
some_other_variable: "{{ some_other_variable }}"
- include: site.yml
使用site.yml
:
---
- hosts: dynamically_created_hosts
tasks:
- debug:
var: some_other_variable
我添加了some_other_variable
,以回答您评论中的问题“如何使一个变量在游戏中全局可用”。它不是全局的,但它作为“hostvar”传递给另一个剧本
根据我在Ansible>=2.1.1.0中看到的(我无法解释为什么),必须为动态内存资源清册指定一个资源清册文件才能工作。在旧版本中,它使用Ansible临时执行,没有清单文件,但现在您必须使用
-i inventory\u文件运行Ansible playbook
,或者通过Ansible.cfg
定义清单文件,为什么不直接运行-include:site.yml hosts=foo
?您还在哪里使用my_group
?或者,您可以使用localhost的host\u var。第一个playbook实际上部署了一个服务器,并将其id放入一个变量中。部署后,我想运行playbook来设置应用程序堆栈,但只限于新创建的机器。谢谢-那么我如何使变量从游戏内部全局可用?好的,您只需使用内存资源清册文件(在我上面提到的基础上)将变量从一个游戏传递到另一个playbook,但是你已经在内存中使用了真实事物的清单(我上面提到的)。我现在正试着写一个例子。。。但基本上你想要的是文档中的内容。@jamix我已经完成了答案。路上遇到了意想不到的障碍,谢谢。关于变量范围,您是对的,但我们通过在附带的剧本中引用hostvars['localhost']['my_group']]
解决了这个问题。我们已经在使用动态数字海洋资源清册,因此特定的add_host
解决方案可能对我们不起作用。