Yanıtlayıcıda mevcut olmayan bir dizini otomatik olarak oluşturmanın kolay yolu nedir


117

Ansible oyun kitabımda birçok kez orada dosya oluşturmam gerekiyor

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

şimdi çoğu kez confdir orada değil. O halde önce bu dizini oluşturmak için daha fazla görev oluşturmalıyım.

Herhangi bir seçenekle yoksa, otomatik olarak dir oluşturmanın kolay bir yolu var mı?



Bunun hala ansible 2.9'da bir sorun olduğuna inanamıyorum. Bu modüllerin varsayılan olarak kapalı olarak ayarlanan bir create dir geçişine sahip olması ne kadar zor olurdu. Aşağıdaki cevaplar gibi ön testlerle uğraşmak zorunda kaldığı için oyun kitaplarında çok fazla
pürüz kurtaracaktı

Yanıtlar:


139

Şu anda, bu tek yol

- 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
Sanırım burada doğru kelime olduğundan emin olun. Emin olun: "Herhangi bir şüpheyi gidermek için birine olumlu bir şey söyleyin", "(bir şeyin) gerçekleşeceğinden veya böyle olacağından emin olun".
Daniel Compton

Bu, yönetmenliğin var olup olmadığını kontrol ediyor gibi görünüyor, ancak onu yaratmıyor gibi görünüyor.
Matt

8
recurse=yesfilemkdir -p
Mitch,

1
Bulmacanın yardımcı olabilecek bir başka parçası da, bir dosya içeren dizini almak için yanıtlanabilir özel dirnamefiltredir .
Caspar

1
@radtek dosya modülü bunu zaten state = dizin ile yapıyor. Önerilen dosya yolunun bir dizini işaret ettiğinden emin olunamazsa başarısız olur.
Alexander Jardim

21

Tam yol ile başarıyı garantilemek için recurse = yes kullanın

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

2
Belgelere (ve testlerime) göre, alt dizinler her zaman oluşturulur ve recurse=yesizinleri yalnızca yinelemeli olarak uygular. Bununla birlikte, belgeler bunun v1.7'den beri otomatik olarak gerçekleştiğini belirtir, bu nedenle recurseeski olabilir.
2016 saat 11.45'e kadar

16

Ansible> = 2.0 çalıştırıyorsanız , bir yolun dizin bölümünü çıkarmak için kullanabileceğiniz bir dizin adı filtresi de vardır . Bu şekilde, her iki görevin de asla senkronize olmadığından emin olmak için tüm yolu tutmak için tek bir değişken kullanabilirsiniz.

Örneğin, böyle dest_pathbir değişkende tanımlanmış başucu kitabınız varsa , aynı değişkeni yeniden kullanabilirsiniz:

- 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
bu çözüm hala ayrıntılı olsa da, yazarın niyetine en yakın olduğunu düşünüyorum. Ben ediyorum aşk basit olsaydı o Salt gibi 'makedirs' parametresi vardır: docs.saltstack.com/en/latest/ref/states/all/...
LSH

7

AFAIK, bu tek yol olabilir yapılabilir kullanmaktır state=directoryseçeneği. İken templateçoğunun modül destekleri copydönüş desteklerin çoğu seçenekler, fileseçenekler, gibi bir şey kullanamazsınız state=directoryonunla. Dahası, oldukça kafa karıştırıcı olacaktır (bunun {{project_root}}/conf/code.confbir dizin olduğu anlamına mı gelir? {{project_root}}/conf/Yoksa önce oluşturulması gerektiği anlamına mı gelir?

Bu yüzden, önceki bir filegörev eklemeden bunun şu anda mümkün olduğunu düşünmüyorum .

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

7

Durum dizin olarak ayarlandığında en son belgeye göre, ana dizinler oluşturmak için parametre recurse kullanmanıza gerek yoktur , dosya modülü bununla ilgilenecektir.

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

bu, ana dizin verilerini oluşturmak ve foo ile test etmek için yeterlidir

lütfen parametre açıklamasına bakın - " durum " http://docs.ansible.com/ansible/latest/modules/file_module.html


Lütfen ileride kopabilecek bir bağlantı yerine çözümü buraya ekleyin.
Ignacio Ara

@IgnacioAra değerli yorumunuz için teşekkürler, çözüm ekledim.
Alby


1

copy module, yoksa dizini oluşturur. Bu durumda, resolved.conf.d dizinini oluşturdu

- 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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.