2014-06-08 19 views
17

Sto cercando di trasformare these linee in qualcosa che posso mettere in un playbook ansible:ansible: Esiste qualcosa come with_fileglobs per i file sul computer remoto?

# 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 

Finora ho ottenuto il seguente:

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

So che non è il lo stesso, ma selezionerebbe gli stessi file: tranne con_fileglob guarda sul computer host, e voglio che guardi sul computer remoto.

Esiste un modo per fare questo, o devo semplicemente usare uno script di shell?

risposta

2

Il modulo file in effetti cerca sul server dove è in esecuzione ansible per i file quando si utilizza with_fileglob, ecc. Dal momento che si desidera lavorare con file che esistono solo sulla macchina remota, si potrebbero fare un paio di cose. Un approccio sarebbe quello di copiare su uno script di shell in una attività, quindi richiamarlo nell'attività successiva. Si potrebbe anche usare il fatto che il file è stato copiato come un modo per eseguire solo lo script se non esistessero già:

- 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 

Un altro approccio sarebbe quello di creare un'intera linea di comando che fa quello che si vuole e invocarlo utilizzando il modulo shell:

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

Grande! Ha funzionato –

-2

è possibile utilizzare with_lines per raggiungere questo obiettivo:

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

Nel mio caso, l'ho eseguito e ha ancora scelto i file di pattern dalla macchina SOURCE e non dalla destinazione (macchina host dell'inventario). –

+0

Oops, non ho capito che questo era per la macchina remota. – kejadlen

6

soluzione di Bruce P funziona, ma richiede un file aggiunta e diventa un po 'disordinato. Di seguito è una soluzione pura ansible.

Il primo compito acquisisce un elenco di nomi di file e lo archivia in files_to_copy. La seconda attività aggiunge ogni nome di file al percorso che fornisci e crea collegamenti simbolici.

- 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

un modo pulito Ansible di eliminazione dei file indesiderati che corrispondono a un glob è:

- 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 }}" 
Problemi correlati