如何引用 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") %}
我可以使用 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") %}