2017-01-25 169 views
1

在Vagrant設置中,我使用Ansible來調配虛擬機。Ansible角色:更改文件擴展名

在Ansible角色之一,我有一個副本​​文件夾裏面的一些文件的任務:

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

我要那麼最終的結果看起來像創建這些文件的符號鏈接:

~/bin/one.sh
~/bin/two.sh
~/bin/one(syml墨~/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/* 
+0

@techraf我更新了我的問題,謝謝! – numediaweb

回答

3

在所有的符號鏈接.SH腳本基本名稱從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準備一個文件列表,然後對結果執行上述循環。

+0

有沒有辦法將'with_fileglob'與'with_items'結合? – numediaweb

+0

我不明白這個問題。以什麼方式結合? – techraf

+0

我的意思是,在我的某個角色中,我有一些文件在'devenv \ ansible \ roles \ common \ files \ bin'裏面,這些是* .sh腳本,我想爲〜/ bin /文件夾內部創建符號鏈接的虛擬機..所以,而不是手動輸入這些文件名,我想使用'with_fileglob'獲得名稱並將它們傳遞到with_items。 – numediaweb

-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 

,它會創建一個文件夾