如何在SaltStack的cmd.run状态中用salt://指定工作目录?
解决SaltStack cmd.run中无法使用salt://作为cwd的问题
嘿,刚接触SaltStack的话确实容易踩这个坑——cmd.run的cwd参数根本不认识salt:// URI,因为这个参数要求的是minion本地已经存在的实际路径,而salt://指向的是master上的文件服务器路径,minion没法直接把它当成本地目录来用,这就是你报错的原因。
给你两种可行的解决思路,核心都是先把master上的文件同步到minion本地,再用本地路径执行命令:
方法一:用file.recurse同步整个目录(推荐)
如果salt://my-state/files/是个目录,先通过file.recurse把整个目录同步到minion的本地路径(比如/opt/my-state-files/),然后让cmd.run依赖这个同步操作,确保目录存在后再执行命令:
# 先同步master上的目录到minion本地 sync_my_files: file.recurse: - name: /opt/my-state-files/ # minion本地的目标路径 - source: salt://my-state/files/ # master上的源路径 - makedirs: True # 如果目标目录不存在,自动创建 # 再执行命令,使用本地路径作为cwd test_cmd: cmd.run: - name: echo a > test - cwd: /opt/my-state-files/ - require: - file: sync_my_files # 确保同步完成后再执行命令
方法二:仅同步单个文件(如果只需要目录里的特定文件)
如果你的命令只需要目录里的某个文件,也可以用file.managed单独同步这个文件,然后指定文件所在的本地目录作为cwd:
sync_single_file: file.managed: - name: /opt/my-state-files/test_script.sh - source: salt://my-state/files/test_script.sh test_cmd: cmd.run: - name: ./test_script.sh - cwd: /opt/my-state-files/ - require: - file: sync_single_file
关键要点
salt://是SaltStack用来标识master文件服务器资源的URI,不是实际的文件系统路径,minion的任何系统级命令(包括cmd.run调用的shell命令)都无法直接识别它。- 必须通过
file模块的状态把master上的资源同步到minion本地,才能用本地路径进行操作。 require参数是必须的,它能保证文件同步完成后再执行命令,避免出现目录/文件不存在的错误。
内容的提问来源于stack exchange,提问作者DrKey
相关产品推荐
相关产品推荐

