如何在Ansible Playbook中用命令行变量配置copy模块实现动态拷贝?
问题描述
需要编写Ansible Playbook实现本地任意文件到目标机器任意路径的拷贝(权限符合操作范围),但常规copy模块示例均为硬编码src和dest,无法满足通过--extra-vars在命令行动态传入路径的需求。
尝试在Playbook中使用src: "{{ srcvar }}"和dest: "{{ destvar }}"引用命令行传入的变量,执行命令:
ansible-playbook -e "srcvar=/my/path/file.name destvar=/my/remote/path/file.name" playbook.yml
时,在拷贝任务环节报错:
fatal: [test_server]: FAILED! => {"msg": "'str object' has no attribute 'files'"}
解决方法
正确的Playbook配置
--- - name: 动态拷贝本地文件至远程主机 hosts: "{{ host_list }}" gather_facts: false vars: # 设置默认空值,用于后续参数校验 srcvar: "" destvar: "" tasks: - name: 校验必填变量是否传入 fail: msg: "请通过--extra-vars传入host_list、srcvar和destvar参数" when: srcvar == "" or destvar == "" or host_list is undefined - name: 执行文件拷贝 copy: src: "{{ srcvar }}" dest: "{{ destvar }}"
命令调用示例
ansible-playbook -e "host_list=myhosts srcvar=/本地源文件完整路径 destvar=/远程目标文件完整路径" playbook.yml
错误原因解析
出现'str object' has no attribute 'files'错误,通常是以下两种情况导致:
- 命令行传入的
srcvar路径不存在,copy模块误将无效字符串当作目录处理,引发内部类型错误 srcvar路径末尾多了斜杠,被Ansible判定为目录,而目录拷贝需要不同的参数逻辑
添加变量校验步骤可以提前拦截未传参的情况,同时确保srcvar指向真实存在的本地文件,即可避免该错误。
内容的提问来源于stack exchange,提问作者jopey
相关产品推荐
相关产品推荐

