2015-03-13 39 views
3

我目前正在用ansible替換我們的廚師設置。我們有一組Web服務器和一個數據庫服務器。 Web服務器被配置爲連接到數據庫服務器並訪問不同的數據庫(每個Web服務器1個數據庫)。這些數據庫應該由db角色創建,其中存在問題。有了廚師,我會查詢所有Web服務器的配置數據庫並創建這些服務器,但是你無法做到這一點。我知道,如何讀取其他主機的事實,但數據庫名稱不是事實,而是在Web角色的defaults/main.yml中定義的,因此它在db角色中不可用。如何讀取其他主機的變量? (不是事實)

那麼從另一個主機讀取一個變量(而不是事實)的有效方法是什麼?

感謝

回答

2

你可能想看看fact caching feature這一直是可以作爲的Ansible的1.8版本。它會將事實緩存在劇本之間,所以如果你運行你的網絡服務器劇本,那麼當你運行數據庫劇本時,關於每個網絡服務器數據庫的事實應該被緩存和可用。

2

在數據庫角色中,您可以使用主機作爲您的Web服務器,但隨後使用delegate_to在DB服務器上創建任務(確保數據庫的存在等)。該任務將針對數據庫服務器上的每個Web服務器運行。在這裏看到的例子: http://docs.ansible.com/playbooks_delegation.html

編輯:下面是一個簡單的例子:

# db_role/tasks/main.yml 
--- 
- name: Make sure web server DBs exist 
    hosts: webserver 
    tasks: 
    # This is contrived. I presume you have some way of knowing 
    # the DB(s) name for each web host 
    # This can come from host vars, discovered facts, etc 
    - set_facts: 
     db_name: {{ inventory_hostname}} 

    - name: Script that makes sure DB is there 
     command: create_db_if_not_exist.sh {{ db_name }} 
     delegate_to: db-server 
+0

我會嘗試這一點,並提出報告。謝謝 – CQQL 2015-03-19 22:13:09