无法从 Ansible 变量中搜索子字符串

Posted

技术标签:

【中文标题】无法从 Ansible 变量中搜索子字符串【英文标题】:Unable to search sub-string from Ansible variable 【发布时间】:2020-11-07 02:41:55 【问题描述】:

如果变量包含字符串7.0.0.GA,我正在尝试在 Ansible 中创建一个目录

下面是我的剧本:

- name: Determine the version of Tom
  raw: "cat  homefound.path | dirname /version.txt | grep -i version"
  register: Tomver

- debug:
    msg: "Tom VERSION IS:  Tomver.stdout "

- name: Create patch folder /app/Tom_Patches/7.0 on target servers
  file:
    path: /app/Tom_Patches/7.0
    state: directory
    mode: '0755'
  when: Tomver.stdout is match('7.0.0.GA*')

在输出中我可以看到该变量有字符串 7.0.0.GA 但仍然 when condition 失败并跳过。

输出:

TASK [debug] ***********************************************************************************************************************************************************
ok: [10.9.156.126] => 
    "msg": "Tom VERSION IS: Red Hat Tom Enterprise Application Platform - Version 7.0.0.GA\r\n"


TASK [Create patch folder /app/Tom_Patches/7.0 on target servers] ****************************************************************************************************
skipping: [10.9.156.126]

我什至尝试了以下条件检查,但也失败了:

  when: Tomver.stdout | join('') | search('7.0.0.GA')

我更喜欢使用raw 模块而不是commandshell 模块以避免python 依赖。

有人可以推荐吗?

【问题讨论】:

match 需要一个正则表达式。 '7.0.0.GA*' 表示“匹配 '7' 后跟任意字符后跟 '0' 后跟任意字符后跟 '0' 后跟任意字符后跟 'G' 后跟 0 或多个 'A'”。我怀疑这是您要完全匹配的内容...此外,如果不知道您的输入数据是什么,就不可能为您提供帮助。最后,使用raw邪恶的(除非在目标上安装python如果尚未安装)。 @Zeitounator 我尝试匹配的文本在输出共享用户debug 中可见 对不起数据,我下次阅读时会更加小心。同时,我的其余评论仍然有效。 完全同意您的建议。谢谢@Zeitounator 【参考方案1】:

你可以试试in

when: "'7.0.0.GA' in res.stdout"

【讨论】:

以上是关于无法从 Ansible 变量中搜索子字符串的主要内容,如果未能解决你的问题,请参考以下文章

在 PostgreSQL 列中搜索子字符串

如何在数组键中搜索子字符串?

使用 objectify 在实体中搜索子字符串

EWS 搜索子字符串的约会正文

在字符串数组中搜索子字符串的最有效方法

在列表中的元素中搜索子字符串并删除该元素