【发布时间】:2020-02-12 20:22:59
【问题描述】:
是否有 Ansible (regex_replace) 方法切断版本号?
我正在安装一个压缩存档。它位于 {{ HomeDir }}/ms2install 目录。
文件名:ms2install_1.16.1.8.tgz
我有一个 shell 任务要提取版本号
# Get the version number from the archive
- name: Get MS2 verion number from the the file list
shell: "ls -1 {{ HomeDir }}/ms2install | grep \"ms2iinstall_.*tgz\" | cut -d_ -f2 | rev | cut -c5- | rev"
delegate_to: 127.0.0.1
register: ms2Num
ms2Num 为 1.16.1.8
我可以在这里使用 shell 命令,因为它不会更改系统和单个命令中的字符串操作。 不,我只需要在解压缩存档后找到 1.16 即可在远程系统中找到目录。我想要的目录是几个级别的子目录。我还想确保从正确的目录安装软件包。
我可以使用类似的 shell 命令提取 1.16。
# Get the version number from the archive
- name: Get truncated MS2 verion number from the the file list
shell: "ls -1 {{ HomeDir }}/ms2install | grep \"ms2i_.*tgz\" | cut -d_ -f2 | rev | cut -c5- | rev | | cut -d. -f1-2"
delegate_to: 127.0.0.1
register: ms2KurtzNum
这行得通,我注册了一个短字符串 1.16。
我想知道是否有针对任一定义的 regex_replace 解决方案。因此,创建一个仅包含字符串 1.16 第一部分的新 var。
对于正则表达式:/(^(\d{1,3}\.\d{1,3}))/g 有效,但在 Ansible 中,表达式确实给出了“1.16”子字符串。
- name: Find version directory
find:
paths: "{{ DestDir | join }}/ms2install/patches"
patterns: "{{ ms2Num.stdout | regex_replace( '([1-9]{1,3}\\.[1-9]{1,3}))' '\\1' ) }}" # <== pattern 1.16
recurse: yes
file_type: directory
register: PatchVersionDir
bash 正则表达式和 Ansible 正则表达式(Python?)之间的差异足以令人沮丧。
在 Ansible 中是否有比 shell 任务更好的解决方案?
【问题讨论】:
-
请定义
does not work。 0.01 美元:您的正则表达式中似乎有一个额外的右括号。 $0.02:您的 regex_replace 过滤器似乎缺少右括号。 $0.03:您正在尝试匹配某些内容并将其替换为您首先匹配的内容。