2017-02-25 92 views
0

如何在不引起遞歸循環的情況下,在其他變量中重用變量Ansible(2.1.x)?角色默認變量中的Ansible遞歸循環

設置

考慮這個roles/<role>/defaults/main.yml文件:

--- 
liquibase: 
    version: "3.5.3" 
    download_file: "liquibase-{{liquibase.version}}-bin.tar.gz" 

    # I also tried this alternative with a similar result: 
    # download_file: "liquibase-{{liquibase[version]}}-bin.tar.gz 
... 

roles/<role>tasks/main.yml文件:

--- 
- name: Liquibase | Download 
    debug: 
    msg: "download_file: {{liquibase.download_file}}" 
... 

錯誤

我期望變量liquibase.download_file具有值liquibase-3.5.3-bin.tar.gz但是當我跑步使用這個角色的劇本,我得到以下錯誤:

... 
TASK [liquibase : Liquibase | Download] ******************************************* 
fatal: [localhost]: FAILED! => {"failed": true, "msg": "...: recursive loop detected in template string: liquibase-{{liquibase.version}}-bin.tar.gz"} 
... 

我的使用案例

很顯然,我想下載Liquibase,我希望讓角色的用戶決定使用哪個版本。我也想給出完全覆蓋下載位置(文件,URL等)的可能性,例如使用公司的FTP服務器或類似的。

回答

3

不支持在同一父代代碼中引用其他代碼鍵。看到這個issue

只能重構你的變量,使versiondownload_file在不同變量的樹木,如:

liquibase_version: "3.5.3" 
liquibase_download_file: "liquibase-{{liquibase_version}}-bin.tar.gz" 

附:如果這是您的角色的默認值,將liquibase_version分隔爲獨立變量會使您更加敏銳。這樣用戶將不得不重新定義liquibase_versionliquibase_download_file將得到更改;而在字典的情況下(如在你的問題),你不能只覆蓋一個鍵,用戶必須設置完整的字典與versiondownload_file鍵。

+0

這對於提出的問題是正確的,但是PS是不準確的:用戶可以將Ansible的'hash_behaviour'配置爲'merge',((參見這裏的文檔)(http://docs.ansible.com/ansible /latest/intro_configuration.html#hash-behaviour)) –

+0

好的說法,但不推薦更改'hash_behaviour',所以你不應該編寫需要這個設置的角色(記住你寫的角色可以在整個劇本中重用)。 –