Pregunta ¿Cuál es la manera más fácil de crear automáticamente un directorio no existente en ansible?


En mi libro de jugadas Ansible, muchas veces necesito crear un archivo allí

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

ahora muchas veces conf dir no está allí. Entonces, tengo que crear más tareas para crear ese directorio primero.

¿Hay alguna manera fácil de auto crear el directorio si no existe con alguna opción


77
2018-03-18 06:48


origen


Respuestas:


En este momento, esta es la única manera

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

107
2018-03-18 15:24



Para garantizar el éxito con una ruta completa use recurse = yes

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

14
2017-12-14 21:42



AFAIK, la única forma en que esto podría hacerse es mediante el uso de la state=directory opción. Mientras template módulo es compatible con la mayoría de copy opciones, que a su vez es más compatible file opciones, no puedes usar algo como state=directory con eso. Además, sería bastante confuso (¿significaría que {{project_root}}/conf/code.conf es un directorio ? o significaría eso {{project_root}}/conf/ debe ser creado primero.

Así que no creo que esto sea posible ahora sin agregar un previo file tarea.

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

6
2018-03-18 08:20



puede crear la carpeta usando lo siguiente dependiendo de su versión ansible.

Última versión 2 <

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

Versión antigua:

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

Recomendar http://docs.ansible.com/ansible/latest/file_module.html


1
2017-08-01 10:10



De acuerdo con el último documento cuando el estado está configurado para ser un directorio, no es necesario usar el parámetro recurse para crear directorios principales, el módulo de archivos se ocupará de ello.

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

esto es lo suficientemente caro como para crear los directorios principales datos y prueba con foo

por favor refiérase a la descripción del parámetro - "estado" http://docs.ansible.com/ansible/latest/modules/file_module.html


0
2018-04-23 07:30



Si está ejecutando Ansible> = 2.0 también está el filtro basename puede usar para extraer la parte del directorio de una ruta. De esta forma, puede usar una variable para mantener la ruta completa y asegurarse de que ambas tareas nunca se desincronicen.

Entonces, por ejemplo, si tiene un libro de jugadas con dest_path definido en una variable como esta puede reutilizar la misma 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 }}"

0
2018-06-05 15:06