Ansible: Cara mengatur izin direktori dan file secara rekursif

52

Tidak mungkin, saya bisa melakukan ini:

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

Dan itu secara rekursif menetapkan pemilik, grup, dan izin ke 0775 pada semua direktori dan file di jalur itu. Tapi saya ingin mengatur direktori ke 0775, dan file ke 0664. Apakah ada cara untuk memungkinkan melakukan ini?

Edward Ned Harvey
sumber

Jawaban:

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

akan mengatur direktori ke 755, dan file ke 644.

Adam Chance
sumber
ini tidak berfungsi untuk file.
mirza
1
@Adam Chance Dimana keajaibannya? Bagaimana menentukan u, g, o membuatnya berbeda dari nomor (dan di mana 644 ditulis?)
linuxbandit
4
Kode sumber menyebutkan bahwa penanganan ugo simbolik sama dengan penanganan "man chmod" - capital X memiliki penanganan khusus berdasarkan status file / dir dan bit eksekusi yang ada. github.com/ansible/ansible/blob/…
Marc Tamsky
2
Dengan kata lain, Xadalah xuntuk direktori, dan bukan untuk file. Dan begitulah chmod, tidak ansiblememperlakukan string mode. Saya berharap Sakan diperlakukan juga.
x-yuri
1
Namun perlu diperhatikan, bahwa itu membuat file dapat dieksekusi oleh pemilik dapat dieksekusi oleh semua .
x-yuri
25

Modul file / salin yang mungkin tidak memberi Anda rincian menentukan izin berdasarkan jenis file sehingga kemungkinan besar Anda perlu melakukan ini secara manual dengan melakukan sesuatu di sepanjang baris ini:

- 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 {} \;

Ini akan memiliki efek berulang melalui {{ path }}dan mengubah izin setiap file atau direktori ke izin yang ditentukan.

Sumber: https://stackoverflow.com/a/28782805/1306186

Zulakis
sumber
@ luckytaxi jawaban yang diberikan oleh gmangin tidak secara rekursif mengatur izin subdirektori.
Dejay Clayton
ahhhh kamu benar! saya melihat satu recurseopsi tetapi tidak yang lain.
luckytaxi
9

Jika Anda ingin menggunakan file modul dengan cara yang memungkinkan, Anda dapat:

file: dest = / foo / bar / somedir pemilik = grup root = mode apache = 0644 recurse = ya

file: dest = / foo / bar / somedir pemilik = grup root = mode apache = 0775

Dengan metode ini, pertama-tama Anda mengatur semua file (recurse = yes) ke '644' dan kemudian Anda mengatur / foo / bar / somedir ke '775'.

Ini tidak sempurna karena akan mengubah izin direktori Anda setiap kali Anda memainkan buku pedoman Anda. Tapi setidaknya itu idempoten, tidak seperti perintah modul.

Jika Anda tidak ingin memiliki status 'berubah', Anda dapat menggunakan stat modul. Ini akan mencantumkan semua file dan direktori di / foo / bar / somedir sehingga Anda mendaftarkan jawabannya dan kemudian membuat loop pada file-file itu saja.

gmangin
sumber
7
Jawaban Anda akan mengatur semua subfile dan subdirektori menjadi 644, sementara hanya mengatur direktori tingkat atas ke 775. Kebutuhannya adalah agar semua direktori menjadi 775, termasuk subdirektori.
Edward Ned Harvey
Saran ini bukan idempoten. Menetapkan izin pertama ke satu nilai, dan kemudian ke yang lain, berarti bahwa izin akan berubah di setiap proses.
Kevin Keane
5

Saya tidak yakin seberapa masuk akal untuk mengatur direktori menjadi 0775 ( rwxrwxr-x) dan file menjadi 0644 ( rw-r--r--): direktori grup yang dapat ditulisi tetapi bukan file?

Jika Anda bermaksud mengatur file ke 0664 ( rw-rw-r--) untuk memastikan bahwa file tidak dapat dieksekusi sementara direktori dapat dilewati maka ada solusi elegan yang hanya melibatkan satu chmodperintah:

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

Inilah cara penggunaannya di 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 -cmencetak semua perubahan yang dapat kita gunakan dengan mudah untuk mengisi status "diubah" di Ansible . Saya harap ini masuk akal.

Onlyjob
sumber
3

Untuk hanya mengubah mod saat dibutuhkan:

- 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 {} \;
sja
sumber