将变量传递给包含的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中未定义。一定要说: 请注意,当一个剧本包含在另一个剧本中时,不能

我想将一个变量传递给包含的Ansible剧本,如下所示:

---
- 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
解决方案可能对我们不起作用。