GNU/Linux >> Tutoriels Linux >  >> Linux

Déploiement d'un dossier de fichiers modèles à l'aide d'ansible

Solution 1 :

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

Solution 2 :

Michael DeHaan (créateur d'Ansible) a publié un article 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 du message se trouve 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 hachage (dictionnaire). Vous pouvez également le garder 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, nous pourrions également définir la liste que vous parcouriez dans un autre fichier, comme un "groupvars/webservers " fichier pour définir toutes les variables nécessaires au webservers groupe, ou un fichier YAML chargé depuis le "varsfiles " directive dans le playbook. Regardez comment cela peut 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

Solution 3 :

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

Le premier de tous les $ doit aller car c'était une mauvaise regex dans le regex_replace . Deuxièmement, tous les fichiers doivent se trouver dans le répertoire des fichiers plutôt que dans le répertoire des modèles

Solution 4 :

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

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

Vous pouvez parcourir les fichiers dans une arborescence de fichiers et, en fonction des propriétés du fichier, effectuer des actions (par exemple, modèle ou copie). Puisque le chemin relatif est renvoyé, vous pouvez facilement recréer l'arborescence de fichiers sur le ou les systèmes cibles.

- 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.

Solution 5 :

La commande ci-dessous a fonctionné pour moi pour effectuer 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 à 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') }}"

Linux
  1. Guide Ansible :Gérer les fichiers à l'aide d'Ansible

  2. Machines virtuelles multipasses à l'aide d'Ansible

  3. Imprimer tous les fichiers d'un dossier ?

  4. Comment trier les fichiers selon leurs autorisations à l'aide de Ls ?

  5. Trier les fichiers dans un dossier spécifique avec Ranger ?

Comment renommer des fichiers en utilisant la ligne de commande sous Linux

Fichiers d'inventaire et de configuration Ansible

Rechercher du texte dans des fichiers sous Linux à l'aide de grep

Comment déplacer des fichiers vers un autre dossier à l'aide du gestionnaire de fichiers

Transférer des fichiers à l'aide de WinSCP

Utilisation de Bash Sort pour trier les fichiers comme un patron