【问题标题】:Ansible not removing directoryAnsible 不删除目录
【发布时间】:2016-08-23 03:14:45
【问题描述】:

我正在尝试使用 Ansible 2.0.0.2 中的 absent 状态从我的应用程序中清除一些缓存目录,但效果不佳。检查以下错误:

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,但我想成为那个“良好实践”的人。

有什么想法吗? :)

【问题讨论】:

  • 我很困惑,因为您的错误消息中的路径与您的 file 任务中的路径完全不同。您是否可以编辑此问题以包含您的剧本中的 actual 任务和 actual 错误消息?这种不匹配让人不清楚发生了什么。
  • 当然。完毕。基本上,ansible 告诉我 tmp 目录中有一些文件仍然存在或不存在。但关键是,我不希望它停止删除过程,而只是删除缓存目录中的所有内容。顺便谢谢。
  • 触发错误的文件有什么值得注意的地方吗?例如,它是一个损坏的符号链接,还是不是一个常规文件?另外,您使用的是哪个版本的 Ansible?另外,你考虑过command: rm -rf /path/to/my/app/caches/tmp吗?
  • ansible 2.0.0.2 没什么特别的,只是来自 jboss 应用程序的一个 jar 文件。
  • 您能否在 Ansible 运行完成后将ls -l /path/to/my/app/caches/tmp/whatever.tmp 的输出包含在您的问题中?

标签: linux file directory ansible


【解决方案1】:

为了后代:

看起来好像是错误...

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,你会得到No such file or directory 错误。

这里的解决方案可能只是使用rm

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

另一种解决方案是修补 Ansible,以便可以在 shutil.rmtree 上设置 ignore_errors 参数。

【讨论】:

    【解决方案2】:

    只是一个注释 - 也是为了后代。通常,删除正在使用的目录并不总是正确的。应该尽量避免。

    我刚刚遇到了类似的情况,即 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 文件在服务返回成功stopped 状态后被删除,而文件树已经被删除。

    为了防止这种情况发生,我只是在两者之间添加了以下任务:

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

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      如果您认为此错误的原因是您要删除的目录发生了一些意外的运行时更改,您可以考虑在任务中添加重试。

      - file: dest=/path/to/my/app/caches/tmp state=absent
        register: delete_folder
        retries: 5
        delay: 2
        until: delete_folder is success
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-09-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-01-21
        • 2015-03-01
        相关资源
        最近更新 更多