簡體   English   中英

從 Ansible 中的 shell 命令輸出中提取特定數據

[英]Extract specific data from an output of shell command in Ansible

我想創建一個劇本,通過 shell 命令df -B MB/boot提取已used空間。
對於此示例,playbook 將為控制器節點顯示358MB

我想知道如何過濾server_info.stdout_lines以獲得所需的結果。
我相信我們可以使用regex_search過濾器來做到這一點。

 - hosts: all
      gather_facts: True
      become: True
      tasks:
        - name: show used space on /boot
          shell: "df -B MB"
          register: server_info

        - debug:
            msg: "{{ server_info.stdout_lines }}"
TASK [debug] *****************************************************************************************************************
ok: [control] => {
    "msg": [
        "Filesystem          1MB-blocks   Used Available Use% Mounted on",
        "devtmpfs                1458MB    0MB    1458MB   0% /dev",
        "tmpfs                   1488MB    1MB    1488MB   1% /dev/shm",
        "tmpfs                   1488MB   10MB    1478MB   1% /run",
        "tmpfs                   1488MB    0MB    1488MB   0% /sys/fs/cgroup",
        "/dev/mapper/cs-root    19267MB 6268MB   13000MB  33% /",
        "/dev/sda1               1064MB  358MB     706MB  34% /boot",
        "tmpfs                    298MB    1MB     298MB   1% /run/user/42",
        "tmpfs                    298MB    1MB     298MB   1% /run/user/1000"
    ]
}
ok: [ansible2] => {
    "msg": [
        "Filesystem          1MB-blocks   Used Available Use% Mounted on",
        "devtmpfs                1458MB    0MB    1458MB   0% /dev",
        "tmpfs                   1488MB    0MB    1488MB   0% /dev/shm",
        "tmpfs                   1488MB   10MB    1478MB   1% /run",
        "tmpfs                   1488MB    0MB    1488MB   0% /sys/fs/cgroup",
        "/dev/mapper/cs-root    19267MB 6264MB   13003MB  33% /",
        "/dev/sda1               1064MB  360MB     704MB  34% /boot",
        "tmpfs                    298MB    1MB     298MB   1% /run/user/42",
        "tmpfs                    298MB    1MB     298MB   1% /run/user/1000"
    ]
}

這是一個典型的x/y 問題(盡管它很容易回答,因為您已經給出了根本要求,即在安裝點上獲得使用的大小)。

您不必使用shell來獲取該信息。 這一切都在目標機器事實中可用(只需確保您沒有使用gather_fact: no )。

下面的示例適用於我系統上的/boot/efi 只需將其放回您要在selectattr過濾器中定位的實際安裝點。

---
- hosts: localhost

  vars:
    mount_point: /boot/efi

  tasks:
    - vars:
        device_info: "{{ ansible_mounts | selectattr('mount', '==', mount_point) | first }}"
      debug:
        msg: "Used size on {{ mount_point  }} is {{ (device_info.size_total - device_info.size_available) | human_readable }}"

給出:

PLAY [localhost] **************************************************************************************************************************************************************************************************

TASK [Gathering Facts] ********************************************************************************************************************************************************************************************
ok: [localhost]

TASK [debug] ******************************************************************************************************************************************************************************************************
ok: [localhost] => {
    "msg": "Used size on /boot/efi is 29.98 MB"
}

PLAY RECAP ********************************************************************************************************************************************************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM