如何从 Ansible playbook 的 stdout_lines 中提取或捕获值?

问题描述 投票:0回答:2

我正在寻求帮助,以从 Ansible playbook 执行的

stdout_lines
中提取或捕获空闲 MB 值,并使用该值作为在 playbook 中进一步进行操作的标准。

我的任务输出是:

ok: [Host1] => {
    "changed": false,
    "invocation": {
        "module_args": {
            "commands": [
                "show file systems | inc flash:"
            ],
            "interval": 1,
            "match": "all",
            "retries": 10,
            "wait_for": null
        }
    },
    "stdout": [
        "*     1707192   (1.6 GB)        603744 (589.6 MB)      flash     rw  flash:"
    ],
    "stdout_lines": [
        [
            "*     1707192   (1.6 GB)        603744 (589.6 MB)      flash     rw  flash:"
        ]
    ]
}

我尝试过使用

- set_fact:
    my_var: "{{ disk_space.stdout_lines | regex_findall('\\b([0-9]{1,4}\\.\\d+)\\s+MB.*flash:$') }}"

但我总是得到一个空的输出:

ok: [Host1] => {
    "ansible_facts": {
        "my_var": []
    },
    "changed": false
}

我想从输出中捕获

589.6
值并将其分配给变量以在我的进一步游戏中使用。

python regex ansible
2个回答
1
投票

仅回答问题的正则表达式部分。

表达方式是这样写的

\\b([0-9]{1,4}\\.\\d+)\\s+MB.*flash:$

并解析为

\b([0-9]{1,4}\.\d+)\s+MB.*flash:$

表示“该行必须以

flash:
结尾,但其结尾类似于
flash:"

解决方案很简单 - 在美元符号之前添加字符

\b([0-9]{1,4}\.\d+)\s+MB.*flash:"$

不确定在您的情况下是否应该以任何特定方式转义或编码。


0
投票

以下最小示例手册中显示了另一种可能的方法

---
- name: Cisco 'show file systems'
  hosts: localhost
  become: false
  gather_facts: false

  vars:

    disk_space:
      stdout: "*     1707192   (1.6 GB)        603744 (589.6 MB)      flash     rw  flash:"
      stdout_lines:
        - "*     1707192   (1.6 GB)        603744 (589.6 MB)      flash     rw  flash:"

  tasks:

  - name: Show stdout with data cleansing
    debug:
      msg: "{{ disk_space.stdout | regex_replace('  *', ' ') }}"

  - name: Show value of 4th column in KB
    debug:
      msg: "{{ ( disk_space.stdout | regex_replace('  *', ' ') | split(' ') )[4] }} KB"

  - name: Show value of 4th column in MB
    debug:
      msg: "{{ ( disk_space.stdout | regex_replace('  *', ' ') | split(' ') )[4] | int / 1024 }} MB"

产生

的输出
TASK [Show stdout with data cleansing] **********************
ok: [localhost] =>
  msg: '* 1707192 (1.6 GB) 603744 (589.6 MB) flash rw flash:'

TASK [Show value of 4th column in KB] ***********************
ok: [localhost] =>
  msg: 603744 KB

TASK [Show value of 4th column in MB] ***********************
ok: [localhost] =>
  msg: 589.59375 MB

甚至

  - name: Show value of 5th column after cleansing
    debug:
      msg: "{{ ( result.stdout | regex_replace('  *', ' ') | replace('(', '') | replace(')', '') | split(' ') )[5] }}"

结果

TASK [Show value of 5th column] ****************************
ok: [localhost] =>
  msg: '589.6'
© www.soinside.com 2019 - 2024. All rights reserved.