如何引用 Saltstack 状态下的插槽?

How to refer slot in Saltstack state?

我可以使用 Saltstack Slot 直接设置一个值。我需要的是使用内联值。

我的目标是使用 reg.present 为特定用户设置密钥,例如:

HKU\Student\Software\Microsoft\Windows\CurrentVersion\Policies\Uninstall!NoAddRemovePrograms:
  reg.present:
    - name: HKU\__slot__:salt:user.getUserSid(Student)\Software\Microsoft\Windows\CurrentVersion\Policies\Uninstall!NoAddRemovePrograms

它不起作用,因为我没有按需要安装 Sid。我试着弄清楚这一点,但我被卡住了。以下是我试图掌握它的尝试。

所以,这很好用:

echo variable:
 cmd.run:
   - env:
     - myuid: __slot__:salt:user.getUserSid(Student)
   - name: Get-Item -Path Env:myuid
   - shell: powershell

这不是:

echo direct:
  cmd.run:
    - name: echo __slot__:salt:user.getUserSid(Student)

==========================================

编辑:

正如 OrangeDog 在评论中指出的那样,不可能在任何字符串前添加一个插槽,因此后者不起作用。

我按照建议尝试使用 Jinja,这是状态:

{% set uid = __slot__:salt:user.getUserSid(Student) %}
echo with jinja:
  cmd.run:
    - name:  echo {{ uid }}
    - shell: powershell

这不起作用,这是错误:

----------
    Rendering SLS 'base:echo' failed: Jinja syntax error: expected token 'end of statement block', got ':'; line 17

---
[...]   
{% set uid = __slot__:salt:user.getUserSid(Student) %}    <======================
echo with jinja:
  cmd.run:
    - name:  echo {{ uid }}
    - shell: powershell
---

现在,我觉得这里没有机会使用Jinja了。据我了解,Jinja 模板在执行状态之前呈现 - 根据 the doc。所以我猜它是在评估插槽之前执行的,所以 Jinja 尝试将值 __slot__:salt:user.getUserSid(Student) 分配给 uid 变量,而不是评估插槽并将结果分配给 uid.

==========================================

编辑:感谢@OrangeDog 对其他苦苦挣扎的人的支持,最终的可行解决方案:

{% set uid = salt["user.getUserSid"]("Student") %}

HKU\Studnet\Software\Microsoft\Windows\CurrentVersion\Policies\Uninstall!NoAddRemovePrograms:
  reg.present:
    - name: HKU\{{ uid }}\Software\Microsoft\Windows\CurrentVersion\Policies\Uninstall!NoAddRemovePrograms

它在您在问题中链接的文档中。

您可以使用 ~ 将文本附加到广告位结果,但不能预先添加。

如果您确实需要使用插槽,那么您可以编写一个自定义执行模块来 return 您需要的完整字符串。否则,只需使用 jinja:

{% set SID = salt["user.getUserSid"]("Student") %}