Cách dễ dàng để tự động tạo dir không tồn tại trong ansible là gì


117

Trong vở kịch Ansible của tôi nhiều lần tôi cần tạo tệp ở đó

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

bây giờ nhiều lần confdir không có. Sau đó, tôi phải tạo thêm nhiệm vụ để tạo dir đó trước.

Có cách nào dễ dàng để tự động tạo dir nếu không có với một số tùy chọn



Tôi không thể tin rằng đây vẫn là một vấn đề trong 2.9. Thật khó để các mô-đun này có công tắc tạo dir, được mặc định là tắt. Nó sẽ tiết kiệm rất nhiều điểm mấu chốt trong sách vở, phải đối phó với những thử thách như câu trả lời bên dưới
krad

Câu trả lời:


139

Ngay bây giờ, đây là cách duy nhất

- 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
Tôi nghĩ đảm bảo là từ chính xác ở đây. Đảm bảo: "nói với ai đó điều gì đó một cách tích cực để xua tan mọi nghi ngờ", đảm bảo: "chắc chắn rằng (điều gì đó) sẽ xảy ra hoặc đúng như vậy".
Daniel Compton

Điều đó dường như để kiểm tra xem trực tiếp có tồn tại hay không, nhưng dường như nó không tạo ra nó.
Matt

8
Cần lưu ý rằng bạn có thể muốn thêm recurse=yesvào filecuộc gọi để có được mkdir -phành vi loại
Mitch

1
Một phần khác của câu đố có thể hữu ích là bộ lọc cụ thểdirname để lấy thư mục chứa tệp.
Caspar

1
@radtek, mô-đun tệp đã thực hiện điều đó với thư mục state =. Sẽ không thành công nếu không thể đảm bảo rằng đường dẫn tệp được đề xuất trỏ đến một thư mục.
Alexander Jardim,

21

Để đảm bảo thành công với một đường dẫn đầy đủ, hãy sử dụng recurse = yes

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

2
Theo tài liệu (và các thử nghiệm của tôi), các thư mục con luôn được tạo và recurse=yeschỉ áp dụng các quyền một cách đệ quy. Tuy nhiên, tài liệu nói rằng điều này xảy ra tự động kể từ v1.7, vì vậy recursecó thể đã lỗi thời.
Đến 마 SE

16

Nếu bạn đang chạy Ansible> = 2.0 thì cũng có bộ lọc dirname mà bạn có thể sử dụng để trích xuất phần thư mục của đường dẫn. Bằng cách đó, bạn có thể chỉ sử dụng một biến để giữ toàn bộ đường dẫn để đảm bảo cả hai tác vụ không bao giờ bị mất đồng bộ.

Vì vậy, ví dụ: nếu bạn có playbook dest_pathđược xác định trong một biến như thế này, bạn có thể sử dụng lại cùng một biến:

- 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
trong khi giải pháp này vẫn còn dài dòng, tôi nghĩ rằng nó gần nhất với ý định của tác giả. Tôi sẽ rất thích nếu có một thông số 'makedirs' đơn giản như Salt có: docs.saltstack.com/en/latest/ref/states/all/…
lsh

7

AFAIK, cách duy nhất thể thực hiện điều này là sử dụng state=directorytùy chọn. Trong khi templatemô-đun hỗ trợ hầu hết các copytùy chọn, do đó hỗ trợ hầu hết các filetùy chọn, bạn không thể sử dụng một cái gì đó tương tự state=directoryvới nó. Hơn nữa, nó sẽ khá khó hiểu (nó có nghĩa {{project_root}}/conf/code.conflà một thư mục? Hay nó có nghĩa là nó {{project_root}}/conf/phải được tạo trước.

Vì vậy, tôi không nghĩ rằng điều này có thể thực hiện được ngay bây giờ nếu không thêm một filenhiệm vụ trước đó .

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

7

Theo tài liệu mới nhất khi nhà nước được thiết lập để được thư mục, bạn không cần phải sử dụng tham số recurse để tạo ra các thư mục mẹ, mô-đun tập tin sẽ chăm sóc nó.

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

đây là giá vé đủ để tạo dữ liệu thư mục mẹ và kiểm tra với foo

vui lòng tham khảo mô tả tham số - " trạng thái " http://docs.ansible.com/ansible/latest/modules/file_module.html


Vui lòng thêm vào đây giải pháp thay vì một liên kết có thể bị hỏng trong tương lai.
Ignacio Ara

@IgnacioAra cảm ơn vì nhận xét có giá trị, tôi đã bổ sung giải pháp.
Alby

1

bạn có thể tạo thư mục bằng cách sử dụng cách sau tùy thuộc vào phiên bản có thể nghe được của bạn.

Phiên bản mới nhất 2 <

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

Phiên bản cũ hơn:

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

Tham khảo - http://docs.ansible.com/ansible/latest/file_module.html


1

sao chép mô-đun tạo thư mục nếu nó không có ở đó. Trong trường hợp này, nó tạo thư mục Resolution.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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.