【问题标题】:Saltstack jinja2 natural sortSaltstack jinja2 自然排序
【发布时间】:2018-02-24 05:45:29
【问题描述】:

我有pillar.example:

dnsmasq:
  zones:
    domain_com:
      hosts:
        1.1.1.1: host1
        1.1.1.2: host2
        1.1.1.3: host3
        1.1.1.21: host21

还有我的 sls:

{% for zone in pillar['dnsmasq']['zones'] %}

/tmp/{{ zone }}:
  file.managed:
    - contents:
{% for ip, host in pillar['dnsmasq']['zones'][zone]['hosts']|dictsort  %}
           {{ ip }} {{ host }}
{% endfor %}
{% endfor %}

这会产生:

# cat /tmp/domain_com
1.1.1.1 host1
1.1.1.2 host2
1.1.1.21 host21
1.1.1.3 host3

如何在 saltstack 中使用人工/自然排序,所以我的文件会是这样的:

# cat /tmp/domain_com
1.1.1.1 host1
1.1.1.2 host2
1.1.1.3 host3
1.1.1.21 host21

【问题讨论】:

  • 您想将所有内容都放在一个支柱文件中吗?另一个简单的解决方案是只在主文件上放置一个文件并从您的支柱中引用该文件 - 您可以根据需要对其进行排序,一切都会是“绿色”:)

标签: python jinja2 salt-stack


【解决方案1】:

看起来你需要写一个custom filter,因为似乎没有什么东西可以开箱即用地满足你的需要。

或者您调用 bash 进行救援,然后使用 cmd.runrequire 执行 cat /tmp/domain_com | sort -n > cat /tmp/domain_com。它使状态有点混乱,但保持原状。我更喜欢这种方法。

未经测试的示例

{% for zone in pillar['dnsmasq']['zones'] %}

/tmp/{{ zone }}:
  file.managed:
    - contents:
{% for ip, host in pillar['dnsmasq']['zones'][zone]['hosts'] %}
       {{ ip }} {{ host }}
{% endfor %}

cat /tmp/{{ zone }} | sort -n > /tmp/{{ zone }}:
  cmd.run:
    - require:
      - file: /tmp/{{ zone }}
{% endfor %}

【讨论】:

  • 感谢您的回复;我之前确实尝试过,它有效......但不像你的例子,因为在第一次执行时不会有文件来 cat/sort (jinja首先出现) 之后对文件进行排序有点像catch22,因为salt会总是在下一个 highstate/state.sls 上更新文件,所以输出永远不会是“绿色”。
  • 好吧,在这种情况下,您需要选择第一句话中提到的另一种方法。或者使用onchanges 试试这个略微修改的版本。
  • 算了吧——如果你那样做总会有变化的......
猜你喜欢
  • 1970-01-01
  • 2017-05-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多