如何使用ansible.builtin.file通过通配符创建符号链接?
关于Ansible file模块使用通配符创建符号链接的问题
核心结论
ansible.builtin.file模块不支持直接使用通配符(*)作为src参数。它会将通配符当作路径的一部分去查找,而非进行通配符扩展,这就是你遇到Error while replacing: [Errno 2] No such file or directory: b'/usr/share/easy-rsa/*'报错的原因。
解决方案
根据你的实际需求,可选择以下方式实现:
1. 批量链接目录内所有内容(推荐幂等性方案)
先通过find模块获取源目录下的所有文件/目录,再循环创建符号链接,这种方式符合Ansible幂等性要求,避免重复执行报错:
- name: 确保目标目录存在 ansible.builtin.file: path: ~/easy-rsa/ state: directory - name: 查找源目录下的所有内容 ansible.builtin.find: paths: /usr/share/easy-rsa/ file_type: any register: easy_rsa_items - name: 为每个内容创建符号链接 ansible.builtin.file: src: "{{ item.path }}" dest: "~/easy-rsa/{{ item.path | basename }}" state: link loop: "{{ easy_rsa_items.files }}"
2. 使用Shell/Command模块直接执行ln命令
如果不需要严格的幂等性,可直接调用系统命令处理通配符扩展(注意:若目标目录已有同名文件会触发报错):
- name: 批量创建符号链接 ansible.builtin.shell: ln -s /usr/share/easy-rsa/* ~/easy-rsa/ args: creates: ~/easy-rsa/ # 仅当目标目录不存在时执行,可选
3. 链接整个目录(若需求是链接目录而非目录内内容)
如果你的目标是将整个/usr/share/easy-rsa/目录作为链接目标,直接使用完整路径即可,无需通配符:
- name: 创建目录符号链接 ansible.builtin.file: src: /usr/share/easy-rsa/ dest: ~/easy-rsa/ state: link
内容的提问来源于stack exchange,提问作者Enshin Andrei
相关产品推荐
相关产品推荐

