SaltStack - 如何在支柱中使用字典并循环遍历模板文件中的这些值?

use*_*963 2 python configuration-management salt-stack

我正在尝试使我们的配置更加模块化.目前,我们在每个环境中都有大多数硬编码模板文件,这些文件与init状态中的jinja匹配.我正在拆分状态,配置,并添加一些需要在所有环境中以相同配置值维护的默认值.

这是我的支柱的一个例子:

/../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'
Run Code Online (Sandbox Code Playgroud)

这是我的模板文件的示例:

/../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
Run Code Online (Sandbox Code Playgroud)

我需要做的是向支柱添加值字典,并循环遍历默认值列表,从camel.xml.template中构建所有环境中的默认路由.然后,支柱还将存储特定于环境的值,我将以非常类似的方式将其添加到文件中.

任何帮助深表感谢.我尝试过很多不同的东西,要么出错,要么从文件中删除默认行.

谢谢!

Red*_*ron 6

您如何定义支柱存在一些不一致之处.

使用此工具,将您的YAML翻译为Python

    "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"
          }
        ]
      }
Run Code Online (Sandbox Code Playgroud)

当我认为你的意思是什么时

"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"
    }
  }
Run Code Online (Sandbox Code Playgroud)

你应该把你的YAML改成

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'
Run Code Online (Sandbox Code Playgroud)

但即使这样,你的模板也存在缺陷

{% for route, args in pillar.get('default_routes', {}).items() %}
Run Code Online (Sandbox Code Playgroud)

此行将设置route为键名和args字典.因此,对于第一次,routeQueue1args将字典的其余部分.

你必须改变一些东西{{ route.from_uri }},{{ args.from_uri }}因为args是具有键的实际字典from_uri