GNU/Linux >> Tutoriales Linux >  >> Linux

Implementación de una carpeta de archivos de plantilla usando ansible

Solución 1:

Podrías usar with_fileglob para obtener la lista de archivos de su directorio de plantillas y usar filtros para eliminar la extensión j2 de esta manera:

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

Solución 2:

Michael DeHaan (creador de Ansible) hizo una publicación en CoderWall que habla de un problema muy similar. Puede ajustarlo y expandirlo según sus necesidades (como permisos y propiedad). La parte relevante de la publicación está aquí:

Esto se puede simplificar usando "with_items " y un solo notify declaración. Si alguna de las tareas cambia, se notificará al servicio exactamente de la misma manera que debe reiniciarse al final de la ejecución del libro de jugadas.

 - 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

Tenga en cuenta que dado que tenemos tareas que toman más de un argumento único, no decimos simplemente "item " en el 'template: ' línea, pero usa with_items con una variable hash (diccionario). También puede mantenerlo un poco más corto usando listas, si lo desea. Esta es una preferencia estilística:

 - 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

Por supuesto, también podríamos definir la lista por la que caminaba en otro archivo, como "groupvars/webservers " archivo para definir todas las variables necesarias para el webservers grupo, o un archivo YAML cargado desde el "varsfiles " directiva dentro del libro de jugadas. Mire cómo esto puede limpiarse si lo hacemos.

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

Solución 3:

La respuesta de Russel funciona pero necesita mejoras

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

En primer lugar, todo el $ debe desaparecer, ya que era una expresión regular incorrecta en regex_replace. En segundo lugar, todos los archivos deben estar en el directorio de archivos en lugar del directorio de plantillas

Solución 4:

Escribí un complemento de búsqueda de árbol de archivos que puede ayudar con acciones en árboles de archivos.

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

Puede recurrir a los archivos en un árbol de archivos y, según las propiedades del archivo, realizar acciones (por ejemplo, plantilla o copia). Dado que se devuelve la ruta relativa, puede volver a crear el árbol de archivos en los sistemas de destino con facilidad.

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

Hace que los libros de jugadas sean más legibles.

Solución 5:

El siguiente comando me funcionó para hacer una búsqueda recursiva de archivos j2 en plantillas y moverlo al destino. Espero que ayude a alguien que busca una copia recursiva de las plantillas en el destino.

     - 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. Guía de Ansible:Administrar archivos usando Ansible

  2. ¿Imprimir todos los archivos en una carpeta?

  3. ¿Cómo ordenar los archivos por sus permisos usando Ls?

  4. ¿Ordenar archivos en una carpeta específica con Ranger?

  5. Usando rsync para sincronizar archivos

Cómo cambiar el nombre de los archivos usando la línea de comandos en Linux

Archivos de inventario y configuración de Ansible

Encuentra texto en archivos en Linux usando grep

Cómo mover archivos a otra carpeta usando el Administrador de archivos

Transferir archivos usando WinSCP

Usando Bash Sort para ordenar archivos como un jefe