2016-03-21 51 views
8

我的角色之一有兩種不同的變量類型。一個是公共的(比如軟件包版本和其他良性信息)。這些可以致力於SCM而不用擔心。它還需要一些私人信息(例如API密鑰和其他祕密信息)。我使用ansible-vault加密祕密信息。我的解決方案是將vars/main.yaml用於pulic,vars/vault.yml用於加密的私人信息。使用多個角色可變的var文件

我遇到了一個問題,我不確定什麼是最佳實踐或實際解決方案。看起來只有加載vars/main.yml文件。當然,我不想加密公共信息,所以我尋找解決方案。到目前爲止,我提出的唯一解決方案(在IRC上建議)是創建group_vars/all/vault.yml並在角色名稱前加上所有變量。這是可行的,因爲ansible似乎遞歸加載group_vars下的所有內容。這是行得通的,但在組織上似乎不正確,因爲變量是針對特定的角色,而不是「全球普遍真實」。我也試圖把include: vars/vault.yml納入vars/main.yml,但那並不奏效。

有沒有適當的方法來做到這一點?

回答

4

作爲您角色的首要任務,您可以有一個include_vars task

- include_vars: vault.yml 

我從來沒有嘗試過,但according to the docs金庫加密的文件可以與include_vars模塊一起使用。

保險庫功能可以加密Ansible使用的任何結構化數據文件。這可以包括「group_vars /」或「host_vars /」庫存變量,變量通過「include_vars」或「vars_files」裝[...]

+0

你是否同意el_whictels下面的回答關於這樣的事情不應該包含在角色本身中? – ahawkins

+0

不一定,這取決於你角色的目的是什麼。如果你只是用它來構造你的規則,我想它是可以的。很可能這個API密鑰不會改變,其他人(如在你的項目或公司之外)不會使用這個角色。如果它是被其他人使用的一般角色,那麼當然在角色中對API密鑰進行硬編碼是沒有意義的。但是,在角色中保存Vault文件也是沒有意義的,因爲任何運行它的人都需要知道密碼,因此可以對其進行解碼。 – udondan

+0

不過,人們可能會認爲角色不應該持有任何實施配置。我大部分也在那列火車上。但是,如果你的主要目的是給你的Ansible規則一個結構,那麼這也是一個很好的論點。 – udondan

4

使用Vault是一個好主意。但是你不應該在一個角色中這樣做。

原因是,您的角色只是聲明一個變量及其默認值。劇本將使用這個或設置它的一個值。 如果一個變量是私人的,你應該根據需要聲明變量,但沒有默認值。所以如果有人使用你的角色,他必須聲明變量才能使其運行。

一個解決方案,要求所需的變量是一個簡單的條件:

- fail: msg="Variable foo is required" 
    when: foo is not defined 

所以金庫加密變量的處理是對劇本水平。這是一個不應該扮演角色的實現細節。