【问题标题】:I want to know if there is an Ansible (regex_replace) way cutting off a version number我想知道是否有 Ansible (regex_replace) 方式切断版本号
【发布时间】: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:您正在尝试匹配某些内容并将其替换为您首先匹配的内容。

标签: bash shell ansible


【解决方案1】:

问:“Ansible 中是否有比 shell 任务更好的解决方案?”

答:是的。这是。例如下面的任务(给定my_filename: ms2install_1.16.1.8.tgz

    - set_fact:
        ms2Num: "{{ (my_filename|splitext).0.split('_').1 }}"
    - set_fact:
        ms2Num_short: "{{ ms2Num.split('.')[:2]|join('.') }}"
    - debug:
        msg:
          - "{{ ms2Num }}"
          - "{{ ms2Num_short }}"

    "msg": [
        "1.16.1.8", 
        "1.16"
    ]

【讨论】:

  • 这很好用。我认为需要一些过滤器'foo。我不知道接近 python 的语法。
  • 几乎所有的 ansible 都是在引擎盖下的 python - 我实际上不知道任何不是的东西 - 尽管我确信有些例子不是。
猜你喜欢
  • 2012-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-22
  • 1970-01-01
  • 2019-11-25
相关资源
最近更新 更多