Jaki jest łatwy sposób automatycznego tworzenia nieistniejącego katalogu w ansiblu

117

W moim playbooku Ansible wiele razy muszę tam utworzyć plik

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

teraz wiele razy confreż. nie ma. Następnie muszę utworzyć więcej zadań, aby najpierw utworzyć ten katalog.

Czy jest jakiś łatwy sposób na automatyczne tworzenie katalogu, jeśli nie istnieje z jakąś opcją

user1994660
źródło
Nie mogę uwierzyć, że to wciąż problem w ansiblu 2.9. Jak trudno byłoby tym modułom mieć przełącznik tworzenia katalogu, domyślnie wyłączony. Zaoszczędziłoby to tyle okrucieństw w podręcznikach, mając do czynienia z testami wstępnymi, takimi jak poniższe odpowiedzi
krad

Odpowiedzi:

139

W tej chwili to jedyny sposób

- 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"
Alexander Jardim
źródło
2
Myślę, że to właściwe słowo. Zapewnij: „powiedz komuś coś pozytywnego, aby rozwiać wszelkie wątpliwości”, zapewnij: „upewnij się, że (coś) wydarzy się lub będzie miało miejsce”.
Daniel Compton,
To wydaje się sprawdzać, czy istnieje polecenie, ale nie wydaje się, aby go tworzyło.
Matt,
8
Pamiętaj, że możesz chcieć dodać recurse=yesdo filepołączenia, aby uzyskać mkdir -pzachowanie typu
Mitch,
1
Kolejnym elementem układanki, który może być pomocny, jest filtr specyficznydirname dla ansibla, który pobiera katalog zawierający plik.
Caspar
1
@radtek moduł plików już to robi z state = directory. Nie powiedzie się, jeśli nie będzie możliwe zapewnienie, że proponowana ścieżka do pliku wskazuje katalog.
Alexander Jardim
21

Aby zapewnić sukces z pełną ścieżką, użyj recurse = yes

- name: ensure custom facts directory exists
    file: >
      path=/etc/ansible/facts.d
      recurse=yes
      state=directory
Ian T. Price
źródło
2
Zgodnie z dokumentacją (i moimi testami) podkatalogi są zawsze tworzone i recurse=yesprzyznają uprawnienia tylko rekurencyjnie. Jednak dokumentacja stwierdza, że ​​dzieje się to automatycznie od wersji 1.7, więc recursemoże być przestarzałe.
마 SE,
16

Jeśli używasz Ansible> = 2.0, istnieje również filtr dirname, którego możesz użyć do wyodrębnienia części katalogu ze ścieżki. W ten sposób możesz po prostu użyć jednej zmiennej do przechowywania całej ścieżki, aby upewnić się, że oba zadania nigdy nie stracą synchronizacji.

Na przykład, jeśli masz Playbook ze dest_pathzdefiniowaną w zmiennej takiej jak ta, możesz ponownie użyć tej samej zmiennej:

- 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 }}"
Stefan Horning
źródło
1
Chociaż to rozwiązanie jest wciąż rozwlekłe, myślę, że jest najbliższe intencji autora. Ja kocham ją, jeśli było to prosty parametr „makedirs” jak sól: docs.saltstack.com/en/latest/ref/states/all/...
LSH
7

AFAIK, jedynym sposobem, w jaki można to zrobić, jest użycie state=directoryopcji. Chociaż templatemoduł obsługuje większość copyopcji, co z kolei obsługuje większość fileopcji, nie można state=directoryz nim używać czegoś podobnego . Co więcej, byłoby to dość zagmatwane (czy oznaczałoby to, że {{project_root}}/conf/code.confjest to katalog?), Czy też oznaczałoby, że {{project_root}}/conf/powinien zostać utworzony jako pierwszy.

Więc myślę, że nie jest to teraz możliwe bez dodania poprzedniego filezadania.

- file: 
    path: "{{project_root}}/conf"
    state: directory
    recurse: yes
leucos
źródło
7

Zgodnie z najnowszym dokumentem, gdy stan jest ustawiony na katalog, nie trzeba używać parametru recurse do tworzenia katalogów nadrzędnych, zajmie się tym moduł plików.

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

jest to wystarczające, aby utworzyć dane katalogów nadrzędnych i przetestować je za pomocą foo

proszę zapoznać się z opisem parametru - „ stanhttp://docs.ansible.com/ansible/latest/modules/file_module.html

Alby
źródło
Dodaj tutaj rozwiązanie zamiast łącza, które może zostać zerwane w przyszłości.
Ignacio Ara
@IgnacioAra dzięki za cenny komentarz, dodałem rozwiązanie.
Alby
1

możesz utworzyć folder, korzystając z poniższych, w zależności od wersji ansible.

Najnowsza wersja 2 <

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

Starsza wersja:

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

Zobacz - http://docs.ansible.com/ansible/latest/file_module.html

Chathuranga Abeyrathna
źródło
1

Moduł copy tworzy katalog, jeśli go tam nie ma. W tym przypadku utworzył katalog resolved.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
Patrick Brunswyck
źródło