我在许多应用程序中看到的一种常见模式是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会使用它吗?
答案 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
引用网站网址。