ansible - 从 ansible 变量中过滤匹配模式的子字符串并将匹配的子字符串分配给另一个变量

标签 ansible ansible-playbook ansible-2.x

假设我们有一个很长的 ansible 字符串变量 mystr .我们有一个正则表达式模式说 substr_pattern并且匹配此模式的子字符串将从 mystr 中过滤掉并分配给另一个变量substr .在 playbook_filters 上的文档中似乎没有明显的方法可以在 ansible 中执行此操作。尽管使用 re 很容易做到这一点python本身的模块。

ansible docs中给出了3种方法,但似乎都没有解决我的问题:

  • match :此过滤器根据整个模式是否匹配整个字符串返回真/假,但不返回匹配的组/子字符串。
  • search : 用于过滤更大字符串中的 substr。但是像 match , 仅返回 true/false,而不是此处需要的匹配组/子字符串。
  • regex_replace :这用于将字符串中的匹配模式替换为另一个字符串。但不清楚如何将匹配模式对应的子字符串/组注册到新变量中。

  • 有什么我想念的吗?或者这是ansible中缺少的功能?

    Ansible 版本: 2.1

    例子:
    mystr: "This is the long string. With a url. http://example.org/12345"
    pattern: "http:\/\/example.org\/(\d+)"
    substr: 12345   # First matched group i.e. \\1
    

    摘要:如何获取匹配pattern的子串来自 mystr并将其注册到 ansible 变量 substr ?

    最佳答案

    如果您可以修改模式,您可以使用 regex_replace过滤并仅用匹配的数字替换整个字符串。

    mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1')
    

    要将结果分配给新变量,可以使用 set_fact模块。
    - set_fact:
        substr: "{{ mystr | regex_replace('^.*http:\/\/example.org\/(\d+).*?$', '\\1') }}"
    

    关于ansible - 从 ansible 变量中过滤匹配模式的子字符串并将匹配的子字符串分配给另一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37668442/

    相关文章:

    yaml - 如何在 YAML 中连接字符串?

    ansible - 如何在 ansible playbook 中从用户输入中添加主机?

    ansible - 在ansible中显示vars_prompt值

    ansible - 运行 Ansible 角色而不运行角色元中定义的依赖项

    amazon-web-services - 使用 ec2 标签在 ansible 上创建 Metric 警报

    ansible - 如何使用 root 用户运行 Ansible,然后更改为另一个用户?

    ansible 在 Windows 文件路径中重复斜杠

    docker - 如何从Ansible控制节点ping Docker容器(Mac机器)

    django - 与管理 git checkout for ansible 中使用的 key 相关的最佳实践有哪些?

    Ansible - 使用用户输入选择变量