Ansible: Jak rekurencyjnie ustawiać uprawnienia do katalogów i plików

52

W ansible mogę to zrobić:

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

I rekurencyjnie ustawia właściciela, grupę i uprawnienia na 0775 we wszystkich katalogach i plikach na tej ścieżce. Ale chcę ustawić katalogi na 0775, a pliki na 0664. Czy jest jakiś sposób, aby zrobić to w ansible?

Edward Ned Harvey
źródło

Odpowiedzi:

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

ustawi katalogi na 755, a pliki na 644.

Adam Chance
źródło
to nie działa dla plików.
mirza
1
@Adam Chance Gdzie jest magia? W jaki sposób określenie u, g, o różni go od liczby (i gdzie jest napisane 644?)
linuxbandit
4
Kod źródłowy wspomina, że ​​symboliczna obsługa ugo jest taka sama jak obsługa „man chmod” - Capital X ma specjalną obsługę opartą na statusie pliku / katalogu i istniejących bitach wykonania. github.com/ansible/ansible/blob/…
Marc Tamsky
2
Innymi słowy, Xdotyczy xkatalogów, a nic nie dotyczy plików. I w ten sposób chmodnie ansibletraktuje ciągu trybu. Życzę Sbędą traktowane podobnie.
x-yuri
1
Pamiętaj jednak, że sprawia, że ​​pliki mogą być wykonywane przez właściciela przez wszystkich .
X-Yuri
25

Moduły pliku / kopiowania Ansible nie zapewniają szczegółowości określania uprawnień w oparciu o typ pliku, więc najprawdopodobniej trzeba by to zrobić ręcznie, wykonując coś w następujący sposób:

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

Spowodowałoby to rekurencję {{ path }}i zmianę uprawnień każdego pliku lub katalogu na określone uprawnienia.

Źródło: https://stackoverflow.com/a/28782805/1306186

Zulakis
źródło
@luckytaxi odpowiedź udzielona przez gmangin nie ustawia rekurencyjnie uprawnień do podkatalogów.
Dejay Clayton
ahhhh masz rację! widziałem jedną recurseopcję, ale nie drugą.
luckytaxi
9

Jeśli chcesz użyć pliku modułu w ansible, możesz:

plik: dest = / foo / bar / somedir owner = grupa główna = tryb apache = 0644 recurse = tak

plik: dest = / foo / bar / somedir owner = grupa główna = tryb apache = 0775

Za pomocą tej metody najpierw ustawiasz cały plik (recurse = yes) na „644”, a następnie ustawiasz / foo / bar / somedir na „775”.

Nie jest to idealne, ponieważ spowoduje zmianę uprawnień do katalogu za każdym razem, gdy grasz w playbook. Ale przynajmniej jest idempotentny, nie tak jak polecenie modułu.

Jeśli nie chcesz mieć statusu „zmienionego”, możesz użyć statystyki modułu. Wyświetli listę wszystkich plików i katalogu w / foo / bar / somedir, więc zarejestrujesz odpowiedź, a następnie utworzysz pętlę tylko na tych plikach.

gmangin
źródło
7
Twoja odpowiedź ustawi wszystkie podkatalogi i podkatalogi na 644, a tylko katalog najwyższego poziomu na 775. Konieczne jest, aby wszystkie katalogi miały wartość 775, łącznie z podkatalogami.
Edward Ned Harvey
Ta sugestia nie jest idempotentna. Ustawienie uprawnień najpierw na jedną wartość, a później na inną, oznacza, że ​​uprawnienia będą zmieniane przy każdym uruchomieniu.
Kevin Keane
5

Nie jestem pewien, jaki sens miałoby ustawienie katalogów na 0775 ( rwxrwxr-x) i plików na 0644 ( rw-r--r--): katalogi do zapisu w grupie, ale nie pliki?

Jeśli chciałeś ustawić pliki na 0664 ( rw-rw-r--), aby upewnić się, że pliki nie są wykonywalne, podczas gdy katalogi są przeszukiwane, istnieje eleganckie rozwiązanie obejmujące tylko jedno chmodpolecenie:

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

Oto, jak można go użyć w 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 -cwypisuje wszystkie zmiany, których możemy wygodnie użyć do wypełnienia statusu „zmieniono” w Ansible . Mam nadzieję, że to ma sens.

Onlyjob
źródło
3

Aby zmieniać mody tylko w razie potrzeby:

- 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 {} \;
sjas
źródło