2014-06-08 55 views
17

我試圖把these行到的東西,我可以把在ansible劇本:ansible:在遠程機器上是否有類似with_fileglobs的文件?

# Install Prezto files 
shopt -s extglob 
shopt -s nullglob 
files=("${ZDOTDIR:-$HOME}"/.zprezto/runcoms/!(README.md)) 
for rcfile in "${files[@]}"; do 
    [[ -f $rcfile ]] && ln -s "$rcfile" "${ZDOTDIR:-$HOME}/.${rcfile##*/}" 
done 

到目前爲止,我有以下幾點:

- name: Link Prezto files 
    file: src={{ item }} dest=~ state=link 
    with_fileglob: 
    - ~/.zprezto/runcoms/z* 

我知道這是不是相同,但它會選擇相同的文件:除了with_fileglob在主機上查找外,我希望它在遠程機器上查找。

有沒有辦法做到這一點,或者我應該只使用shell腳本?

回答

2

在使用with_fileglob等文件時,文件模塊確實會在服務器上運行文件的服務器上查看。由於您想使用僅存在於遠程計算機上的文件,因此您可以執行一些操作。一種方法是複製一個任務中的shell腳本,然後在下一個任務中調用它。你甚至可以使用該文件被複制的方式,其實只運行該腳本,如果它不存在:

- name: Copy link script 
    copy: src=/path/to/foo.sh 
     dest=/target/path/to/foo.sh 
     mode=0755 
    register: copied_script 

- name: Invoke link script 
    command: /target/path/to/foo.sh 
    when: copied_script.changed 

另一種方法是創建一個完整的命令行,你想要做什麼,

- name: Generate links 
    shell: find ~/.zprezto/runcoms/z* -exec ln -s {} ~ \; 
+0

太好了!它工作 –

-2

您可以使用with_lines做到這一點:使用shell模塊調用它

- name: Link Prezto files 
    file: src={{ item }} dest=~ state=link 
    with_lines: ls ~/.zprezto/runcoms/z* 
+0

在我的情況下,我跑了它,它仍然從SOURCE機器,而不是從目標(庫存主機)挑選模式文件。 –

+0

糟糕,我沒有注意到這是針對遠程機器的。 – kejadlen

6

布魯斯普的解決方案有效,但它需要一個另外的文件並變得有點混亂。以下是一個純粹的解決方案。

第一個任務抓取文件名列表並將其存儲在files_to_copy中。第二個任務將每個文件名附加到您提供的路徑並創建符號鏈接。

- name: grab file list 
    shell: ls /path/to/src 
    register: files_to_copy 
- name: create symbolic links 
    file: 
    src: "/path/to/src/{{ item }}" 
    dest: "path/to/dest/{{ item }}" 
    state: link 
    with_items: files_to_copy.stdout_lines 
12

清除不需要的文件匹配的glob的清潔Ansible方法是:

- name: List all tmp files 
    find: 
    paths: /tmp/foo 
    patterns: "*.tmp" 
    register: tmp_glob 

- name: Cleanup tmp files 
    file: 
    path: "{{ item.path }}" 
    state: absent 
    with_items: 
    - "{{ tmp_glob.files }}" 
相關問題