2016-04-28 2 views
1

Я пытаюсь использовать состояние absent от Ansible 2.0.0.2 для очистки некоторых кеш-каталогов от моего приложения, и он не работает хорошо. Проверьте ошибку ниже:Ansible not remove directory

fatal: [my target IP goes here]: FAILED! => {"changed": false, "failed": 
true, "msg": "rmtree failed: [Errno 2] No such file or directory: 
'/path/to/my/app/caches/tmp/whatever.tmp'"} 

Это «файл» строка из пьес:

file: dest=/path/to/my/app/caches/tmp state=absent 

я мог бы использовать какой-то модуль оболочки и поставить некоторые гт здесь и там, но я хотел бы быть, парень «хорошей практики».

Любые мысли? :)

+0

Я смущен, потому что путь в вашем сообщении об ошибке полностью отличается от пути в вашей задаче 'file'. Не могли бы вы изменить этот вопрос, чтобы включить * актуальную * задачу из вашей пьесы и сообщение об ошибке * actual *? Несоответствие не дает понять, что происходит. – larsks

+0

Несомненно. Готово. В основном, ansible говорит мне, что есть некоторый файл внутри каталога tmp, который все еще или не существует.Но дело в том, что я не хочу, чтобы он остановил процесс удаления и просто удалил все содержимое каталога кэшей. Спасибо, кстати. – Kokonoe0825

+0

Есть ли что-нибудь примечательное в отношении файла, вызывающего ошибку? Например, это сломанная символическая ссылка или что-то иное, чем обычный файл? Кроме того, какую версию Ansible вы используете? Кроме того, вы считали просто 'command: rm -rf/path/to/my/app/caches/tmp'? – larsks

ответ

2

Для потомков:

Это выглядит, как если бы ошибка ...

fatal: [my target IP goes here]: FAILED! => {"changed": false, "failed": 
true, "msg": "rmtree failed: [Errno 2] No such file or directory: 
'/path/to/my/app/caches/tmp/whatever.tmp'"} 

..., вероятно, появляющееся, потому что файл становится удален между (а) питоном получить список файлов в каталоге и (б) на самом деле пытается удалить файлы. Если вы посмотрите на код, анзибль удаляет каталоги, вызвав shutil.rmtree, который делает это:

try: 
     names = os.listdir(path) 
    except os.error, err: 
     onerror(os.listdir, path, sys.exc_info()) 
    for name in names: 
     fullname = os.path.join(path, name) 
     try: 
      mode = os.lstat(fullname).st_mode 
     except os.error: 
      mode = 0 
     if stat.S_ISDIR(mode): 
      rmtree(fullname, ignore_errors, onerror) 
     else: 
      try: 
       os.remove(fullname) 
      except os.error, err: 
       onerror(os.remove, fullname, sys.exc_info()) 

Если файл был удален между вызовом os.listdir и призыв к os.remove, вы получите ошибку No such file or directory.

Решение здесь, вероятно, просто использовать rm:

command: rm -rf /path/to/my/app/caches/tmp 

Альтернативным решением было бы залатать анзибль таким образом, чтобы можно было установить параметр ignore_errors на shutil.rmtree.

+0

Ницца. Спасибо. – Kokonoe0825

1

Просто примечание - также для потомков. В общем, не всегда правильно удалять каталоги, которые используются. Его следует избегать, если это возможно.

Я столкнулся с аналогичной ситуацией, когда проигрыватель останавливает службу и стирает ее рабочий каталог, но по какой-то причине служба сообщает о успешном завершении преждевременно, прежде чем она фактически остановится.

Это приводит к следующему отказа:

TASK [test : Stop the service] 
************************************** 
changed: [XXX.XXX.XXX.XXX] 

TASK [test : Wipe the service directory] 
********************************** 
fatal: [XXX.XXX.XXX.XXX]: FAILED! => {"changed": false, "failed": true, "msg": "rmtree failed: [Errno 2] No such file or directory: '/service/workdir/process.pid'"} 

Это означает, что файл .pid был удален после того, как служба вернула успешный stopped статус, когда файл дерево уже удалено.

Чтобы не допустить этого я просто добавил следующее задание между:

- name: Wait for the .pid file to disappear 
    wait_for: 
    path: '{{ service_workdir }}/service.pid' 
    state: 'absent' 
    timeout: 10 

Надеется, что это помогает.