Apa cara mudah untuk otomatis membuat dir yang tidak ada di ansible


117

Di buku pedoman Ansible saya berkali-kali saya perlu membuat file di sana

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

sekarang banyak kali confdir tidak ada. Kemudian saya harus membuat lebih banyak tugas untuk membuat dir itu terlebih dahulu.

Apakah ada cara mudah untuk membuat dir otomatis jika tidak ada dengan beberapa opsi



Saya tidak percaya ini masih menjadi masalah di kemungkinan 2.9. Seberapa sulit bagi modul-modul ini untuk memiliki tombol buat dir, yang secara default dimatikan. Ini akan menghemat begitu banyak sampah dalam buku pedoman, harus berurusan dengan pretest seperti jawaban di bawah ini
krad

Jawaban:


139

Sekarang, ini satu-satunya cara

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

2
Saya pikir pastikan kata yang benar di sini. Yakinkan: "beritahu seseorang sesuatu secara positif untuk menghilangkan keraguan", pastikan: "pastikan bahwa (sesuatu) akan terjadi atau menjadi kasus".
Daniel Compton

Itu sepertinya memeriksa apakah directorty ada, tetapi sepertinya tidak membuatnya.
Matt

8
Harus dicatat bahwa Anda mungkin ingin menambahkan recurse=yeske filepanggilan untuk mendapatkan mkdir -pperilaku jenis
Mitch

1
Bagian lain dari teka-teki yang dapat membantu adalah filter khusus yang memungkinkandirname untuk mendapatkan direktori yang berisi file.
Caspar

1
@radtek modul file sudah melakukannya dengan direktori state =. Ini akan gagal jika tidak memungkinkan untuk memastikan bahwa jalur file yang diusulkan mengarah ke direktori.
Alexander Jardim

21

Untuk memastikan kesuksesan dengan jalur lengkap, gunakan recurse = yes

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

2
Menurut dokumentasi (dan pengujian saya), subdirektori selalu dibuat, dan recurse=yeshanya menerapkan izin secara rekursif. Namun, dokumentasi menyatakan bahwa ini terjadi secara otomatis sejak v1.7, jadi recursemungkin sudah usang.
Ke 마 SE

16

Jika Anda menjalankan Ansible> = 2.0, ada juga filter dirname yang dapat Anda gunakan untuk mengekstrak bagian direktori dari sebuah jalur. Dengan begitu Anda bisa menggunakan satu variabel untuk menampung seluruh jalur untuk memastikan kedua tugas tidak pernah keluar dari sinkronisasi.

Jadi misalnya jika Anda memiliki pedoman dengan dest_pathditentukan dalam variabel seperti ini Anda dapat menggunakan kembali variabel yang sama:

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

1
sementara solusi ini masih bertele-tele, menurut saya solusi ini paling mendekati maksud penulis. Saya akan senang jika ada parameter 'makedirs' sederhana seperti yang dimiliki Salt: docs.saltstack.com/en/latest/ref/states/all/…
lsh

7

AFAIK, satu-satunya cara ini bisa dilakukan adalah dengan menggunakan state=directoryopsi. Meskipun templatemodul mendukung sebagian besar copyopsi, yang pada gilirannya mendukung sebagian besar fileopsi, Anda tidak dapat menggunakan sesuatu yang serupa state=directorydengannya. Selain itu, ini akan sangat membingungkan (apakah itu berarti itu {{project_root}}/conf/code.confadalah direktori? Atau apakah itu artinya{{project_root}}/conf/ harus dibuat terlebih dahulu.

Jadi saya tidak berpikir ini mungkin sekarang tanpa menambahkan filetugas sebelumnya .

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

7

Menurut dokumen terbaru ketika status disetel menjadi direktori, Anda tidak perlu menggunakan parameter recurse untuk membuat direktori induk, modul file akan mengurusnya.

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

ini cukup ongkos untuk membuat direktori induk data yang dan uji dengan foo

silakan lihat deskripsi parameter - " state " http://docs.ansible.com/ansible/latest/modules/file_module.html


Harap tambahkan di sini solusi, bukan tautan yang bisa rusak di masa mendatang.
Ignacio Ara

@IgnacioAra terima kasih atas komentarnya yang berharga, saya telah menambahkan solusi.
Alby


1

modul copy membuat direktori jika tidak ada. Dalam kasus ini, direktori telah dibuat diselesaikan.conf.d

- name: put fallback_dns.conf in place                                                                 
  copy:                                                                                                
    src: fallback_dns.conf                                                                             
    dest: /etc/systemd/resolved.conf.d/                                                                
    mode: '0644'                                                                                       
    owner: root                                                                                        
    group: root                                                                                        
  become: true                                                                                         
  tags: testing
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.