我想从 war 存档的目录中提取两个文件。
这两个文件存在于/WEB-INF/classes/
我已经尝试过:
- name: create application.properties in /tmp
unarchive:
src: "/application/webapps/application.war"
dest: "/tmp"
remote_src: yes
extra_opts:
- -j
- WEB-INF/classes/application.properties
- WEB-INF/classes/logback.xml
错误:
“err”:“解压缩:无法找到或打开/WEB-INF/classes/application.properties”
但这当然行不通。有什么想法吗?
实际上,Ansible
unarchive
模块并不适用于此特定用例。长话短说:
extra_opts
用于选项,但似乎并不用于额外参数。
你想要做的事情似乎在这次提交之前是可能的,事实上,在这次提交之前,Ansible 会这样做:
cmd = [ self.cmd_path, '-o', self.src ]
if self.opts:
cmd.extend(self.opts)
所以你将以命令结束:
unzip -o /application/webapps/application.war -j \
WEB-INF/classes/application.properties \
WEB-INF/classes/logback.xml
在您的用例中应该有效。
但在这次提交之后,Ansible 的代码最终变成了
cmd = [ self.cmd_path, '-o' ]
if self.opts:
cmd.extend(self.opts)
cmd.append(self.src)
因此,它生成了这个buggy
unzip
命令:
unzip -o -j \
WEB-INF/classes/application.properties \
WEB-INF/classes/logback.xml \
/application/webapps/application.war
现在你可以解决这个错误,但这会产生 unzip
错误,我们将不得不掩盖这个错误,所以这不应该是你选择的解决方案。
但这是我的思路以及我为编写一个有效的剧本所做的事情:我使用ansible-playbook play.yml -vvvv
确定了命令的问题,这让我获得了 Ansible 发出的完整
unzip
命令 - 下面的错误有为简洁起见已减少:fatal: [localhost]: FAILED! => {
"changed": false,
"dest": "/tmp/out",
"extract_results": {
"cmd": [
"/usr/bin/unzip",
"-o",
"-j",
"WEB-INF/classes/application.properties",
"WEB-INF/classes/logback.xml",
"test.war",
"-d",
"/tmp/out"
]
}
}
基于此,我通过在
extra_opts
参数中复制存档来欺骗
src
,因此它正好适合命令中的选项 -j
之后。这样做的缺点是现在正在生成此命令:
unzip -o -j \
test.war \
WEB-INF/classes/application.properties \
WEB-INF/classes/logback.xml \
test.war
这意味着它现在正在尝试在自身内部查找文件test.war
,因此,它会因此出错。 这是产生的错误:
“err”:“警告:文件名不匹配:test.war ”
因此,我再次在
failed_when
的帮助下使用了 一个技巧
来忽略此错误,因为我知道它会给我带来错误。所以,鉴于:
$ tree ./WEB-INF
./WEB-INF
└── classes
├── application.properties
├── ignore-me.txt
└── logback.xml
1 directory, 3 files
$ tree /tmp
/tmp
0 directories, 0 files
任务:
- shell: /usr/lib/jvm/java-1.8-openjdk/bin/jar -cf test.war *
- file:
path: /tmp/out
state: directory
- unarchive:
src: test.war
dest: /tmp/out
remote_src: yes
extra_opts:
- -j
- test.war
- WEB-INF/classes/application.properties
- WEB-INF/classes/logback.xml
register: extract
failed_when:
- extract.extract_results.rc != 0
- "extract.extract_results.err != 'caution: filename not matched: '
~ extract.src ~ '\n'"
您最终会得到这些文件:
/ansible # tree /tmp/out
/tmp/out
├── application.properties
└── logback.xml
0 directories, 2 files
unzip
命令(
-u
= 更新)可以同样高效且简单。
下面的示例片段:
tasks:
- command: 'unzip -j -u /application/webapps/application.war {{ item }} -d /tmp'
with_items:
- 'WEB-INF/classes/application.properties'
- 'WEB-INF/classes/logback.xml'
args:
warn: false