Ansible角色:更改文件扩展名

时间:2017-01-25 12:15:38

标签: ansible

在Vagrant设置中,我使用Ansible来配置虚拟机。

在其中一个Ansible角色中,我有一个复制~/bin/文件夹中的一些文件的任务:

~/bin/one.sh
~/bin/two.sh

我想创建这些文件的符号链接,以便最终结果如下:

~/bin/one.sh
~/bin/two.sh
~/bin/one(符号链接到~/bin/one.sh
~/bin/two(符号链接到~/bin/two.sh

我怎样才能实现这一目标?到目前为止,我已经尝试过这个但是它不起作用:

- name: Common tasks =>Create symlinks for utilities
  file: src=~/bin/{{ item }} dest=~/bin/  mode=755 state=link
  with_fileglob:
    - bin/*

我需要在dest=~/bin/内加一个带有文件名的正则表达式(如one.sh)并删除扩展名(one.sh变为one)但我不是确定怎么做。

更新

我终于使用了这个任务:

- name: Copy common files to ~/bin
  copy: src={{ item }} dest=~/bin/  mode=755
  with_fileglob:
    - bin/*

- name: Ensure symlinks for utilities exist
  file: src=~/bin/{{ item | basename | regex_replace('(\w+(?:\.\w+)*$)', '\1') }} dest=~/bin/{{ item | basename | regex_replace('\.sh','') }} mode=755 state=link
  with_fileglob:
    - bin/*

3 个答案:

答案 0 :(得分:8)

来自other useful filters章节:

  

获取路径或文件名的根和扩展名(2.0版中的新增内容):

# with path == 'nginx.conf' the return would be ('nginx', '.conf')
{{ path | splitext }}

您需要引用列表的第一个元素,所以:

- name: Common tasks => Ensure symlinks for utilities exist
  file: src=~/bin/{{ item }} dest=~/bin/{{ (item | splitext)[0] }} mode=755 state=link
  with_fileglob:
    - bin/*

当然,上面的任务可以根据您之后编辑的任务中指定的条款进行操作,因为fileglob查找在控制计算机上本地运行(以及您之前用于复制的任务)相同的文件,所以这个假定它们存在于本地机器上。)

如果您想单独运行任务,首先要使用find module准备目标节点上的文件列表,然后在结果上运行上述循环。

答案 1 :(得分:3)

我正在使用以下表达式更改文件名,例如从test.file.name.txttest.file.name.csv

"{{ ((item| splitext)[:-1] | join('.')) }}.csv"

这将在任何点上分割项目,剪掉最新的内容,并再次用点将所有部分合并在一起。之后,您无法添加收藏夹的扩展名。

答案 2 :(得分:-1)

如果你可以运行bash脚本:

#!/bin/bash
folder=$1
command=`ls -1 $folder | grep .sh$`
for i in $command; do
    # filename in $i 
    basename=`echo ${i} | gawk 'match($0, /(.*?)\.sh/, a) {print a[1]}'`
    ln -s $folder/$i $folder/$basename
done

将参数传递给完整路径文件夹,例如:

./ln.sh /home/techraf/script/bash

它将创建指向该文件夹中带有basename的.sh脚本的所有符号链接