2015-03-13 19 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