2017-07-28 36 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