如何使用Ansible获取路径名的子字符串?

时间:2017-11-23 10:53:34

标签: ansible

我想通过ansible在 Windows服务器上安装tomcat,我检查是否有安装java并获取java.exe的路径。这是:

"path": "D:\\Products\\abcd\\java\\jdk1.8.0_51\\bin\\java.exe"

我需要在tomcat的config var中设置JAVA_HOME,如何获得所需的部分 - > D:\\Products\\abcd\\java\\jdk1.8.0_51来自路径?我无法从远程服务器获取JAVA_HOME,因为有各种安装。

TASK [tomcat : debug] 
ok: [v-sax-769-e-a.develop.ebiz.grp] => {
    "file_info_java.files[0]": {
        "attributes": "Archive",
        "checksum": "8c2c2f3d687fe99d9a724514f09f53bcb989a1e0",
        "creationtime": 1511365795.4331064,
        "extension": ".exe",
        "filename": "java.exe",
        "isarchive": true,
        "isdir": false,
        "ishidden": false,
        "islnk": false,
        "isreadonly": false,
        "isshared": false,
        "lastaccesstime": 1511365795.4331064,
        "lastwritetime": 1438168336,
        "owner": "BUILTIN\\Administrators",
        "path": "D:\\Products\\CPeRef\\java\\jdk1.8.0_51\\bin\\java.exe",
        "size": 206400
    }
}

1 个答案:

答案 0 :(得分:0)

要提取以Windows格式指定的路径,请使用win_dirname filter

vars:
  path: "D:\\Products\\abcd\\java\\jdk1.8.0_51\\bin\\java.exe"
tasks:
  - debug:
      msg: "{{ path | win_dirname }}"

结果:

ok: [localhost] => {
    "msg": "D:\\Products\\abcd\\java\\jdk1.8.0_51\\bin"
}

但是,因为你似乎想要摆脱bin - 部分,你需要决定一个方法。无论哪种方式,您都可以使用正则表达式过滤器:

  • 从路径中删除最后一个元素:

    {{ path | win_dirname | regex_replace('\\\\(?:(?!\\\\).)*$', '') }}
    
  • 从路径中删除最后一个\\bin

    {{ path | win_dirname | regex_replace('\\\\bin$', '') }}
    
  • 完全删除固定部分而不使用win_dirname

    {{ path | regex_replace('\\\\bin\\\\java.exe$', '') }}