Ansible遍历文件名创建符号链接:如何让目标仅保留文件名?
解决Ansible符号链接目标路径仅使用文件名的问题
没问题,这个需求很好实现,咱们只需要用Ansible自带的basename过滤器,从源文件的完整路径里提取出文件名,再拼到目标目录后面就可以了。
修改后的PlayBook配置
- hosts: DEVSRV become: yes tasks: - name: symlink deploy_config scripts file: src: "{{ item }}" dest: "/usr/local/bin/{{ item | basename }}" state: link loop: - "/home/foo/bar/deploy/config/dev_deploy_config.sh" - "/home/foo/bar/deploy/config/int_deploy_config.sh" - "/home/foo/bar/deploy/config/prod_deploy_config.sh"
关键解释
{{ item | basename }}这个过滤器会自动截取item变量里完整路径的最后一段(也就是文件名),比如对于/home/foo/bar/deploy/config/dev_deploy_config.sh,它会提取出dev_deploy_config.sh。- 这样
dest就会变成/usr/local/bin/dev_deploy_config.sh,完美实现“仅使用文件名”的需求,而且每个循环项都会自动对应正确的目标文件名。
顺便提一句:如果/usr/local/bin/目录已经存在,其实你原来的写法(dest写目录路径)也会自动在目录下创建同名的符号链接,但用basename的写法更明确,也更灵活——比如哪天你想把目标文件名改成别的(比如去掉_deploy_config.sh后缀),直接在过滤器后面加字符串处理就行啦。
内容的提问来源于stack exchange,提问作者StandardNerd
相关产品推荐
相关产品推荐

