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?
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"
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
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
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 }}"
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
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