首页 > 解决方案 > Ansible - 从战争档案中取消归档细节文件

问题描述

我想从战争档案的目录中提取两个文件。

这两个文件存在于/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

错误 :

“错误”:“解压缩:找不到或打开 /WEB-INF/classes/application.properties”

但这当然行不通。任何想法?

标签: spring-bootansibleredhat

解决方案


真的,看起来 Ansibleunarchive模块并不适用于这个特定的用例。
并且有一个功能请求来实际实现这个确切的功能

长话短说:extra_opts用于选项,但似乎不适用于额外参数。

您想要做的事情似乎在这个 commit之前是可能的,事实上,在这个 commit 之前,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)

因此,它会生成这个错误 unzip的命令:

unzip -o -j WEB-INF/classes/application.properties WEB-INF/classes/logback.xml /application/webapps/application.war

现在您可以解决这个错误,但这会产生unzip错误,我们将不得不把这个错误扫到地毯下,所以这不应该是您选择的解决方案。

但这是我进入的思路,以及我为拥有一个工作手册所做的工作:我发现了命令 using 的问题ansible-playbook play.yml -vvvv,这让我得到了unzipAnsible 发出的完整命令——为简洁起见,以下错误已被减少:

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_optssrc-j

这样做的缺点是现在正在生成此命令:

unzip -o -j test.war WEB-INF/classes/application.properties WEB-INF/classes/logback.xml test.war

这意味着它现在正试图在自身内部查找文件test.war,因此它会因此出错。

这是产生的错误:

"err": "注意:文件名不匹配:test.war\n"

所以再一次,我使用了一个技巧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

和剧本:

- hosts: all
  gather_facts: no
      
  tasks:
    - 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 and extract.extract_results.err != 'caution: filename not matched:  ' ~ extract.src ~ '\n'"

这产生了回顾:

PLAY [all] **********************************************************************************************************************************************

TASK [Create test.war file] *****************************************************************************************************************************
changed: [localhost]

TASK [file] *********************************************************************************************************************************************
changed: [localhost]

TASK [Create test.war file] *****************************************************************************************************************************
ok: [localhost]

PLAY RECAP **********************************************************************************************************************************************
localhost                  : ok=3    changed=2    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

还有那些文件:


/ansible # tree /tmp/out
/tmp/out
├── application.properties
└── logback.xml

0 directories, 2 files

推荐阅读