2016-07-02 79 views
3

我目前正在從Puppet轉換到Ansible,並且非常好。但我想盡可能地自動化。在Ansible劇本中使用vars_files中的with_items

我正在嘗試使用vars_files中的with_items循環來根據給定的項目列表加載變量文件。 Ansible抱怨的語法,我似乎無法找到類似的解決方案的例子,只有在內部任務和角色使用with_items的例子。

例如:

vars_files: 
    - ["vars/{{ item }}-{{ ansible_fqdn }}.yml", "vars/{{ item }}-{{ system_environment }}.yml", "vars/{{ item }}.yml"] 
    with_items: 
     - php 
     - nginx 

這裏的目標是循環的,只要有使用數組後備的下一個項目中with_items項目的第二行,如果它不能找到指定的文件(這工作)。

不知道這是否可能,但我想問之前採取另一個方向。

+0

如果你在with_items行失去縮進,它會工作嗎? – ydaetskcoR

+0

不,仍然給我一個語法錯誤。也許這完全不可能。 –

回答

5

with_items或者一般來說所有循環都是任務的一個特徵。 vars_files雖然不是任務。所以它不會按照你的方式工作,簡短的回答是:這是不可能的。

我不知道一個乾淨的方式來解決您的確切問題。 A custom vars plugin可能是一個選項。但是瓦爾插件在全球範圍內工作,而你的瓦爾似乎被用於角色。

A custom lookup plugin可能是一個解決方案,如果解決這個任務級別是一個選項。查找插件接受您的輸入,檢查文件的存在並返回需要包含的文件的數組。然後這可以與include_vars module一起使用。

- include_vars: "{{ item }}" 
    with_my_custom_plugin: 
    - php 
    - nginx 

一個醜陋的解決方案是將with_items循環用with_first_found循環結合起來。雖然,因爲你不能直接嵌套循環,你需要使用include。

- include: include_vars.yml 
    with_items: 
    - php 
    - nginx 

而且裏面include_vars.yml然後你可以使用with_first_foundinclude_vars module

- include_vars: "{{ item }}" 
    with_first_found: 
    - vars/{{ item }}-{{ ansible_fqdn }}.yml 
    - vars/{{ item }}-{{ system_environment }}.yml 
    - vars/{{ item }}.yml 
+0

儘管我在清單文件,group_vars和host_vars中找到了使用分組主機的替代解決方案,但我將您的答案標記爲已接受,因爲它提供了足夠的替代方案以供您選擇。如果我需要根據FQDN,環境或任何其他參數設置變量,那麼'include'解決方案就可以很好地工作。謝謝! –

+0

如果您發佈了答案並接受了它,我不會介意。基於組/主機 - 變量的解決方案更清潔。 – udondan

0

在一個單獨的回答把這個對組和主機變量的解決方案,我最終與(CC @udondan)想出了擴大。

基本上,我將我的庫存文件中的所有主機分組在幾個子組和父組之間,無論如何。然後,我創建文件組瓦爾每當適用所以它遵循優先一定的順序(首先是最高,覆蓋所有其他,上適用於所有的主機和可重寫環比下滑):

task vars > playbook vars > host_vars > web/database-local > local > web/database > all

那方式我可以定義所有主機使用的變量(所有),只是Web /數據庫(主要是生產值),所有本地服務器(本地組),所有本地Web /數據庫服務器等等,或每個主機(標準host_vars )。當然,劇本和任務變量會進一步覆蓋這些。所有這些遵循Ansible準則。

本地庫存的例子(替換爲您的主機名或IP默認情況下,儘可能多的添加爲你每組一樣,X-地方,如果這將是生產庫存可省略):

[web-local] 
default 

[database-local] 
default 

[local:children] 
web-local 
database-local 

[web:children] 
web-local 

[database:children] 
database-local 

然後我group_vars文件夾爲每個廣告組的目錄和變量拆分後的文件,以保持它的結構(可能只是有一個database-local.yaml文件爲database-local組實例,而不是文件夾和分裂YAML文件):

group_vars/ 
    all/ 
     always_applied_variables.yaml 
     swap.yaml 
    web/ 
    database/ 
     database_only_variables.yaml 
    database-production/ 
     production_database_variables.yaml 
    production/ 
     random_production_only_variables.yaml 
    local/ 
     users.yaml 
    web-local/ 
    database-local/ 
     local_database_variables.yaml 
host_vars/ 
    default/ 
     php.yaml 
     mysql.yaml 
     other_specific_host_variables.yaml 

希望這有點清楚。我很樂意回答任何問題。