2017-07-28 21 views
-1

我试着用Jinja解析一个properties文件来设置变量。Saltstack - 解析YAML属性文件来设置Jinja变量 - For循环

我多发的类别和子类别在该文件中,如:

  • jboss_container
    • 一些属性
    • foobar的
  • jboss_datasource_install
    • datasource1
      • PROP1
      • PROP2
    • datasource2
  • jboss_app_deploy
    • APP1
    • APP2

目标是设置每个类别的变量并在循环中重用它们。 - >例如,我想在每个子类别

foobar.properties.yml安装2个的JBoss数据源和循环:

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 %} 

实际上在盐中发生此错误:

神社变量“字典对象有没有属性“jboss_app_name”

任何想法如何做到这一点?

非常感谢:)通过jboss_datasource_install

回答

0

你的外循环迭代,并通过datasource1你的内循环。你if然后请求

value.get('jboss_container_install') 

的字典不包含名为jboss_container_install关键,因此它返回None。并且由于这不等于'False',所以Jinja尝试插入value.jboss_app_name,这是错误来自的地方。

一个简单的解决将是该if语句来改写为:

{% 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() %} 
+0

值== == True的修复方法对我来说非常合适。谢谢 – yrein

+0

但是{%for key,jboss_apps ['jboss_container'] ['jboss_container_values']%}中的值失败,失败:Jinja错误:解压太多值 – yrein

+0

有一个'iteritems()'丢失,我修正了它。 – flyx

0

Infortunatly:

{% 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 }} 

我得到这个错误: 失败:神社变量“海峡对象'没有属性'得到'

没有如果声明,我得到这个错误: 失败:神社变量“海峡对象有没有属性“jboss_app_name”

如果我尝试用{{jboss_app_name}},而不是{{value.jboss_app_name }},同样的错误发生。

+0

我修改了我的if语句:'{%if value ['jboss_container_install“] =='True'%}' 现在我有一个新的错误:**失败:Jinja变量'str对象'没有属性'jboss_container_install'** – yrein

+0

我在Yaml属性文件中遇到了占位符(* /&)的问题。如果我删除占位符它的作品...但我需要改变多个时间相同的变量... – yrein