我需要創建一個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
我需要創建一個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
rm -rf
不是否存在的文件或不在乎。它不會抱怨。如果文件存在,它們將被刪除。如果不是,那麼,那麼不是。但結果是一樣的:相同的狀態碼,沒有輸出。那麼無需在Ansible級別處理。
只有Ansible會抱怨:'[警告]:考慮使用狀態=缺席而不是運行rm的文件模塊' – dokaspar
的統計模塊不使用通配符工作,所以第一個任務不會做你期望的。大多數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
返回。
@布魯斯-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'] }}"
這是行不通的,因爲'with_fileglob'只匹配運行正常的系統上的文件,而不是目標主機上的文件。 –
嗯,你是對的! @ bruce-p的評論「如果你真的想變得很花哨,你可以使用find模塊找到所有符合你的模式的文件,然後調用rm命令(或者更好地使用文件模塊並設置state = absent) with_items循環以查找返回結果。「是乾淨的方式來做到這一點,我想 - 編輯包括一個例子。 –
你得到什麼錯誤?爲什麼在刪除之前測試存在? – helloV
對不起,這是我的錯誤。我有一個像'mv','cp'和''rm'多重要求* .web'只有當文件存在。我已經驗證了'mv和cp * web',它失敗了,並且沒有這樣的文件或目錄中止......只是注意到'rm'正在悄悄地完成而沒有錯誤。 – miki