【问题标题】:how to split value in Ansible with delimiter如何使用分隔符拆分 Ansible 中的值
【发布时间】:2024-01-22 06:16:02
【问题描述】:

我在 Ansible 中设置了一个事实,并且该变量的值带有连字符,例如“dos-e1-south-209334567829102380”。我想拆分,所以我只得到 "dos-e1-south"

这是戏

- set_fact:
    config: "{{ asg.results|json_query('[*].launch_configuration_name') }}"

- debug:
    var: config

【问题讨论】:

  • 不确定如何准确使用它。抛出错误。我正在使用 jinja 过滤器。

标签: python filter split ansible jinja2


【解决方案1】:

另一个选项是 ansibles 正则表达式过滤器,您可以在这里找到:https://docs.ansible.com/ansible/latest/user_guide/playbooks_filters.html#regular-expression-filters

vars:
  var: dos-e1-south-209334567829102380
tasks:
  - debug:
      msg: '{{ var | regex_replace("^(.*)-[^-]+$", "\\1") }}'

结果相同:

"msg": "dos-e1-south"

正则表达式说明:

^(.*)

在第一个反向引用中保留从字符串开头开始的所有内容

-[^-]+$

找到最后一个“-”,后跟非“-”字符,直到字符串的末尾。

\\1

用第一个反向引用替换字符串。

【讨论】:

  • 非常感谢您的详细解释。
【解决方案2】:

一个选项是使用 split()。下面的任务

    vars:
      var1: dos-e1-south-209334567829102380
    tasks:
      - set_fact:
          var2: "{{ var1.split('-') }}"
      - debug:
          msg: "{{ var2.0 }}-{{ var2.1 }}-{{ var2.2 }}"


    "msg": "dos-e1-south"

要连接项目,也可以使用 join()。下面的任务给出了相同的结果

      - debug:
          msg: "{{ var2[0:3] | join('-') }}"

【讨论】: