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

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

我们几周以来一直使用 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

....没有更简单的解决办法吗?

答案1

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

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

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

下面是一个示例,说明在您所介绍的场景中,map.jinja 文件的情况。它将按操作系统系列筛选 minion,并根据操作系统系列设置变量:

{% set systemctl = salt['grains.filter_by']({
    'Debian': {
        'location': '/bin/systemctl'
    },
    'Suse': {
        'location': '/usr/bin/systemctl'
    }
} %}

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

{% 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

有关更多信息,请查看模块化查找表该文件的会议。

相关内容