Ansible - 从战争存档中取消存档特定文件

问题描述 投票:0回答:2

我想从 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”

但这当然行不通。有什么想法吗?

spring-boot ansible redhat
2个回答
1
投票

实际上,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



0
投票
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

© www.soinside.com 2019 - 2024. All rights reserved.