Ansible: Como definir recursivamente permissões de diretório e arquivo


52

Em ansible, eu posso fazer isso:

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

E define recursivamente o proprietário, o grupo e as permissões para 0775 em todos os diretórios e arquivos nesse caminho. Mas eu quero definir diretórios para 0775 e arquivos para 0664. Existe alguma maneira de tornar isso possível?


Respostas:


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

irá definir diretórios para 755 e arquivos para 644.


isso não funciona para arquivos.
Mirza

11
@ Adam Chance Onde está a mágica? Como a especificação u, g, o tornam diferente do número (e onde é 644 escrito?)
linuxbandit

4
O código fonte menciona que a manipulação simbólica do ugo é igual à manipulação do "man chmod" - capital X possui manipulação especial com base no status do arquivo dir / file e nos bits de execução existentes. github.com/ansible/ansible/blob/…
Marc Tamsky

2
Em outras palavras, Xé xpara diretórios e nada para arquivos. E é assim que chmod, não ansibletrata a string de modo. Eu gostaria Sque fosse tratado da mesma forma.
x-yuri

11
Mas observe que ele torna os arquivos executáveis ​​pelo proprietário executáveis ​​por todos .
x-yuri

25

Os módulos Ansible de arquivo / cópia não oferecem a granularidade de especificar permissões com base no tipo de arquivo; portanto, você provavelmente precisará fazer isso manualmente, fazendo algo ao longo destas linhas:

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

Isso teria o efeito de recorrer {{ path }}e alterar as permissões de cada arquivo ou diretório para as permissões especificadas.

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


@luckytaxi, a resposta fornecida pelo gmangin não define recursivamente as permissões dos subdiretórios.
perfil completo de Dejay Clayton

ahhhh você está correto! eu vi a uma recurseopção, mas não a outra.
luckytaxi

9

Se você deseja usar o arquivo de módulo em ansible, você pode:

file: dest = / foo / bar / somedir owner = grupo raiz = modo apache = 0644 recurse = yes

file: dest = / foo / bar / somedir owner = grupo raiz = modo apache = 0775

Com esse método, você primeiro define todo o arquivo (recurs = yes) como '644' e depois define / foo / bar / somedir como '775'.

Isso não é perfeito, pois altera a permissão do diretório toda vez que você toca seu playbook. Mas pelo menos é idempotente, não como o comando do módulo.

Se você não deseja ter o status 'alterado', pode usar o stat do módulo. Ele listará todos os arquivos e diretórios em / foo / bar / somedir para que você registre a resposta e faça um loop apenas nesses arquivos.


7
Sua resposta definirá todos os subarquivos e subdiretórios para 644, enquanto define apenas o diretório de nível superior como 775. A necessidade é que todos os diretórios sejam 775, incluindo subdiretórios.
Edward Ned Harvey

Esta sugestão não é idempotente. Definir as permissões primeiro como um valor e depois para outro significa que as permissões serão alteradas a cada execução.
Kevin Keane

5

Não tenho certeza de quanto sentido definir diretórios para 0775 ( rwxrwxr-x) e arquivos para 0644 ( rw-r--r--): diretórios graváveis ​​em grupo, mas não arquivos?

Se você pretendia definir arquivos como 0664 ( rw-rw-r--) para garantir que os arquivos não sejam executáveis ​​enquanto os diretórios podem ser percorridos, existe uma solução elegante envolvendo apenas um chmodcomando:

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

Aqui está como ele pode ser usado no 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 -cimprime todas as alterações que podemos usar convenientemente para preencher o status "alterado" no Ansible . Espero que faça sentido.


3

Para alterar apenas mods quando necessário:

- 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 {} \;
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.