Em meu manual do Ansible, preciso alterar as permissões em muitos arquivos, mas alguns subdiretórios precisam de permissões de leitura e gravação, enquanto a maioria precisa de somente leitura. Seguindo outra sugestão do superusuário, tenho esta solução:
- name: A few directories need group-write permissions
file:
path: "{{item}}"
mode: "u+rwX,g+rwX,o+rX,o-w"
recurse: True
with_items:
- /opt/myapp/path1/excludeddir1
- /opt/myapp/path1/excludeddir2
- /opt/myapp/path2/excludeddir1
- /opt/myapp/path2/excludeddir2
- name: For performance, set a lot of directories directly
file:
path: "{{item}}"
mode: "u+rwX,go+rX,go-w"
recurse: True
with_items:
- /opt/myapp/path1/readonlydir1
- /opt/myapp/path1/readonlydir2
#############################################
# This step generates a very large list
- name: Find all files in my directory
find:
paths:
- "/opt/myapp/path1"
- "/opt/myapp/path2"
recurse: True
file_type: any
follow: False
register: filestochange
#############################################
# This step is painfully slow
- name: Clear group-write permissions where needed
file:
path: "{{ item.path }}"
mode: "u+rwX,go+rX,go-w"
follow: False
when:
- not item.islnk
- "'/opt/myapp/path1/excludeddir1' not in item.path"
- "'/opt/myapp/path1/excludeddir2' not in item.path"
- "'/opt/myapp/path2/excludeddir1' not in item.path"
- "'/opt/myapp/path2/excludeddir2' not in item.path"
- "'/opt/myapp/path1/readonlydir1' not in item.path
- "'/opt/myapp/path1/readonlydir2' not in item.path
loop: "{{ filestochange.files }}"
loop_control:
label: "{{ item.path }}"
Os subdiretórios envolvidos possuem um total de aproximadamente 100k arquivos.
O código acima funciona, mas é, não surpreendentemente, dolorosamente lento. A implementação original, em sua maioria ingênua, durou dois dias seguidos.
Minha primeira otimização foi definir as permissões para alguns subdiretórios que não precisam de exceções e, posteriormente, ignorá-los no loop. Isso ajudou até certo ponto; o tempo agora caiu para uma ou duas horas.
Como próxima otimização, gostaria de remover essas mesmas entradas da lista que o módulo find gera antes mesmo de alimentá-lo no loop, mas não encontrei uma maneira de fazer isso.
O módulo de arquivo tem um atributo de exclusão, mas isso parece corresponder apenas a nomes de arquivos, não a nomes de diretórios.
Portanto, estou procurando uma maneira de remover itens de uma lista que correspondam a certos padrões curinga.
É claro que também estou aberto a outras sugestões de como otimizar ainda mais isso.
Observação: essa implementação ingênua NÃO funciona, pois redefiniria e, em seguida, definiria as permissões.
- name: Set everything to G read-only
file:
path: "{{item}}"
mode: "u+rwX,go+rX,go-w"
recurse: True
with_items:
- /opt/myapp/path1
- /opt/myapp/path2
- name: A few directories need group-write permissions
file:
path: "{{item}}"
mode: "u+rwX,g+wrX,o+rX,o-w"
recurse: True
with_items:
- /opt/myapp/path1/excludeddir1
- /opt/myapp/path1/excludeddir2
- /opt/myapp/path2/excludeddir1
- /opt/myapp/path2/excludeddir2
Você pode tentar o filtro de rejeição, por exemplo: