Ansible最佳实践:如何使用roles/X/files目录下的文件?
关于Ansible script模块未复制依赖库文件的问题解答
没错,这确实是script模块的正常行为。Ansible的script模块设计逻辑很明确:它只会将你在任务中指定的单个脚本文件上传到远程主机的临时目录(每个任务的临时目录独立,避免冲突),不会自动解析脚本内容去识别并上传依赖的库文件——毕竟模块没办法知道你的脚本里引用了哪些外部文件,所以只上传主脚本是预期的表现。
如果你想避免手动复制库文件,这里有两种更优雅的解决方案:
方案1:提前复制整个脚本目录到远程固定位置
这种方式适合需要多次执行脚本的场景,把所有相关文件放到远程主机的一个持久化目录,之后直接执行即可:
# roles/X/tasks/main.yml - name: 复制所有脚本及库文件到远程主机 copy: src: files/ # 会复制roles/X/files下的所有文件和子目录 dest: /opt/scripts/X/ # 远程的目标目录 mode: 0755 # 赋予执行权限 - name: 执行主脚本 command: /opt/scripts/X/script.sh --options
方案2:打包上传后临时执行(执行后清理)
如果不想让脚本文件留在远程主机上,可以先在本地打包所有文件,上传后解压执行,最后清理临时文件:
# roles/X/tasks/main.yml - name: 在本地打包脚本文件 archive: path: roles/X/files/ dest: /tmp/scripts_X.tar.gz format: gz delegate_to: localhost # 在控制机执行打包操作 - name: 上传压缩包到远程临时目录 copy: src: /tmp/scripts_X.tar.gz dest: "{{ remote_tmp }}/scripts_X.tar.gz" - name: 在远程解压压缩包 unarchive: src: "{{ remote_tmp }}/scripts_X.tar.gz" dest: "{{ remote_tmp }}/scripts_X/" remote_src: yes # 表示源文件在远程主机上 - name: 执行解压后的主脚本 command: "{{ remote_tmp }}/scripts_X/script.sh --options" - name: 清理远程临时文件 file: path: "{{ item }}" state: absent loop: - "{{ remote_tmp }}/scripts_X.tar.gz" - "{{ remote_tmp }}/scripts_X/"
两种方案都能避免手动复制库文件的麻烦,你可以根据自己的场景选择——如果脚本需要反复执行,方案1更高效;如果是一次性执行且不想留下文件,方案2更合适。
内容的提问来源于stack exchange,提问作者piecia
相关产品推荐
相关产品推荐

