web-dev-qa-db-fra.com

Quel est le moyen facile de créer automatiquement un répertoire non existant dans ansible

Plusieurs fois dans mon playbook Ansible, j'ai besoin de créer un fichier ici

 - name: Copy file
   template:
     src: code.conf.j2
     dest: "{{project_root}}/conf/code.conf"

maintenant plusieurs fois conf dir n'est pas là. Ensuite, je dois créer plus de tâches pour créer ce répertoire en premier.

Existe-t-il un moyen simple de créer automatiquement un répertoire s'il n'existe aucune option?

96
user1994660

En ce moment, c'est le seul moyen

- name: Ensures {{project_root}}/conf dir exists
  file: path={{project_root}}/conf state=directory
- name: Copy file
  template:
    src: code.conf.j2
    dest: "{{project_root}}/conf/code.conf"
122
Alexander Jardim

Pour assurer le succès avec un chemin complet, utilisez recurse = yes

- name: ensure custom facts directory exists
    file: >
      path=/etc/ansible/facts.d
      recurse=yes
      state=directory
15
Ian T Price

Autant que je sache, la seule façon de procéder pourrait consiste à utiliser l'option state=directory. Bien que le module template prenne en charge la plupart des options copy, qui à leur tour prennent en charge la plupart des options file, vous ne pouvez pas utiliser quelque chose comme state=directory avec elle. De plus, cela serait assez déroutant (cela signifierait-il que {{project_root}}/conf/code.conf est un répertoire? Ou cela signifierait-il que {{project_root}}/conf/ devrait être créé en premier.

Donc, je ne pense pas que ce soit possible pour le moment sans ajouter une tâche précédente file.

- file: 
    path: "{{project_root}}/conf"
    state: directory
    recurse: yes
7
leucos

Si vous utilisez Ansible> = 2.0, il existe également le filtre dirname filter que vous pouvez utiliser pour extraire la partie du répertoire d’un chemin. De cette façon, vous pouvez utiliser une seule variable pour conserver le chemin complet afin de vous assurer que les deux tâches ne sont pas désynchronisées.

Ainsi, par exemple, si vous avez un livre de lecture avec dest_path défini dans une variable comme celle-ci, vous pouvez réutiliser la même variable:

- name: My playbook
  vars:
    dest_path: /home/ubuntu/some_dir/some_file.txt
  tasks:

    - name: Make sure destination dir exists
      file:
        path: "{{ dest_path | dirname }}"
        state: directory
        recurse: yes

    # now this task is always save to run no matter how dest_path get's changed arround
    - name: Add file or template to remote instance
      template: 
        src: foo.txt.j2
        dest: "{{ dest_path }}"
7
Stefan Horning

Selon le dernier document lorsque state est défini sur directory, vous n'avez pas besoin d'utiliser le paramètre recurse pour créer des répertoires parents, le module de fichier se chargera de cela.

- name: create directory with parent directories
  file:
    path: /data/test/foo
    state: directory

c'est assez cher pour créer les répertoires parents des données et test avec foo

veuillez vous reporter à la description du paramètre - " state " http://docs.ansible.com/ansible/latest/modules/file_module.html

3
Alby

vous pouvez créer le dossier en utilisant ce qui suit en fonction de votre version ansible.

Dernière version 2 <

- name: Create Folder
  file: 
   path: "{{project_root}}/conf"
   recurse: yes
   state: directory

Ancienne version:

- name: Create Folder
  file: 
      path="{{project_root}}/conf"
      recurse: yes
      state=directory

Référez-vous - http://docs.ansible.com/ansible/latest/file_module.html

1