SaltStack:/etc/sudo:/bin/systemctl vs /usr/bin/systemctl

gue*_*tli 1 sudo saltstack

几周以来,我们使用 SaltStack 进行配置管理。

如何处理分布的具体位置systemctl

  • 在 Ubuntu 上: /bin/systemctl
  • 在 SuSE 上: /usr/bin/systemctl

目前我在 sudoers 文件中添加了两行:

etc_sudoers:
  file.blockreplace:
    - name: /etc/sudoers
    - marker_start: "# START managed etc_sudoers -DO-NOT-EDIT-"
    - marker_end: "# END managed zone etc_sudoers --"
    - content: |
        some_user ALL = NOPASSWD: /bin/systemctl restart apache2
        some_user ALL = NOPASSWD: /usr/bin/systemctl restart apache2
{% endfor %}

    - append_if_not_found: True
    - backup: '.bak'
    - show_changes: True
Run Code Online (Sandbox Code Playgroud)

....有没有更简单的解决方案?

小智 5

不幸的是,没有更简单或自动的方法。但是有一个更好的方法遵循Salt Best Practices,使用 map.jinja 文件。

Salt Formulas 中的一个强约定是将特定于平台的数据(例如包名称和文件系统路径)放入名为 map.jinja 的文件中,该文件与状态文件放在一起。

使用它将确保您的状态的模块化,使它们能够运行,而不管 minion 的操作系统如何。

下面是一个示例,说明您的 map.jinja 文件在您提供的场景中的情况。它将按 OS 系列过滤 minion 并根据它设置变量:

{% set systemctl = salt['grains.filter_by']({
    'Debian': {
        'location': '/bin/systemctl'
    },
    'Suse': {
        'location': '/usr/bin/systemctl'
    }
} %}
Run Code Online (Sandbox Code Playgroud)

现在您需要将它导入您的状态文件并使用之前定义的变量:

{% from "systemctl/map.jinja" import systemctl with context %}

etc_sudoers:
  file.blockreplace:
    - name: /etc/sudoers
    - marker_start: "# START managed etc_sudoers -DO-NOT-EDIT-"
    - marker_end: "# END managed zone etc_sudoers --"
    - content: some_user ALL = NOPASSWD: {{ systemctl.location }} restart apache2

    - append_if_not_found: True
    - backup: '.bak'
    - show_changes: True
Run Code Online (Sandbox Code Playgroud)

有关它的更多信息,请查看文档的模块化查找表会话。