Python 如何在ansible中实现多租户配置解决方案
我在许多应用程序中看到的一种常见模式是。基本上,我正在配置一个应用程序,该应用程序的一些配置值因国家而异。我完成此配置的方法基本上是在yaml中使用“partners”字典:Python 如何在ansible中实现多租户配置解决方案,python,ansible,devops,Python,Ansible,Devops,我在许多应用程序中看到的一种常见模式是。基本上,我正在配置一个应用程序,该应用程序的一些配置值因国家而异。我完成此配置的方法基本上是在yaml中使用“partners”字典: --- partners: us: url: 'http://company.com' uk: url: 'http://company.co.uk' fr: url: 'https://company.fr' ch:
---
partners:
us:
url: 'http://company.com'
uk:
url: 'http://company.co.uk'
fr:
url: 'https://company.fr'
ch:
url: 'https://company.fr'
因此,当服务被识别为来自“我们”的客户时,如果应用程序将url识别为来自“fr”,我们将使用一个不同的url值
然后,在配置模板时,我会执行类似的操作:
template: xxxx
with_items: partners_list
然后,在模板中,我使用partners[item].url
访问变量。因此,使用一个模板,我将根据合作伙伴配置多个具有不同值的文件。但请注意,大多数值是通用的(大多数配置不在partners dict中)
这并不令人满意
我想要的是一个“动态变量”系统来实现类似于“上下文”的东西。比如,一些简单且可移植的东西,可以将上下文加载到主名称空间中。因此,允许我简单地引用“url”,它将自动尝试使用partners[item].url
,如果不存在,则使用普通的url
一种解决方案是使用partners[item].url | default(url)
,但这非常冗长,会导致一些混乱。我不想在模板中添加太多杂乱的内容
另一种可能是类似于jinja中的
“{%set\u context'us'%}”/“{%end\u context%}”
,然后将dict中的变量与一级变量重叠,并使用上下文。我认为这也会令人满意。问题是,我能否以一种可以放入回购协议的方式扩展jinja,而无需触及每个人的ansible/jinja安装?换句话说,我是否可以在ansible中选择另一个模板引擎,这样我就可以编写ansible将使用的扩展jinja(能够查找变量)?如果您将合作伙伴字典更改为哈希列表,您就可以完成您要查找的内容。这是我在支持的应用程序中实现多租户的方法。以下是一种与您的示例相结合的方法:
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
引用站点url。实际上我没有说过,但主要目标是使用普通url
。从item.url
到partners[item].url
没有太大区别。如果我决定从partners
dict中移出一个变量,我不想更改模板。这就是为什么我要重点使用“url”,它将在partners
内部查找,如果失败,则在外部查找。