如何在ansible

时间:2015-10-22 15:12:39

标签: python ansible devops

我在许多应用程序中看到的一种常见模式是multitenancy。基本上,我正在配置一个应用程序,它的某些配置值根据国家/地区而有所不同。我设法完成此配置的方式基本上是在yaml中使用“合作伙伴”字典:

---
partners:
    us: 
        url: 'http://company.com'
    uk: 
        url: 'http://company.co.uk'
    fr: 
        url: 'https://company.fr'
    ch: 
        url: 'https://company.fr'

因此,当为来自“我们”的客户提供服务时,如果应用程序将其标识为来自“fr”,则我们将使用一个值为url的值。

然后,在使用模板进行配置时,我会执行以下操作:

template:  xxxx
with_items: partners_list

然后,在模板中,我使用partners[item].url来访问变量。因此,使用一个模板,我根据合作伙伴配置具有不同值的多个文件。考虑到大多数值是常见的(大多数配置不在合作伙伴字典中)。

这不太令人满意。

我想要的是一个“动态变量”系统来实现类似于“上下文”的东西。就像一些简单易用的东西,可以将上下文加载到主命名空间中。所以允许我简单地引用“url”的内容会自动尝试使用partners[item].url,如果不存在,请使用普通url

一种解决方案是使用partners[item].url | default(url),但这非常冗长,导致一些混乱恕我直言。我宁愿不在模板中添加这么多的混乱。

另一种可能性是jinja中的"{% set_context 'us' %}" // "{% end_context %}",然后将dict中的变量与第一级变量重叠,并带有上下文。我认为这也是令人满意的。问题是,我可以以可以放入我的仓库的方式扩展jinja,而不需要触及每个人的ansible / jinja安装吗?换句话说,我可以在ansible中选择另一个模板引擎,所以我可以编写一个扩展的jinja(能够查找变量),ansible会使用它吗?

1 个答案:

答案 0 :(得分:0)

如果您将合作伙伴字典更改为哈希列表,则可以完成您要查找的内容。这是我在我支持的应用程序中实现多租户的方式。以下是您的示例中的一种方法:

partners:
  - name: us 
    url: 'http://company.com'
  - name: uk
    url: 'http://company.co.uk'
  - name: fr 
    url: 'https://company.fr'
  - name: ch 
    url: 'https://company.fr'

渲染模板:

template:  xxxx
with_items: partners

现在,您可以在模板中通过item.url引用网站网址。