添加/opt到file_roots后Salt-Master执行状态极慢的原因与解决办法
原因
Salt Master的file_roots是用来存放状态文件、待同步资源的目录集合。默认情况下,每次执行任何状态时,Master都会全量扫描file_roots下所有目录的文件——不管当前执行的状态是否用到这些目录里的内容。你的/opt目录有5万份文件,全量扫描自然会占用大量时间,导致简单状态执行变慢。
解决办法
1. 缩小file_roots的范围(最推荐)
不要把整个/opt目录加入file_roots.base,只添加你实际需要用file.recurse同步的具体子目录。比如你要同步的是/opt/my_app,就只在file_roots里配置这个子目录,而非整个/opt。这样扫描的文件量会大幅降低,从根本上解决问题。
修改Master配置文件/etc/salt/master里的file_roots部分:
file_roots: base: - /srv/salt - /opt/my_app # 只加需要的子目录,而非/opt
修改后重启salt-master:systemctl restart salt-master
2. 启用file_roots缓存
如果必须把整个/opt加入file_roots,可以开启Master的文件索引缓存功能,让Master只在文件变化时重新扫描,而非每次执行状态都全量遍历。
在/etc/salt/master里添加或修改:
file_roots_cache: True
保存后重启salt-master:systemctl restart salt-master
这个缓存会基于文件的修改时间(mtime)自动更新,既保证索引准确,又避免了每次执行状态都重复扫描5万文件的开销。
3. 改用本地绝对路径作为file.recurse的源(本地执行场景)
如果你是在Master本地执行状态(比如salt-call state.apply),可以直接把file.recurse的source设为本地绝对路径/opt/xxx,而不是salt://开头的路径。这样就不需要把/opt加入file_roots,Master也就不会扫描它了。
示例状态:
sync_opt_files: file.recurse: - name: /target/path - source: /opt/my_app # 直接用本地绝对路径 - makedirs: True
内容的提问来源于stack exchange,提问作者bchill

