【问题标题】:Render variables from a file从文件中渲染变量
【发布时间】:2019-03-04 08:09:37
【问题描述】:

有一个文件 api.yml 包含 ansible 的配置:

config/application.properties:
 server.port: 6081
 system.default.lang: rus
 api.pdd.url: "http://{{ stage['PDD'] }}"
 api.policy.alias: "integration"
 api.order.url: "http://{{ stage['Order'] }}
 api.foo.url: "http://{{ stage['FOO'] }}

有一个 stage.yml 包含键和阶段值:

default_node:
 Order: '172.16.100.40:8811'
 PDD: '172.16.100.41:8090'
 FOO: '10.100.0.11:3165

其实这些文件比较大,'stage'变量也很多。 我的任务是解析 api.yml 并将其转换为 properties-config。问题是我无法拉出值{{stage ['value']}}我正在尝试这样做:

stream = yaml.load(open('api.yml'))
result={}
result.update(stream['config/application.properties'])
context= yaml.load(open('stage.yml'))
stage={}
stage.update(context['default_node'])
text = '{% for items in result | dictsort(true)%}  {{ items[0] }} = {{
     items[1] }} {%endfor%}'

template = Template(text)
properti = (template.render(result=result, stage=stage))

在输出我得到这个:

server.port = 6081
system.default.lang = rus
api.pdd.url = http://{{ stage['PDD'] }}
api.policy.alias = integration
api.order.url = http://{{ stage['Order'] }}
api.foo.url = http://{{ stage['FOO'] }}

你需要得到这个:

server.port = 6081
system.default.lang = rus
api.pdd.url = 172.16.100.41:8090
api.policy.alias = "integration"
api.order.url = 172.16.100.40:8811
api.foo.url = 10.100.0.11:3165

我可以用 jinja 或 ansible lib 做吗? 对不起我的英语不好

【问题讨论】:

  • 你的问题中有很多python,但最后你问的是jinja2;你的问题是关于 python 还是 ansible,因为答案会发生巨大变化?

标签: python ansible yaml jinja2 render


【解决方案1】:

按照这种方法,您需要将api.yml 视为模板本身并进行渲染。否则,jinja2 会将其视为属性的简单值。这样的事情会做:

import yaml
from jinja2 import Environment, Template 
import json  


stream = yaml.load(open('api.yml'))
result={}
result.update(stream['config/application.properties'])
context= yaml.load(open('stage.yml'))
stage={}
stage.update(context['default_node'])
text = """{% for items in result | dictsort(true)%}  {{ items[0] }} = {{ items[1] }} {%endfor%}"""

#Then render the results dic as well
resultsTemplate = Template(json.dumps(result))
resultsRendered = json.loads( resultsTemplate.render(stage=stage) )

template = Template(text) 
properti = (template.render(result=resultsRendered, stage=stage))

在此之后,您将在 properti var: 中看到想要的值:

'  api.foo.url = http://10.100.0.11:3165   api.order.url = http://172.16.100.40:8811   api.pdd.url = http://172.16.100.41:8090   api.policy.alias = integration   server.port = 6081   system.default.lang = rus'

如果 jinja2 能够递归渲染就好了。也许花一些时间来处理Environment 的全局和共享模式,这是可以实现的。

希望这会有所帮助。

【讨论】:

  • 非常感谢正是您所需要的
猜你喜欢
  • 1970-01-01
  • 2015-04-08
  • 2021-11-06
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-03
相关资源
最近更新 更多