2015-11-13 53 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 }}" 
相關問題