2016-04-13 6 views
2

私は私たちの設定を少しモジュラー化しようとしています。現在のところ、環境ごとにテンプレートファイルがハードコードされており、初期状態ではそれぞれの環境に合わせてjinjaを使用しています。状態を分割し、すべての環境で同じ設定値で維持する必要があるいくつかのデフォルト値を追加しています。ここでSaltStack - 辞書をピラーで使い、テンプレートファイルの値をループする方法は?

は、私の柱の一例です:

/../pillars/amq/amq.sls 
default_routes: 
    Queue1: 
    - from_uri: 'activemq:fromSomeURI1' 
    - process_ref: 'processorName1' 
    - to_uri: 'activemq:toSomeOutURI1' 
    Queue2: 
    - from_uri: 'activemq:fromSomeURI2' 
    - process_ref: 'processorName2' 
    - to_uri: 'activemq:toSomeOutURI2' 

は、ここに私のテンプレートファイルの例です:

/../salt/amq/conf/camel.xml.template 
lines lines lines 
lines lines lines 
... 
     {% for route, args in pillar.get('default_routes', {}).items() %} 

     <route> 
      <from uri="{{ route.from_uri }}"/> 
      <process ref="{{ route.process_ref }}"/> 
      <to uri="{{ route.to_uri }}"/> 
     </route> 

     {% endfor %} 

... 
lines lines lines 
lines lines lines 

私が行うことができるように必要なもの柱に値の辞書を追加でそのデフォルト値のリストをループして、camel.xml.templateからすべての環境にわたるデフォルトルートを構築します。次に、ピラーには、環境に固有の値も格納されます。これは非常に似た方法でファイルに追加します。

ご迷惑をおかけして申し訳ありません。私はさまざまなものを試してみたが、エラーが出たり、デフォルトの行がファイルから削除されたりする。

ありがとうございます!

答えて

5

あなたの柱を定義する方法には、いくつかの矛盾があります。私はあなたがあなたが

default_routes: 
    Queue1: 
    from_uri: 'activemq:fromSomeURI1' 
    process_ref: 'processorName1' 
    to_uri: 'activemq:toSomeOutURI1' 
    Queue2: 
    from_uri: 'activemq:fromSomeURI2' 
    process_ref: 'processorName2' 
    to_uri: 'activemq:toSomeOutURI2' 

しかし、たとえに、あなたのYAMLを変更する必要があり

"default_routes": { 
    "Queue1": { 
     "to_uri": "activemq:toSomeOutURI1", 
     "process_ref": "processorName1", 
     "from_uri": "activemq:fromSomeURI1" 
    }, 
    "Queue2": { 
     "to_uri": "activemq:toSomeOutURI2", 
     "process_ref": "processorName2", 
     "from_uri": "activemq:fromSomeURI2" 
    } 
    } 

のようなものを意味推測する際のPythonにあなたのYAMLを翻訳しthis toolを、使用

"default_routes": { 
     "Queue1": [ 
      { 
      "from_uri": "activemq:fromSomeURI1" 
      }, 
      { 
      "process_ref": "processorName1" 
      }, 
      { 
      "to_uri": "activemq:toSomeOutURI1" 
      } 
     ], 
     "Queue2": [ 
      { 
      "from_uri": "activemq:fromSomeURI2" 
      }, 
      { 
      "process_ref": "processorName2" 
      }, 
      { 
      "to_uri": "activemq:toSomeOutURI2" 
      } 
     ] 
     } 

を与えますあなたのテンプレートに欠陥があります

{% for route, args in pillar.get('default_routes', {}).items() %} 

この行は、辞書にキー名とargsrouteを設定します。だから初めて、routeQueue1となり、argsは残りの辞書になります。

引数は、[OK]をfrom_uri

+0

、感謝のようなキーがあり、実際の辞書ですので、あなたが{{ args.from_uri }}に物事を{{ route.from_uri }}変更する必要があります。私はこれらの更新を行ったが、私はまだforループの行のための出力を得ていない。テンプレートから生成されたファイルは、forループが出力する内容を生成しません。エラーもありません。 – user797963

+0

@ user797963まず、minionに対して 'default_routes'が適切に設定されているかどうかを確認する必要があります。 default_routesピラが適切に設定されているかどうかを 'salt 'your_minion" pillar.items'で明らかにしてください。そうであれば、デバッグの次のステップに進むことができます。 – RedBaron

+0

巨大な助け、ありがとうございました。これは、私が塩柱の上にハンドルをつけるための土台となる仕事を設定し、それがちょうどYAMLがPythonに翻訳して、Jinja経由でアクセスすることができることを私に明示しました(ピラール.itemsコマンドでミニオンがアクセスできる巨大)。 PythonツールのYAMLも非常に貴重です。再度、感謝します! – user797963

関連する問題