2016-01-22 31 views
-1

我需要創建一個Ansible劇本刪除僅如果文件存在特定的目錄中*.web文件。如何刪除*名.web文件,只有當他們存在

OS:百分之操作系統,紅帽的5倍,6倍。

我曾嘗試沒有成功如下:

- stat: path=/opt/app/jboss/configuration/*.web 
    register: web 
- shell: rm -rf /opt/app/jboss/configuration/*.web 
    when: web.stat.exists 
+0

你得到什麼錯誤?爲什麼在刪除之前測試存在? – helloV

+0

對不起,這是我的錯誤。我有一個像'mv','cp'和''rm'多重要求* .web'只有當文件存在。我已經驗證了'mv和cp * web',它失敗了,並且沒有這樣的文件或目錄中止......只是注意到'rm'正在悄悄地完成而沒有錯誤。 – miki

回答

0

rm -rf不是否存在的文件或不在乎。它不會抱怨。如果文件存在,它們將被刪除。如果不是,那麼,那麼不是。但結果是一樣的:相同的狀態碼,沒有輸出。那麼無需在Ansible級別處理。

+0

只有Ansible會抱怨:'[警告]:考慮使用狀態=缺席而不是運行rm的文件模塊' – dokaspar

1

的統計模塊不使用通配符工作,所以第一個任務不會做你期望的。大多數Ansible模塊不支持*?等通配符它們的參數,除非明確記載,他們這樣做。這樣做的原因是通配符擴展通常是由你的登錄shell(bash中,zsh的,等等)處理,所以除非應用程序明確支持它,然後它會認不出來。

下面就來驗證這一個簡單的方法:

tasks: 
    - stat: path=/etc/*.conf 
    register: foo 

    - debug: var=foo 

    - stat: path=/etc/resolv.conf 
    register: bar 

    - debug: var=bar 

的這個輸出是:

ok: [localhost] => { 
    "var": { 
     "foo": { 
      "changed": false, 
      "invocation": { 
       "module_args": "path=/etc/*.conf", 
       "module_complex_args": {}, 
       "module_name": "stat" 
      }, 
      "stat": { 
       "exists": false 
      } 
     } 
    } 
} 

TASK: [stat path=/etc/resolv.conf] ******************************************** 
ok: [localhost] 

TASK: [debug var=bar] ********************************************************* 
ok: [localhost] => { 
    "var": { 
     "bar": { 
      "changed": false, 
      "invocation": { 
       "module_args": "path=/etc/resolv.conf", 
       "module_complex_args": {}, 
       "module_name": "stat" 
      }, 
      "stat": { 
       "atime": 1446665095.0724516, 
       "checksum": "fd75f8cc67e4879fa546cbbd901b211bcb7e1b5e", 
       "ctime": 1446840004.4182615, 
       "dev": 51713, 
       "exists": true, 
       "gid": 0, 
       "gr_name": "root", 
       "inode": 146096, 
       "isblk": false, 
       "ischr": false, 
       "isdir": false, 
       "isfifo": false, 
       "isgid": false, 
       "islnk": false, 
       "isreg": true, 
       "issock": false, 
       "isuid": false, 
       "md5": "a56ca5f7379429d3b358ce922b28039b", 
       "mode": "0644", 
       "mtime": 1446840004.4182615, 
       "nlink": 1, 
       "path": "/etc/resolv.conf", 
       "pw_name": "root", 
       "rgrp": true, 
       "roth": true, 
       "rusr": true, 
       "size": 94, 
       "uid": 0, 
       "wgrp": false, 
       "woth": false, 
       "wusr": true, 
       "xgrp": false, 
       "xoth": false, 
       "xusr": false 
      } 
     } 
    } 
} 

注意,當您指定返回該文件的結果的單個文件,但是當你指定一個通配符,它​​基本上什麼都不返回。

由於@udondan在他的回答暗示,你可以做這樣的事情:

- shell: rm -rf /opt/app/jboss/configuration/*.web 

由於rm將沒有錯誤默默地完整,如果有0匹配。

如果你真的想獲得看上你可以使用find模塊找到所有匹配您的模式,該文件,然後調用rm命令(或更好,但使用file模塊,並設置state=absent)使用with_items循環來在find返回。

+0

感謝您的解釋,剛纔注意到'rm'正在默默地完成沒有錯誤...我有相同的情況' mv或​​cp * .web'只有文件存在。請讓我知道這個建議,我試過'find',但它沒有拋出這樣的文件或目錄錯誤。 – miki

+0

我試過' - shell:find/opt/app/jboss/configuration/-name「* .web」-print0 | xargs -0 -I {} mv {}/backup',它的工作方式如同例外。謝謝! – miki

4

@布魯斯-P的回答給人以Ansible 2.0+產生警告,但新with_fileglob給出了另一種選擇:

- file: path={{ item }} state=absent 
    with_fileglob: /opt/app/jboss/configuration/*.web 

(類似問題remove all files containing a certain name within a directory也有類似的答案。)

編輯:由於下面提到,這是行不通的;這裏是一個「奇特的方式」的例子:

- find: 
    paths: /opt/app/jboss/configuration 
    patterns: "*.web" 
    register: find_results 

- file: 
    path: "{{ item['path'] }}" 
    state: absent 
    with_items: "{{ find_results['files'] }}" 
+2

這是行不通的,因爲'with_fileglob'只匹配運行正常的系統上的文件,而不是目標主機上的文件。 –

+0

嗯,你是對的! @ bruce-p的評論「如果你真的想變得很花哨,你可以使用find模塊找到所有符合你的模式的文件,然後調用rm命令(或者更好地使用文件模塊並設置state = absent) with_items循環以查找返回結果。「是乾淨的方式來做到這一點,我想 - 編輯包括一個例子。 –

相關問題