我可以使用Saltstack Slot直接设置值。我需要的是使用内联值。
我的目标是使用reg.present
为特定用户设置密钥,例如:
HKUStudentSoftwareMicrosoftWindowsCurrentVersionPoliciesUninstall!NoAddRemovePrograms:
reg.present:
- name: HKU__slot__:salt:user.getUserSid(Student)SoftwareMicrosoftWindowsCurrentVersionPoliciesUninstall!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模板是在状态执行之前呈现的——根据文档。所以我猜测它是在计算slot之前执行的,所以Jinja试图将值__slot__:salt:user.getUserSid(Student)
分配给uid
变量,而不是计算slot并将结果分配给uid
。
==============================================
编辑:最终可行的解决方案,感谢@OrangeDog对其他陷入困境的人的支持:
{% set uid = salt["user.getUserSid"]("Student") %}
HKUStudnetSoftwareMicrosoftWindowsCurrentVersionPoliciesUninstall!NoAddRemovePrograms:
reg.present:
- name: HKU{{ uid }}SoftwareMicrosoftWindowsCurrentVersionPoliciesUninstall!NoAddRemovePrograms
它在您在问题中链接的文档中。
您可以使用~
将文本附加到槽结果中,但不能进行前置。
如果您真的需要使用slot,那么您可以编写一个自定义执行模块来返回所需的完整字符串。否则,只需使用jinja:
{% set SID = salt["user.getUserSid"]("Student") %}