2016-04-28 30 views
1

私は、アプリケーションからいくつかのキャッシュディレクトリをクリーニングするためにAnonymous 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 

は、私はいくつかのシェルモジュールを使用して、そこここにいくつかのRMを入れて、しかし、私はそれになりたいことができ、以下のエラーをチェックします"良い実践"の男。

どのような考えですか? :)後世のために

+0

エラーメッセージのパスが 'file'タスクのパスと完全に異なるため、混乱します。この質問を編集して、プレイブックの*実際の*タスクと*実際の*エラーメッセージを含めることができますか?ミスマッチにより、何が起こっているのか不明確になります。 – larsks

+0

完了しました。基本的には、tmpディレクトリ内にまだ存在していないファイルがあることを私に伝えています。しかし、ポイントは、私はそれが削除プロセスを停止し、キャッシュディレクトリ内のすべてを削除したくないということです。途中でありがとう。 – Kokonoe0825

+0

エラーを引き起こしているファイルに関して注目すべきことはありますか?たとえば、壊れたシンボリックリンク、または通常のファイル以外のものですか?また、どのバージョンのAnsibleをお使いですか?また、あなたは単純に 'コマンド:rm -rf/path/to/my/app/caches/tmp'と考えましたか? – larsks

答えて

2

を:

ファイルリストを取得する(a)のpythonの間に削除取得されているので...

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'"} 

...は、おそらく最大トリミングされたエラーかのように見えます(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 

代替ソリューションは、1がshutil.rmtreeignore_errorsパラメータを設定することができることをAnsibleは、パッチを適用することです。

+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'"} 

これは、ファイルツリーがすでに削除されていたときサービスは、成功したstoppedステータスを返した後.pidファイルが削除されたことを、意味しています。これを防ぐために

私はちょうど間に、次のタスクを追加しました:

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

この情報がお役に立てば幸いです。

関連する問題