2015-11-13 54 views

回答

7

简而言之,这是无法完成的。

register语句用于单个任务的输出存储到变量中。注册变量的确切内容可以变化很大,取决于任务的类型(例如shell任务将包括标准输出从您在注册变量运行命令& stderr输出,而stat任务将提供是文件的细节传递给任务)。

如果您在使用中它的任务的任意数量的包括文件,然后Ansible就没有知道该怎么在你的榜样变量存储的方式。

每个单独的任务中的包含文件可以注册变量,你可以在其他地方引用这些变量,所以真的没有必要,甚至做这样的事情。

+0

有必要,如果你把一个剧本像一个不透明的盒子(即功能)用一个简单的,明确的接口。为什么不应该有剧本的范围变量和返回值? –

+3

Ansible playbook患有我在其他领域特定语言(DSL)中观察到的一些问题,例如Ant,一种用于Java的构建语言。这些语言大多是声明式的,但也有不完整的功能或命令行为。 Ansible剧本已经逐渐填补了必要的空白,但正如这个案例所显示的那样,仍然有空缺。另一种方法是将DSL的设计建立在现有编程语言的基础上,但遵循更窄的语法或仅提供特定的功能。 (YAML和XML不是*编程语言) –

+0

即使在剧本中只有一项任务,这仍然不可能吗?您可以注册该任务的结果,然后将其引回原始剧本吗? – user3270760

3

我能够做到这一点,通过传递一个变量名作为变量在任务中使用。我包含了我的main.yaml,并在下面包含了cgw.yaml文件。

main.yaml:

- name: Create App A CGW 
    include: cgw.yaml 
    vars: 
    bgp_asn: "{{ asn_spoke }}" 
    ip_address: "{{ eip_app_a.public_ip }}" 
    name: cgw-app-a 
    region: "{{ aws_region }}" 
    aws_access_key: "{{ ec2_access_key }}" 
    aws_secret_key: "{{ ec2_secret_key }}" 
    register: cgw_app_a 

cgw.yaml:

- name: "{{ name }}" 
    ec2_customer_gateway: 
    bgp_asn: "{{ bgp_asn }}" 
    ip_address: "{{ ip_address }}" 
    name: "{{ name }}" 
    region: "{{ region }}" 
    aws_access_key: "{{ aws_access_key }}" 
    aws_secret_key: "{{ aws_secret_key }}" 
    register: "{{ register }}" 
相关问题