如何通过Ansible使用AWK命令

时间:2018-05-20 17:13:27

标签: shell awk ansible

我在创建ansible角色时遇到了问题。

我想在shell模块中使用awk通过Ansible注册变量。

当我通过终端使用它时,它工作:

inxi -D | awk '/Total Size:/ {print $7}' | cut -d"(" -f2

但是当我想在Ansible角色中使用它时它不起作用。

name: Get info
shell: inxi -D | awk '/Total Size:/ {print $7}' | cut -d"(" -f2
register: result

显示来自的信息 inxi -D

Drives:    HDD Total Size: 53.7GB (2.0% used)
           ID-1: /dev/vda model: N/A size: 53.7GB
           ID-2: /dev/vdb model: N/A size: 0.0GB

我想提取有关硬盘使用情况的数据,例如2.0%

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:1)

这种方式可以正常使用

 - name: Get informations about disk percentage
      shell: >
                inxi -D |
                grep 'Total'|
                sed -e 's/.*(\(.*\)\ .*/\1/'
      register: result

- debug:
      msg: "{{ result.stdout }}"

答案 1 :(得分:0)

尝试执行如下:

 name: Get info
 shell: inxi -D | awk '/Total Size:/ {print $7}' | cut -d"(" -f2
 register: result

并通过"{{ result.stdout }}"

访问该命令的输出

答案 2 :(得分:0)

尝试一下:

---
- hosts: localhost
  connection: local

  tasks:
  - name: test shell
    shell: >
      echo "Drives:    HDD Total Size: 53.7GB (2.0% used)" | awk -F '[()]' '/Total Size:/ {split($2,a," "); print a[1]}'
    register: result

  - debug:
      msg: "{{ result.stdout }}"

它应该打印如下:

"msg": "2.0%"

如果正常工作,只需用您的命令替换echo ...inxi -D | awk ...

注意shell: >

yaml中,多行字符串可以写成'文字块' (使用|)或“折叠后的块”' (使用>)。

还使用[()]作为分隔符,将awk的使用改为一体化使用,这将获得括号内的内容。

答案 3 :(得分:0)

版本3.0中的inxi导出到json或xml:

inxi -Dxxx --output json --output-file print

'打印'是打印到标准输出,如果给出了完整的文件路径,它将导出到文件。

答案 4 :(得分:0)

我们只是找到了一个可行的愚蠢解决方法:

echo $(df -h /hadoop | awk 'NR==2 {print $4}') 

第一种情况:

      tasks:
      - name: test shell
        shell: echo $(inxi -D | awk '/Total Size:/ {print $7}' | cut -d"(" -f2)
        register: result