2017-10-18 55 views
0

我的手冊包含另一個主題時遇到了一些問題。我使用劇本來推出一個乾淨的虛擬機。之後,我想運行另一個劇本,以某種方式配置虛擬機。我已將新主機添加到庫存並具有ssh訪問權限。包含帶有變量名稱的演示手冊,該變量名稱在另一個主機上定義

我們的團隊爲每個servertype建立了一個項目。我在早期階段(針對本地主機運行)檢索了正確的項目路徑,並使用set_fact將其置於「servertype_project」中。 我希望這個工作(在劇本層面,針對新的虛擬機上運行):

- name: "Run servertype playbook ({{ project }}) on VM" 
vars: 
    project: "{{ hostvars['localhost']['servertype_project'] }}" 
include: "{{ project }}/ansible/playbook.yml" 

但此消息未通過語法檢查:

錯誤! {{HOSTVARS [ '本地主機'] [ 'servertype_project']}}: 'HOSTVARS' 是未定義

我可以檢索正確的字符串,如果我指的是{{HOSTVARS [ '本地主機'] [ 'servertype_project'] }}從一個任務中,而不是從我可以包含另一個劇本的級別。

由於該值是在運行時確定的,我認爲set_fact是存儲變量的正確方法,但該方法是主機特定的。有什麼辦法可以將它傳遞給該主機?還是我錯過了一些全球性的類似var的選項?

回答

1

你不會錯過任何東西。這是預料之中的。事實是必然的主機和hostvars是不可訪問的劇本範圍。

沒有辦法定義在include聲明中可訪問的變量,除了在CLI中將其作爲extra-vars參數傳遞。但是,如果您使用內存中的清單(這是一個合理的假設),那麼調用另一個ansible-playbook實例就沒有問題了。

我認爲你應該重新考慮你的流程,而不是包括一個動態定義的播放,有靜態定義的播放運行對內存中的庫存,並有條件地包括角色。