O código abaixo exclui apenas o primeiro arquivo que ele obtém dentro do diretório da web. Desejo remover todos os arquivos e pastas dentro do diretório da web e retê-lo. Como eu posso fazer isso?
- name: remove web dir contents
file: path='/home/mydata/web/{{ item }}' state=absent
with_fileglob:
- /home/mydata/web/*
Nota: Tentei rm -rf
usar o comando e o shell, mas eles não funcionam. Talvez eu esteja usando-os incorretamente.
Qualquer ajuda na direção certa será apreciada.
Estou usando o ansible 2.1.0.0
Respostas:
O código abaixo excluirá todo o conteúdo de
artifact_path
Nota : isso também excluirá o diretório.
fonte
rm -rf /
momentos da históriawhen: artifact_path is defined and artifact_path != ""
Usando o módulo shell ( também idempotente ):
Solução mais limpa se você não se importa com a data de criação e o proprietário / permissões:
fonte
shell
dentro paracommand
e ele funcionaRemova o diretório (basicamente uma cópia de https://stackoverflow.com/a/38201611/1695680 ), o Ansible faz essa operação
rmtree
sob o capô.Se você não tiver o luxo de remover o diretório inteiro e recriá-lo, poderá procurar arquivos (e diretórios) e excluí-los um a um. O que vai demorar um pouco. Você provavelmente quer ter certeza de que tem
[ssh_connection]\npipelining = True
seu ansible.cfg ativado.fonte
state=empty
Eu realmente não gostei da solução rm, também o ansible fornece avisos sobre o uso de rm. Então, aqui está como fazê-lo sem a necessidade de rm e sem avisos ansíveis.
fonte: http://www.mydailytutorials.com/ansible-delete-multiple-files-directories-ansible/
fonte
tente o comando abaixo, ele deve funcionar
fonte
with_items: "{{ contents.stdout_lines }}"
ls
'output para obter nomes de arquivos porque não imprime corretamente nomes de arquivos com caracteres especiais, como novas linhas.Criou uma implementação geral rehauled e à prova de falhas a partir de todos os comentários e sugestões:
fonte
register
paraplugin_dir_deleted
, certo?owner: dir_to_delete.stat.pw_name, group: dir_to_delete.stat.gr_name mode: dir_to_delete.stat.mode
mas ele falha em mim com a minha versão atual do Ansible :(Usando o arquivo glob também funcionará. Há algum erro de sintaxe no código que você postou. Eu modifiquei e testei isso deve funcionar.
fonte
with_fileglob
funciona apenas na máquina local, não na remota; não é verdade?Enquanto o Ansible ainda está debatendo para implementar
state = empty
https://github.com/ansible/ansible-modules-core/issues/902Observe, porém, com a sincronização, você poderá sincronizar seus arquivos (com exclusão) corretamente de qualquer maneira.
fonte
Isso é o que eu proponho:
Primeiro, estamos recebendo a listagem de diretórios com
find
, definindofile_type
paraany
não perdermos diretórios e links aninhadoshidden
parayes
, para não pularmos arquivos ocultosrecurse
comoyes
, pois não é apenas desnecessário, mas pode aumentar o tempo de execução.Então, passamos por essa lista com o
file
módulo. Sua saída é um pouco detalhada, porloop_control.label
isso nos ajudará a limitar a saída (encontrei este conselho aqui ).Mas achei a solução anterior um pouco lenta, pois itera pelo conteúdo, então fui com:
stat
Isso foi o suficiente para mim, mas você pode adicionar
attributes
também, se quiser.fonte
Há um problema em aberto com relação a isso.
Por enquanto, a solução funciona para mim: crie uma pasta vazia localmente e sincronize-a com a remota.
Aqui está um exemplo de manual:
fonte
Eu escrevi um módulo ansible personalizado para limpar arquivos com base em vários filtros, como idade, carimbo de data e hora, padrões glob, etc.
Também é compatível com versões antigas ansible. Pode ser encontrado aqui .
Aqui está um exemplo:
fonte
Quero ter certeza de que o comando find exclua apenas tudo dentro do diretório e deixe o diretório intacto, porque no meu caso, o diretório é um sistema de arquivos. O sistema irá gerar um erro ao tentar excluir um sistema de arquivos, mas essa não é uma boa opção. Estou usando a opção de shell, porque essa é a única opção de trabalho que encontrei até agora para esta pergunta.
O que eu fiz:
Edite o arquivo hosts para inserir algumas variáveis:
E crie um manual:
Isso excluirá todos os arquivos e diretórios no diretório / sistema de arquivos variáveis COGNOS_HOME. A opção "-mindepth 1" garante que o diretório atual não seja tocado.
fonte
Apenas um pequeno modelo de copiar e colar mais limpo da resposta do ThorSummoners, se você estiver usando Ansible> = 2.3 (distinção entre arquivos e diretórios não é mais necessária).
fonte
Supondo que você esteja sempre no Linux, tente o
find
cmd.Isso deve apagar arquivos / pastas / ocultos em
/home/mydata/web
fonte
fonte
Este é o meu exemplo.
iniciar o rsyslog
fonte
Abaixo funcionou para mim,
fonte