如何读取其他主机的变量? (不是事实)

时间:2015-03-13 12:58:35

标签: ansible configuration-management

我目前正在用ansible取代我们的厨师设置。我们有一组Web服务器和一个数据库服务器。 Web服务器配置为连接到数据库服务器并访问不同的数据库(每个Web服务器1个数据库)。这些数据库应该由db角色创建,其中存在问题。有了厨师,我会查询所有配置数据库的Web服务器并创建它们,但是你不能用ansible来做。我知道,如何读取其他主机的事实,但数据库名称不是事实,而是在web角色的defaults / main.yml中定义,因此在db角色中不可用。

那么从另一个主机读取变量(不是事实)的可行方式是什么?

由于

2 个答案:

答案 0 :(得分:2)

您可能希望查看自Ansible 1.8版开始提供的fact caching feature。它将在剧本的运行之间缓存事实,因此如果您运行您的Web服务器剧本,那么当您运行数据库剧本时,应该缓存并提供有关每个Web服务器数据库的事实。

答案 1 :(得分:2)

在DB角色中,您可以将主机作为您的Web服务器,但是然后使用delegate_to在数据库服务器上完成任务(确保数据库存在,或者某些此类存在)。该任务将针对数据库服务器上的每个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