Ansible: Cách đặt đệ quy quyền truy cập thư mục và tệp


52

Trong ansible, tôi có thể làm điều này:

file: dest=/foo/bar/somedir owner=root group=apache mode=0775 recurse=yes

Và nó đệ quy đặt chủ sở hữu, nhóm và quyền thành 0775 trên tất cả các thư mục và tệp trong đường dẫn đó. Nhưng tôi muốn đặt thư mục thành 0775 và các tệp thành 0664. Có cách nào để làm cho ansible làm điều này không?


Câu trả lời:


33
file: dest=/foo/bar/somedir owner=root group=apache mode=u=rwX,g=rX,o=rX recurse=yes

sẽ đặt thư mục thành 755 và tệp thành 644.


Điều này không làm việc cho các tập tin.
mirza

1
@Adam Chance Phép thuật ở đâu? Làm thế nào để chỉ định u, g, o làm cho nó khác với số (và 644 được viết ở đâu?)
linuxbandit

4
Mã nguồn đề cập rằng việc xử lý ugo tượng trưng giống như cách xử lý của "man chmod" - vốn X có cách xử lý đặc biệt dựa trên trạng thái tập tin / tập tin và các bit thực thi hiện có. github.com/ansible/ansible/blob/
Mạnh

2
Nói cách khác, Xxcho các thư mục, và không có gì cho các tập tin. Và đó là cách chmod, không ansiblexử lý chuỗi chế độ. Tôi ước Ssẽ được đối xử tương tự.
x-yuri

1
Nhưng hãy lưu ý rằng nó làm cho các tập tin được thực thi bởi chủ sở hữu thực thi bởi tất cả .
x-yuri

25

Các mô-đun tệp / sao chép Ansible không cung cấp cho bạn mức độ chi tiết của việc chỉ định các quyền dựa trên loại tệp, do đó rất có thể bạn cần phải thực hiện việc này một cách thủ công bằng cách thực hiện một số thứ dọc theo các dòng này:

- name: Ensure directories are 0755
  command: find {{ path }} -type d -exec chmod 0755 {} \;

- name: Ensure files are 0644
  command: find {{ path }} -type f -exec chmod 0644 {} \;

Chúng sẽ có tác dụng đệ quy thông qua {{ path }}và thay đổi quyền của mọi tệp hoặc thư mục thành các quyền được chỉ định.

Nguồn: https://stackoverflow.com/a/28782805/1306186


@luckytaxi câu trả lời được cung cấp bởi gmangin không đặt đệ quy các quyền của thư mục con.
Dejay Clayton

ahhhh bạn đúng! tôi thấy một recurselựa chọn nhưng không phải là lựa chọn khác.
luckytaxi

9

Nếu bạn muốn sử dụng tệp mô-đun trong ansible, bạn có thể:

tệp: Dest = / foo / bar / somedir chủ sở hữu = nhóm gốc = chế độ apache = 0644 recurse = có

tệp: Dest = / foo / bar / somedir chủ sở hữu = nhóm gốc = chế độ apache = 0775

Với phương pháp này, trước tiên bạn đặt tất cả tệp (recurse = yes) thành '644' và sau đó bạn đặt / foo / bar / somedir thành '775'.

Điều này là không hoàn hảo bởi vì nó sẽ thay đổi quyền thư mục của bạn mỗi khi bạn chơi Playbook. Nhưng ít nhất nó là idempotent, không giống như lệnh mô-đun.

Nếu bạn không muốn có trạng thái 'thay đổi', bạn có thể sử dụng chỉ số mô-đun. Nó sẽ liệt kê tất cả các tệp và thư mục trong / foo / bar / somedir để bạn đăng ký câu trả lời và sau đó thực hiện một vòng lặp trên các tệp đó.


7
Câu trả lời của bạn sẽ đặt tất cả các thư mục con và thư mục con thành 644, trong khi chỉ đặt thư mục cấp cao nhất thành 775. Nhu cầu là tất cả các thư mục là 775, bao gồm cả thư mục con.
Edward Ned Harvey

Đề nghị này không phải là bình thường. Đặt quyền trước tiên cho một giá trị và sau đó thành giá trị khác, có nghĩa là các quyền sẽ được thay đổi trong mỗi lần chạy.
Kevin Keane

5

Tôi không chắc chắn sẽ có ý nghĩa như thế nào khi đặt thư mục thành 0775 ( rwxrwxr-x) và tệp thành 0644 ( rw-r--r--): thư mục có thể ghi nhóm nhưng không phải tệp?

Nếu bạn định đặt các tệp thành 0664 ( rw-rw-r--) để đảm bảo rằng các tệp không thể thực thi được trong khi các thư mục có thể duyệt được thì có một giải pháp tao nhã chỉ liên quan đến một chmodlệnh:

chmod -c -R ug=rw,o=r,a-x+X "{{top_dir}}"

Đây là cách nó có thể được sử dụng trong Ansible :

- name: recursive chmod example
  command: |
    chmod -c -R ug=rw,o=r,a-x+X "{{item}}"
  register: chmod_status
  changed_when: chmod_status.stdout != ""
  with_items:
    - "/home/user/sample/dir"

chmod -cin tất cả các thay đổi mà chúng ta có thể sử dụng một cách thuận tiện để đưa vào trạng thái "đã thay đổi" trong Ansible . Tôi hy vọng nó có ý nghĩa.


3

Để chỉ thay đổi mod khi cần:

- name: make dirs 0755   
  command: find {{ your_path }} -type d ! -perm 0755 -exec chmod 0755 {} \;

- name: make files 0644   
  command: find {{ your_path }} -type f ! -perm 0644 -exec chmod 0644 {} \;
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.