Ansible copy模块未识别角色同级files目录,配置是否有误?
问题分析与解决方案
你的假设完全正确——Ansible确实应该在与tasks目录同级的files目录中查找文件,问题出在你运行playbook的方式上,而非配置错误。
为什么会出现路径错误?
你直接执行了角色内部的tasks/main.yml文件:
ansible-playbook -i hosts ./roles/ssh/tasks/main.yml -vvv
当你直接运行单个tasks文件时,Ansible会将当前工作目录(也就是./roles/ssh/tasks/)作为基准路径解析文件引用,所以它会在tasks目录下查找files文件夹,而非角色根目录下的files。这完全不符合Ansible角色的设计逻辑。
正确的解决方法(推荐)
Ansible角色的正确使用方式是通过顶层playbook来引用角色,而非直接运行角色内部的tasks文件。
- 调整目录结构,添加一个顶层playbook文件(比如
site.yml):
. ├── roles │ └── ssh │ ├── files │ │ └── sshd_config │ └── tasks │ └── main.yml ├── hosts └── site.yml
- 编写
site.yml内容,引用你的ssh角色:
--- - hosts: all roles: - ssh
- 用顶层playbook运行命令:
ansible-playbook -i hosts site.yml -vvv
此时Ansible会自动识别角色的标准结构,从roles/ssh/files/sshd_config读取文件,完全符合你的预期。
临时 workaround(不推荐)
如果你只是想临时测试tasks文件,不想创建顶层playbook,可以手动指定文件的相对路径:
修改roles/ssh/tasks/main.yml中的copy模块:
--- - hosts: all tasks: - name: "Set sshd configuration" copy: src: ../files/sshd_config dest: /etc/ssh/sshd_config
但这种方式破坏了角色的可移植性,不建议在正式场景中使用。
内容的提问来源于stack exchange,提问作者Vadiem Janssens
相关产品推荐
相关产品推荐

