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