为什么 salt['slsutil.banner'] 返回 None 我传递的任何参数?

Why is salt['slsutil.banner'] returning None whatever arguments I pass?

我正在使用 saltstack 来管理我的个人配置。特别是我正在以编程方式管理我的 ~/.profile。在整个设置过程中,我有各种各样的东西向它附加文本(主要是 env var 导出),它们都完全按预期工作。我想使用 slsutil.banner 在前面加上一条横幅,说明该文件是由 salt 以编程方式管理的,而不是用手触摸它。所以我在 profile/init.sls:

profile-managed-banner:    
  file.prepend:    
    - name: {{ pillar['profile_file'] }}    
    - text: {{ salt['slsutil.banner']() }}

这应该将默认横幅写入文件的开头。

当我然后 运行 运行 salt-call(设置是无主的。运行 salt-call as sudo 如果这完全相关)我得到:

      ID: profile-managed-banner
Function: file.prepend
    Name: /home/modallyFragile/.saltProfile
  Result: True
 Comment: File /home/modallyFragile/.saltProfile is in correct state
 Started: 15:59:07.760790
Duration: 1.757 ms
 Changes:   

很明显 salt 可以找到并使用所有功能(或者至少它认为可以),并且文件前面有 something。如果我检查文件,我会得到这个:

None
[ ... further config here]

如果我将模板替换为字符串(因此 - text: some string here),它会按预期工作(将 'some string' 添加到文件中)。所以问题在于模板slsutil.banner。我试过显式传递(各种组合)参数,但似乎没有任何帮助。

为什么会发生这种情况,我该怎么办?如果没有更实质性的东西,我可以做些什么来进一步诊断问题(我对 saltstack 很陌生,是否有一个特定的日志我应该检查所有相关信息等)? 我无法通过搜索(github 或更普遍)找到任何问题或问题,所以我画了一个空白。从字面上看,任何建议都会非常有帮助。谢谢!

将此添加为答案。根据 official documentation:

Create a standardized comment block to include in a templated file.

并且这在模板文件中确实有效

举个例子files/user-profile.j2:

{{ salt.slsutil.banner() }}

# the default umask is set in /etc/profile; for setting the umask
# for ssh logins, install and configure the libpam-umask package.
umask 022

PATH=$PATH:/my/local/bin

用于setup.sls:

create-user-profile:
  file.managed:
  - name: /home/user1/.profile
  - source: salt://files/user-profile.j2
  - template: jinja

将创建一个文件 /home/user1/.profile,默认横幅位于顶部,其余内容保持原样。

然后它开始有意义了。如果你想在文件上标明“它由 Salt 管理”,那么文件 应该由 Salt 管理(作为模板)。在远程文件中预先放置横幅,让剩余的文件内容不受管理,这与横幅的目的相矛盾。

所以如果你想在文件里放一个banner,你可以把~/.profile文件当做一个模板来管理,按照上面的方法写到minions中。

更新:

如果我们想要将自定义横幅添加到文件而不对其进行管理,则可能值得将此作为一个问题进行报告。