【问题标题】:jinja to json in Saltjinja to json in Salt
【发布时间】:2021-10-14 07:49:31
【问题描述】:

我在 salt 中有一个 jinja 模板,每次运行 apply.state 时,salt 都会认为它已经改变,而实际上它没有改变。

问题是当文件“更改”时会执行重新配置命令,并且此重新配置会将文件从单行 JSON 更改为行 JSON。例如:

salt 创建文件如下:

{ "key1": { "sub-key1": "sub-value1", "sub-key2": "sub-value2"}, "key2": "value2" }

但是当重新配置命令执行时,它会将文件更改为:

{
  "key1": {
    "sub-key1": "sub-value1",
    "sub-key2": "sub-value2"
  },
  "key2": "value2"
}

有没有办法让 salt 开始将文件创建为格式化的 JSON?

这就是我所拥有的:

{{ gb_server.secrets_file }}:
  file.managed:
    - source: {{ gb_server.secrets_tmpl }}
    - user: {{ gb_server.secure_user }}
    - group: {{ gb_server.secure_user }}
    - mode: 600
    - template: jinja

模板如下:

{%- import_yaml 'gb-server/defaults.yaml' as defaultmap -%}
{%- set  secrets = gb_server_config['secrets'] -%}
{{ secrets|tojson|replace('\\\\n','\\n') }}

这些值在 yaml 格式的支柱中。

理想情况下,生成的 JSON 将按字母顺序对其键进行排序,这样生成文件的内容就不会“改变”,并且重新配置命令不会每次都运行。

有没有办法用盐做到这一点?

谢谢。

【问题讨论】:

  • 根据 saltstack 文档 tojson 作为 jinja2 implementation 可以传递一些额外的格式参数。

标签: json yaml jinja2 salt-stack


【解决方案1】:

看起来file.serialize 会在这里做你想做的事

{{ gb_server.secrets_file }}:
  file.serialize:
    - user: {{ gb_server.secure_user }}
    - group: {{ gb_server.secure_user }}
    - mode: 600
    - data: {{ gb_server.secrets }}
    - serializer: json
    - serializer_opts:
      - indent: 2
      - sort_keys: true

【讨论】:

    猜你喜欢
    • 2019-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2020-06-14
    • 2019-11-05
    • 2023-03-04
    • 1970-01-01
    相关资源
    最近更新 更多