Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在ansible中实现多租户配置解决方案_Python_Ansible_Devops - Fatal编程技术网

Python 如何在ansible中实现多租户配置解决方案

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:

我在许多应用程序中看到的一种常见模式是。基本上,我正在配置一个应用程序,该应用程序的一些配置值因国家而异。我完成此配置的方法基本上是在yaml中使用“partners”字典:

---
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
内部查找,如果失败,则在外部查找。