首页 > 解决方案 > 如何从 Ansible 中由正斜杠分隔的字符串中获取特定值

问题描述

在 ansible playbook 中,我定义了变量“datasetInfo”,其中存储了以下值

"metadata": {
            "@type": "type.googleapis.com/google.cloud.aiplatform.v1.CreateDatasetOperationMetadata",
            "genericMetadata": {
                "createTime": "2021-10-21T19:44:36.212910Z",
                "updateTime": "2021-10-21T19:44:36.212910Z"
            }
        },
        "name": "projects/93057109696/locations/us-central1/datasets/4110898054394019840/operations/6109567339060002816"
    }
}

现在我正在尝试从字符串中检索特定值。我想检索“名称”对象内的“4110898054394019840”我正在托盘中运行它在我的剧本中但没有得到答案

- name: datset id
  debug : 
    msg : "{{ datasetInfo.json.name.split('/') | tail -n 1 }}"

提前致谢。

标签: jsonstringsplitansible

解决方案


因此,除了@frederic-henri几乎正确的评论之外,我还想提供一个竞争理论来说明如何提取那段文本

  - debug:
      msg: >-
        {{ datasetInfo.json.name 
        | regex_findall('.*/datasets/([0-9]+)/.*')
        | first }}

输出

ok: [localhost] => {
    "msg": "4110898054394019840"
}

但是我想提供这种使用数组下标的替代方法的原因是split('/')[4],它假设它是第 5 个斜线分隔的项目,通过使用regex_findall它为读者提供了一些关于字符串应该是什么形状的上下文,以及我们的部分关心。这也意味着,如果由于无法控制的原因,谷歌要更改该name字段,它将导致剧本立即停止并出现错误,而不是抓住恰好位于第 5 个斜线分隔位置的任何内容,然后也许只有稍后才会出现一些下游错误实现。

最后,正如通过实际运行Frederic 的评论所看到的那样,有时进行斜线计数并不能摆脱,因为split('/')[4]实际上是datasets,而不是数字(数字是[5]split


推荐阅读