如何在未编辑GRUB文件时避免Salt执行系统重启操作?
问题:仅在GRUB配置修改后执行update-grub和系统重启
我需要通过Salt将指定内核参数写入/etc/default/grub,仅当文件被成功修改时,才执行update-grub并重启Minion;如果文件未变更,则跳过更新和重启。
当前使用的SLS配置如下:
edit_grub_config: file.replace: - name: /etc/default/grub - pattern: '^(GRUB_CMD_LINUX_DEFAULT="[^"]*)(")' - repl: '\1 spectre_v2=on spec_store_bypass_disable=on tsx=off tsx_async_abort=full,nosmt mds=full,nosmt l1tf=full,force nosmt=force kvm.nx_huge_pages=force\2' - unless: grep -q "spectre_v2=on spec_store_bypass_disable=on tsx=off tsx_async_abort=full,nosmt mds=full,nosmt l1tf=full,force nosmt=force kvm.nx_huge_pages=force" /etc/default/grub grub_update: cmd.run: - name: update-grub - require: - file: edit_grub_config restart_minion: cmd.run: - name: shutdown -r now - require: - cmd: grub_update
当前问题:edit_grub_config不会重复添加参数,但每次执行都会触发系统重启,不符合仅在文件修改后才重启的需求。
解决方案
核心问题是require仅确保依赖项执行过,不关心依赖项是否实际修改了文件。Salt的onchanges机制可以实现"仅当依赖资源发生变更时才执行当前状态"的逻辑。
修改步骤
- 给
grub_update添加onchanges关联edit_grub_config,只有当/etc/default/grub被修改时才执行update-grub - 给
restart_minion添加onchanges关联grub_update,确保只有GRUB配置更新完成后才重启
修改后的完整SLS配置
edit_grub_config: file.replace: - name: /etc/default/grub - pattern: '^(GRUB_CMD_LINUX_DEFAULT="[^"]*")' - repl: '\1 spectre_v2=on spec_store_bypass_disable=on tsx=off tsx_async_abort=full,nosmt mds=full,nosmt l1tf=full,force nosmt=force kvm.nx_huge_pages=force' - unless: grep -q "spectre_v2=on spec_store_bypass_disable=on tsx=off tsx_async_abort=full,nosmt mds=full,nosmt l1tf=full,force nosmt=force kvm.nx_huge_pages=force" /etc/default/grub grub_update: cmd.run: - name: update-grub - onchanges: - file: edit_grub_config restart_minion: cmd.run: - name: shutdown -r now - onchanges: - cmd: grub_update
额外说明
onchanges会检查依赖资源的状态是否为"changed",仅当依赖项实际修改系统状态时才执行当前操作- 也可以将
restart_minion的onchanges直接指向file: edit_grub_config,效果一致,可减少一层依赖检查 - 配置中已将转义的
"替换为实际双引号",避免解析异常
内容的提问来源于stack exchange,提问作者fk1
相关产品推荐
相关产品推荐

