我尝试用Jinja解析一个属性文件来设置变量。
我在此文件中有多个类别和子类别,如:
目标是从每个类别设置变量并在for循环中重用它们。 - >例如,我想在每个子类别上安装2个jboss数据源并循环
foobar.properties.yml:
jboss_container:
jboss_container_values:
jboss_container_install: 'True'
jboss_app_name: 'foobar'
jboss_version: 'x.x.x'
...
jboss_datasource_install:
datasource1:
jboss_datasource_install: 'True'
jboss_datasource_name: 'foobar'
jboss_datasource_jta: 'true'
...
datasource2:
jboss_datasource_install: 'True'
...
init.sls:
{% import_yaml 'foobar_properties.yml' as jboss_apps %}
% for jboss_container, jboss_container_values in jboss_apps.iteritems() %}
{% for key, value in jboss_container_values.items() %}
{% if value.get('jboss_container_install') != 'False' %}
# Do stuff - {{ value.jboss_app_name }}
{% endif %}
{% endfor %}
{% endfor %}
{% for jboss_datasource_install, jboss_datasource_install_name in jboss_apps.iteritems() %}
{% for key, value in jboss_datasource_install_name.items() %}
{% if value.get('jboss_datasource_install') != 'False' %}
# Do stuff - {{ value.jboss_datasource_install }}
{% endif %}
{% endfor %}
{% endfor %}
实际上在Salt中出现此错误:
Jinja变量'dict对象'没有属性'jboss_app_name'
任何想法如何做到这一点?
非常感谢:)
答案 0 :(得分:0)
您的外部循环遍历jboss_datasource_install
,内部循环遍历datasource1
。您的if
然后要求
value.get('jboss_container_install')
dict不包含名为jboss_container_install
的键,因此返回None
。由于这不等于'False'
,因此Jinja会尝试插入value.jboss_app_name
,这是错误的来源。
一个简单的解决方法是将if
- Statement重写为:
{% if value.get('jboss_container_install') == 'True' %}
但是你的外环似乎很奇怪。如果您只想迭代jboss_container
,则可以替换
{% for jboss_container, jboss_container_values in jboss_apps.iteritems() %}
{% for key, value in jboss_container_values.items() %}
与
{% for key, value in jboss_apps['jboss_container']['jboss_container_values'].iteritems() %}
答案 1 :(得分:0)
Infortunatly with:
{% for key, value in jboss_apps['jboss_container']['jboss_container_values'].iteritems() %}
{% if value.get('jboss_container_install') == 'True' %}
# Do stuff - {{ value.jboss_app_name }}
我收到了这个错误: 失败:Jinja变量'str object'没有属性'get'
没有If语句,我收到此错误: 失败:Jinja变量'str object'没有属性'jboss_app_name'
如果我尝试使用{{jboss_app_name}}而不是{{value.jboss_app_name}},则会发生同样的错误。