盐状态渲染:我可以看到Jinja相的输出吗?

时间:2019-07-16 20:55:31

标签: salt-stack

问题:

在尝试解析为YAML之前,有什么方法可以查看Jinja阶段的输出吗?

背景:

我试图调试出现此错误的Salt问题:

local:
Data failed to compile:
----------
Rendering SLS ':test.sls' failed: mapping values are not allowed in this context

不是很有帮助:没有行号?什么是“映射值”?等

问题归结为这样的事情:

{%- for x in [1, 2] -%}
Test {{ x }}:
  cmd.run:
    - name: echo Test {{ x }}
{%- endfor -%}

一个经验丰富的Salt人会意识到我已经弄乱了空格,因此Jinja在下面产生了输出:

Test 1:
  cmd.run:
    - name: echo Test 1 Test 2:
  cmd.run:
    - name: echo Test 2

但是,要找到一个复杂的状态集却没有有关问题发生位置的信息,也没有清楚描述问题的根源,这真令人沮丧。

在调试过程中,我了解到可以使用slsutil.renderer来获得YAML树,如下所示:

% salt-call --local slsutil.renderer `pwd`/test.sls 'jinja'

local:
    ----------
    Test 1:
        ----------
        cmd.run:
            |_
              ----------
              name:
                  echo Test 1
    Test 2:
        ----------
        cmd.run:
            |_
              ----------
              name:
                  echo Test 2

但这当然要求YAML有效。那么如何获得Salt来输出模板,如上面的第三个代码片段中所述,在对Jinja进行评估但在Salt尝试将其解析为YAML之后?

1 个答案:

答案 0 :(得分:0)

哦,当我重新审视这一点时,我学到了一些新东西。我相信答案是cp.get_template

测试文件:

% cat test.sls

{%- for x in [1, 2] -%}
Test {{ x }}:
  cmd.run:
    - name: echo Test {{ x }}
{%- endfor -%}

现在cp.get_template渲染Jinja并显示原始输出:

% salt-call --local cp.get_template `pwd`/test.sls /dev/stdout

Test 1:
  cmd.run:
    - name: echo Test 1Test 2:
  cmd.run:
    - name: echo Test 2
local:
    /dev/stdout