64 votes

Déploiement d'un dossier de fichiers modèles en utilisant ansible

Existe-t-il un moyen simple de déployer un dossier rempli de modèles de dossiers .j2 sur 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 :

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

103voto

Russell Points 1078

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

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

22voto

Mxx Points 2302

Michael DeHaan (créateur d'Ansible) a publié un article sur le site Web de la Commission européenne. CoderWall qui traite d'un sujet très similaire. Vous pouvez l'ajuster et le développer en fonction de vos besoins (comme les autorisations et la propriété). La partie pertinente de l'article est ici :


Cela peut être simplifié en utilisant " with_items " et un seul notify déclaration. Si l'une des tâches change, le service sera notifié 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 type hash (dictionnaire). Vous pouvez également être un peu plus court 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, on pourrait aussi définir la liste sur laquelle vous vous promenez dans un autre fichier, comme un " groupvars/webservers "afin de définir toutes les variables nécessaires à l'exécution de l'opération. webservers ou un fichier YAML chargé depuis le groupe " varsfiles "à l'intérieur du playbook. Regardez comment cela peut être nettoyé si nous le faisons.

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

15voto

Dag Wieers Points 326

J'ai écrit un plugin de recherche d'arborescence de fichiers qui peut aider les actions sur les arborescences de fichiers.

Vous pouvez effectuer des recherches sur les fichiers dans une arborescence de fichiers et, en fonction des propriétés des fichiers, effectuer des actions (par exemple, créer un modèle ou copier). Le chemin d'accès relatif étant renvoyé, vous pouvez facilement recréer l'arborescence de fichiers 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 livres de jeu plus lisibles.

9voto

HJ_VORTEX Points 91

La réponse de Russel fonctionne, mais elle 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 supprimé car il s'agissait d'un mauvais regex dans le regex_replace. Deuxièmement, tous les fichiers devraient se trouver dans le répertoire files plutôt que dans le répertoire templates.

4voto

Robin Points 41

La commande ci-dessous a fonctionné pour moi pour faire une recherche récursive des fichiers j2 dans les modèles et les déplacer vers la destination. J'espère que cela aidera quelqu'un qui cherche à copier récursivement 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') }}"

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X