web-dev-qa-db-fra.com

Déployer un dossier de fichiers modèles avec ansible

Existe-t-il un moyen facile de déployer un dossier rempli de dossier de modèle .j2 dans une boîte Linux, en utilisant le même nom que le modèle, mais sans l'extension .j2, plutôt que d'utiliser le module de modèle pour chaque fichier?

En ce moment, j'ai une longue liste de:

- name: create x template
  template:
    src=files/x.conf.j2
    dest=/tmp/x.conf
    owner=root
    group=root
    mode=0755
  notify:
    - restart myService
49
Trololololol

Vous pouvez utiliser with_fileglob pour obtenir la liste des fichiers de votre répertoire de modèles et utiliser des filtres pour supprimer l'extension j2 comme ceci:

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

Michael DeHaan (créateur d'Ansible) a fait un post sur CoderWall qui parle d'un problème très similaire. Vous pouvez l'ajuster et l'étendre en fonction de vos besoins (tels que les autorisations et la propriété). La partie pertinente de l'article est ici:


Cela peut être simplifié en utilisant "with_items "et une seule instruction notify. Si l'une des tâches change, le service sera averti exactement de la même manière qu'il doit redémarrer à la fin de l'exécution du 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

Notez que puisque nous avons des tâches qui prennent plus d'un argument unique, nous ne disons pas simplement "item" dans le 'template: ', mais utilisez with_items avec une variable de hachage (dictionnaire). Vous pouvez également le raccourcir un peu en utilisant des listes, si vous le souhaitez. Il s'agit d'une préférence stylistique:

 - 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

Bien sûr, nous pourrions également définir la liste que vous parcourez dans un autre fichier, comme un "groupvars/webservers "pour définir toutes les variables nécessaires au groupe webservers, ou un fichier YAML chargé à partir de la directive" varsfiles "à l'intérieur du playbook. Regardez comment cela peut se nettoyer si nous le faisons.

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

La réponse de Russel fonctionne mais doit être améliorée

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

Tout d'abord, le $ doit être utilisé car il s'agissait d'une expression rationnelle incorrecte dans regex_replace. Deuxièmement, tous les fichiers doivent être dans le répertoire des fichiers plutôt que dans le répertoire des modèles

9
HJ_VORTEX

J'ai écrit un plugin de recherche filetree qui peut aider avec des actions sur les arborescences de fichiers.

Vous pouvez récursivement sur les fichiers dans une arborescence de fichiers et en fonction des propriétés des fichiers effectuer des actions (par exemple, modèle ou copie). Puisque le chemin relatif est retourné, vous pouvez recréer facilement le filetree sur le (s) système (s) cible (s).

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

Cela rend les playbooks plus lisibles.

8
Dag Wieers

La commande ci-dessous a fonctionné pour moi pour faire une recherche récursive pour les fichiers j2 dans les modèles et les déplacer vers la destination. J'espère que cela aide quelqu'un à la recherche d'une copie récursive des modèles vers la destination.

     - 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') }}"
3
Robin

Il est possible de récupérer automatiquement la liste des fichiers réels dans le répertoire et de les réitérer par la suite.

- name:         get the list of templates to transfer
  local_action: "Shell ls templates/* | sed 's~.*/~~g'"
  register:     template_files

- name:         iterate and send templates
  template:     src=templates/{{ item }} dest=/mydestination/{{ item }}
  with_items:
  - "{{ template_files.stdout.splitlines() }}"
1
Roman Dolejsi