Linux 不删除目录
我正试图使用Ansible 2.0.0.2中的Linux 不删除目录,linux,file,directory,ansible,Linux,File,Directory,Ansible,我正试图使用Ansible 2.0.0.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'"} 这是剧本
缺席
状态从我的应用程序中清除一些缓存目录,但效果不好。检查以下错误:
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
我可以使用一些shell模块,在这里和那里放置一些rm,但我想成为那个“良好实践”的家伙
有什么想法吗?:) 为了子孙后代:
看起来好像错误
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'"}
…的出现可能是因为文件在(a)python获取目录中的文件列表和(b)实际尝试删除文件之间被删除。如果查看代码,Ansible会通过调用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
,您将得到无此类文件或目录的错误
这里的解决方案可能只是使用rm
:
command: rm -rf /path/to/my/app/caches/tmp
另一种解决方案是修补Ansible,这样就可以在shutil.rmtree
上设置ignore\u errors
参数,这只是一个注释,也是为了子孙后代。一般来说,删除正在使用的目录并不总是正确的。如果可能的话,应该避免
我刚刚遇到了一个类似的情况,playbook停止了一个服务并擦除了它的工作目录,但由于某种原因,该服务在实际停止之前报告成功提前结束
这将导致以下故障:
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
文件在服务返回成功的停止
状态后被删除,此时文件树已被删除
为了防止这种情况发生,我在两者之间添加了以下任务:
- name: Wait for the .pid file to disappear
wait_for:
path: '{{ service_workdir }}/service.pid'
state: 'absent'
timeout: 10
希望这有帮助。
如果您认为这个错误的原因是您想删除的目录中的一些意外的运行时更改,则可以考虑向任务添加重试。
- file: dest=/path/to/my/app/caches/tmp state=absent
register: delete_folder
retries: 5
delay: 2
until: delete_folder is success
我很困惑,因为错误消息中的路径与文件
任务中的路径完全不同。您是否可以编辑此问题,以包含您的剧本中的实际任务和实际错误消息?这种不匹配使我们不清楚到底发生了什么。完成。基本上,ansible告诉我tmp目录中有一些文件仍然存在或不存在。但关键是,我不希望它停止删除过程,只删除缓存目录中的所有内容。顺便问一下,谢谢。触发错误的文件有什么值得注意的地方吗?例如,它是一个损坏的符号链接,还是一个普通文件以外的文件?另外,您使用的是哪个版本的Ansible?另外,您是否考虑过简单的命令:rm-rf/path/to/my/app/caches/tmp
?ansible 2.0.0.2没有什么特别的,只是jboss应用程序中的一个jar文件。在ansible运行完成后,您能否在问题中包括ls-l/path/to/my/app/caches/tmp/where.tmp的输出?