2015-02-05 21 views
61

Cách dễ nhất để tạo tệp trống bằng Ansible là gì? Tôi biết tôi có thể lưu một tập tin trống vào thư mục files và sau đó sao chép nó vào máy chủ từ xa, nhưng tôi thấy rằng phần nào không đạt yêu cầu.Cách tạo tệp trống với Ansible?

Một cách khác là để chạm vào một tập tin trên máy chủ từ xa:

- name: create fake 'nologin' shell 
    file: path=/etc/nologin state=touch owner=root group=sys mode=0555 

Nhưng sau đó các tập tin được chạm vào mọi thời gian, hiển thị như một đường màu vàng trong nhật ký, cũng là không đạt yêu cầu ...

Có giải pháp nào tốt hơn cho vấn đề đơn giản này không?

Trả lời

79

các tài liệu của các mô-đun tập tin nói

Nếu state=file, các tập tin sẽ kHÔNG được tạo ra nếu nó không tồn tại, xem bản sao hoặc mẫu mô-đun nếu bạn muốn hành vi đó.

Vì vậy, chúng tôi sử dụng mô-đun sao chép, sử dụng force=no để tạo tệp trống mới chỉ khi tệp chưa tồn tại (nếu tệp tồn tại, nội dung của tệp được giữ nguyên).

- name: ensure file exists 
    copy: 
    content: "" 
    dest: /etc/nologin 
    force: no 
    group: sys 
    owner: root 
    mode: 0555 

Đây là giải pháp khai báo và thanh lịch.

+1

Nó cũng làm trống tệp, nếu nó đã tồn tại –

+10

@ ÁkosVandra: Thực ra nó không có. Xem: 'lực: không'. – palacsint

+0

Cảm ơn - đây là giải pháp đẹp hơn nhiều so với tệp/chạm hoặc câu trả lời/tệp được chấp nhận và rất dễ làm với "with_items" – Realist

29

Something như thế này (bằng cách sử dụng mô-đun stat đầu tiên để thu thập dữ liệu về nó và sau đó lọc bằng cách sử dụng có điều kiện) nên làm việc:

- stat: path=/etc/nologin 
    register: p 

- name: create fake 'nologin' shell 
    file: path=/etc/nologin state=touch owner=root group=sys mode=0555 
    when: p.stat.exists is defined and not p.stat.exists 

Hoặc bạn có thể có thể tận dụng chức năng changed_when.

+18

có thể nó sẽ là: "khi: không phải p.stat.exists" – piro

21

Một tùy chọn khác, bằng cách sử dụng mô-đun lệnh:

- name: Create file 
    command: touch /path/to/file 
    args: 
    creates: /path/to/file 

Các 'tạo ra' tranh luận đảm bảo rằng hành động này không được thực hiện nếu tập tin tồn tại.

+1

Bạn nên tránh lệnh càng nhiều càng tốt vì nó không phải là idempotent. http://ryaneschinger.com/blog/ensuring-command-module-task-is-repeatable-with-ansible/ – redshark1802

+1

@ redshark1802 Đồng ý. Mặc dù trong trường hợp này, nhiệm vụ là không cần thiết, vì nó sẽ không được thực hiện nếu "/ path/to/file" đã tồn tại. Tôi nghĩ giải pháp của René Pijl là giải pháp an toàn hơn trong ba câu trả lời hàng đầu, và chắc chắn là bạn nên sử dụng nếu cần thiết lập quyền sở hữu, chế độ, v.v. – Leynos

9

Xây dựng trên câu trả lời được chấp nhận, nếu bạn muốn tệp được kiểm tra quyền trên mọi lần chạy và các tệp này được thay đổi tương ứng nếu tệp tồn tại hoặc chỉ tạo tệp nếu nó không tồn tại, bạn có thể sử dụng như sau :

- stat: path=/etc/nologin 
    register: p 

- name: create fake 'nologin' shell 
    file: path=/etc/nologin 
     owner=root 
     group=sys 
     mode=0555 
     state={{ "file" if p.stat.exists else "touch"}} 
+0

Câu trả lời này rất tuyệt vời vì tính linh hoạt mà nó mang lại cho bạn trong việc xác định tập tin thuộc tính của một tập tin nếu nó không tồn tại. –

8

file: path=/etc/nologin state=touch

Full tương đương mất liên lạc (mới trong 1.4+) - sử dụng stat nếu bạn không muốn thay đổi tập tin dấu thời gian.

Các vấn đề liên quan