【问题标题】:Ansible regex_search with listAnsible regex_search 与列表
【发布时间】:2020-12-10 12:08:44
【问题描述】:

我在 ansible 列表上应用 regex_search 时遇到问题。以下是我的用例:

我有一个如下所示的列表。现在我想从列表的每个索引中提取 workflowinstanceid 参数并将其存储在单独的列表中。我正在尝试使用 regex_search 来实现这一点。谁能帮帮我?

    "final_dr_logs": [
        {
            "_ansible_parsed": true,
            "stderr_lines": [],
            "changed": true,
            "stdout": "[defaultAsyncAction1] - 12/10/2020 02:56:36 CLIENT22 workflowinstanceid=jbpm$160515,
            "_ansible_item_result": true,
            "delta": "0:00:00.273316",
            "stdout_lines": [
                "[defaultAsyncAction1] - 12/10/2020 02:56:36 CLIENT22  workflowinstanceid=jbpm$160515"
            ],
            "_ansible_item_label": "16b70d66-493a-4cdb-98fd-eb5de081491d ",
            "end": "2020-12-10 06:23:36.680901",
            "_ansible_no_log": false,
            "failed": false,
            "item": "16b70d66-493a-4cdb-98fd-eb5de081491d ",
            "stderr": "",
            "rc": 0,
        },
        {
            "_ansible_parsed": true,
            "stderr_lines": [],
            "changed": true,
            "stdout": "[defaultAsyncAction1] - 12/10/2020 02:56:36 CLIENT22 workflowinstanceid=jbpm$160516,
            "_ansible_item_result": true,
            "delta": "0:00:00.273316",
            "stdout_lines": [
                "[defaultAsyncAction1] - 12/10/2020 02:56:36 ES194CLIENT22  workflowinstanceid=jbpm$160516"
            ],
            "_ansible_item_label": "16b70d66-493a-4cdb-98fd-eb5de081491d ",
            "end": "2020-12-10 06:23:36.680901",
            "_ansible_no_log": false,
            "failed": false,
            "item": "16b70d66-493a-4cdb-98fd-eb5de081491d ",
            "stderr": "",
            "rc": 0,
        },
        {
            "_ansible_parsed": true,
            "stderr_lines": [],
            "changed": true,
            "stdout": "[defaultAsyncAction1] - 12/10/2020 02:56:36 ES194CLIENT22 workflowinstanceid=jbpm$160517,
            "_ansible_item_result": true,
            "delta": "0:00:00.273316",
            "stdout_lines": [
                "[defaultAsyncAction1] - 12/10/2020 02:56:36 ES194CLIENT22  workflowinstanceid=jbpm$160517"
            ],
            "_ansible_item_label": "16b70d66-493a-4cdb-98fd-eb5de081491d ",
            "end": "2020-12-10 06:23:36.680901",
            "_ansible_no_log": false,
            "failed": false,
            "item": "16b70d66-493a-4cdb-98fd-eb5de081491d ",
            "stderr": "",
            "rc": 0,
        }]

这是我的代码:

- name: Extract workflow instance IDs
   para_wfId: "{{ item | regex_search(regexp, '\\1') | first }}"
  vars:
   regexp: 'workflowinstanceid=jbpm\$(.*?),'
  with_items:
   - "{{ final_dr_logs }}"
  register: wfid

我遇到的错误:

预期输出:

new_list=[160515,160516,160517]

【问题讨论】:

  • 您的剧本不尊重 yaml 和/或 ansible 语法(特别是您的第二个任务行没有正确缩进)。请take Y minutes to learn yaml注意缩进和换行。您还应该通读Intro to playbooks 以了解基本概念和语法。您可以在发布之前使用yamllintansible-lint 验证您的剧本。
  • 此外,我不知道任何名为 para_wfId 的模块,并且您的任务中没有其他任何东西看起来像模块名称。

标签: regex ansible


【解决方案1】:

现在我想从列表的每个索引中提取 workflowinstanceid 参数并将其存储在单独的列表中。

这就是 jinja2 map filter 的用途;他们甚至使用您在 the manual page for regex_search 中询问的确切结构,尽管我认为findall 带有捕获组,firstregex_replace 更易于阅读

  - debug:
      msg: >-
        {{ final_dr_logs
        | map(attribute="stdout")
        | map("regex_findall", "workflowinstanceid=(.+)$")
        | map("first")
        | list }}
    vars:
      "final_dr_logs": [
        {
            "stdout": "[defaultAsyncAction1] - 12/10/2020 02:56:36 CLIENT22 workflowinstanceid=jbpm$160515"
        },
        {
            "stdout": "[defaultAsyncAction1] - 12/10/2020 02:56:36 CLIENT22 workflowinstanceid=jbpm$160516"
        }
      ]    

生产

ok: [localhost] => {
    "msg": [
        "jbpm$160515",
        "jbpm$160516"
    ]
}

【讨论】:

  • 谢谢!您的回复帮助我解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
  • 2021-06-22
  • 2016-08-06
  • 2021-12-24
  • 2019-04-05
  • 1970-01-01
相关资源
最近更新 更多