GNU/Linux >> Linux Esercitazione >  >> Linux

Distribuzione di una cartella di file modello utilizzando ansible

Soluzione 1:

Potresti usare with_fileglob per ottenere l'elenco dei file dalla directory dei modelli e utilizzare i filtri per eliminare l'estensione j2 in questo modo:

- name: create x template
  template:
    src: "{{ item }}"
    dest: /tmp/{{ item | basename | regex_replace('\.j2$', '') }}
  with_fileglob:
    - ../templates/*.j2

Soluzione 2:

Michael DeHaan (creatore di Ansible) ha pubblicato un post su CoderWall che parla di un problema molto simile. Puoi adattarlo ed espanderlo in base alle tue esigenze (come autorizzazioni e proprietà). La parte rilevante del post è qui:

Questo può essere semplificato usando "with_items " e un solo notify dichiarazione. Se una delle attività cambia, il servizio verrà avvisato esattamente nello stesso modo in cui deve essere riavviato al termine dell'esecuzione del playbook.

 - name:  template everything for fooserv
   template: src={{item.src}} dest={{item.dest}}
   with_items:
      - { src: 'templates/foo.j2', dest: '/etc/splat/foo.conf' }
      - { src: 'templates/bar.j2', dest: '/etc/splat/bar.conf' }
   notify: 
      - restart fooserv

Nota che poiché abbiamo compiti che accettano più di un argomento univoco, non diciamo solo "item " nel 'template: ', ma usa with_items con una variabile hash (dizionario). Puoi anche mantenerlo un po' più breve usando gli elenchi, se lo desideri. Questa è una preferenza stilistica:

 - name:  template everything for fooserv
   template: src={{item.0}} dest={{item.1}}
   with_items:
      - [ 'templates/foo.j2', '/etc/splat/foo.conf' ]
      - [ 'templates/bar.j2', '/etc/splat/bar.conf' ]
   notify: 
      - restart fooserv

Ovviamente potremmo anche definire la lista su cui stavi camminando in un altro file, come un "groupvars/webservers " per definire tutte le variabili necessarie per il webservers o un file YAML caricato dal file "varsfiles " direttiva all'interno del playbook. Guarda come questo può ripulire se lo facciamo.

- name: template everything for fooserv
  template: src={{item.src}} dest={{item.dest}}
  with_items: {{fooserv_template_files}}
  notify: 
      - restart fooserv

Soluzione 3:

La risposta di Russel funziona ma necessita di miglioramenti

- name: create x template
- template: src={{ item }} dest=/tmp/{{ item | basename | regex_replace('.j2','') }}
- with_fileglob:
   - files/*.j2

Prima di tutto $ deve andare perché era un'espressione regolare sbagliata in regex_replace . In secondo luogo, tutti i file dovrebbero trovarsi nella directory dei file piuttosto che nella directory dei modelli

Soluzione 4:

Ho scritto un plug-in di ricerca filetree che può aiutare con le azioni sui file tree.

  • https://github.com/ansible/ansible/pull/14332 (Ansible v2.x)
  • https://github.com/ansible/ansible/pull/14628 (Ansible v1.9.x)

È possibile ricorrere ai file in un albero di file e in base alle proprietà del file eseguire azioni (ad esempio modello o copia). Poiché viene restituito il percorso relativo, è possibile ricreare facilmente l'albero dei file sui sistemi di destinazione.

- name: Template complete tree
  template:
    src: '{{ item.src }}'
    dest: /web/{{ item.path }}
    force: yes
  with_filetree: some/path/
  when: item.state == 'file'

Rende i playbook più leggibili.

Soluzione 5:

Il comando seguente ha funzionato per me per eseguire una ricerca ricorsiva dei file j2 nei modelli e spostarlo nella destinazione. Spero che aiuti qualcuno che cerca una copia ricorsiva dei modelli a destinazione.

     - name: Copying the templated jinja2 files
       template: src={{item}} dest={{RUN_TIME}}/{{ item | regex_replace(role_path+'/templates','') | regex_replace('\.j2', '') }}
       with_items: "{{ lookup('pipe','find {{role_path}}/templates -type f').split('\n') }}"

Linux
  1. Stampa tutti i file in una cartella?

  2. Come ordinare i file in base alle loro autorizzazioni usando Ls?

  3. Ordinare i file in una cartella specifica con Ranger?

  4. Utilizzo di rsync per sincronizzare i file

  5. Sposta una cartella in Linux usando il comando mv

Come rinominare i file usando la riga di comando in Linux

Inventario Ansible e file di configurazione

Trova testo nei file su Linux usando grep

Come spostare i file in un'altra cartella utilizzando File Manager

Trasferisci file usando WinSCP

Usando Bash Sort per ordinare i file come un boss