如何用Salt脚本在Minion本地批量复制动态文件至目标目录
解决SaltStack批量复制动态文件到目标目录的问题
需求与问题
需要在Minion本地将/app/downloaded/下的所有动态文件(文件名、数量不固定)复制到已存在的/app/myapp/installables/目录,要求保留目标目录原有文件,不能删除或覆盖整个目录。
使用以下Salt状态配置后,执行结果提示目标目录已存在,不会被覆盖:
Copy_new_version_files_for_installation: file.copy: - name: /app/myapp/installables - source: /app/downloaded - recurse: True
执行输出:
ID: Copy_new_version_files_for_installation Function: file.copy Name: /app/myapp/installables Result: True Comment: The target file "/app/myapp/installables" exists and will not be overwritten
解决方案
方法一:调整file.copy参数实现文件复制
原配置试图将整个源目录复制到目标目录,但目标目录已存在,Salt默认不会覆盖整个目录。只需添加include_pat匹配所有文件,并通过force参数控制是否覆盖同名文件:
Copy_new_version_files_for_installation: file.copy: - name: /app/myapp/installables - source: /app/downloaded - recurse: True - include_pat: '.*' # 匹配所有文件,等效于cp命令的*.* - makedirs: True - force: True # 允许覆盖目标目录中同名文件,无需覆盖可删除此参数
方法二:使用file.recurse模块(更适配批量同步场景)
file.recurse专门用于递归同步目录内容,默认保留目标目录原有文件,仅处理源目录的文件:
Copy_new_version_files_for_installation: file.recurse: - name: /app/myapp/installables - source: file:///app/downloaded # 本地文件需用file://协议指定绝对路径 - include_pat: '.*' - makedirs: True
参数说明
include_pat: '.*':正则匹配所有文件,和cp /app/downloaded/*.*效果一致,若需匹配特定后缀,可改为'.*\.txt'这类正则。force: True:开启后会覆盖目标目录中已存在的同名文件;若要保留旧版本文件,删除此参数即可,Salt会自动跳过已存在的文件。
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

