如何从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'对象中我试着在我的剧本中运行这个,但没有得到答案

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

提前感谢。

所以,除了@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,而不是数字(数字是split[5])

最新更新