AWS SSM 自定义清单

AWS SSM Custom Inventory

我正在尝试设置自定义清单类型以显示 Linux 个实例的磁盘使用情况,因为它在本文中为 Windows 个实例显示:https://aws.amazon.com/blogs/mt/get-disk-utilization-of-your-fleet-using-ec2-systems-manager-custom-inventory-types/

我一直在尝试创建与上面 link 中的 PowerShell 脚本中给出的逻辑相同的逻辑,但我无法找到一种方法来转换我的 Linux 磁盘使用命令以 JSON 格式输出。我无法安装 jq 或任何其他软件。

这是我的脚本:

#!/bin/sh
output=$(df -hTP | grep -vE '^tmpfs|cdrom' | awk '{print ,,}')
content= echo "{\"SchemaVersion\":\"1.0\",\"TypeName\":\"Custom:LinuxDiskUsage\",\"Content\":{$output}}"
instanceid=$(wget -q -O - http://169.254.169.254/latest/meta-data/instance-id)

如何更改此脚本,以便获得与 Windows 个实例显示的结果相同的结果?

当前输出为:

{
  "SchemaVersion" : "1.0",
  "TypeName" : "Custom:LinuxDiskUsage",
  "Content" : {
                 Filesystem Size Use% devtmpfs 474M 0% /dev/xvda1 8.0G 17%
              }
}

但我希望得到以下信息:

{
  "SchemaVersion" : "1.0",
  "TypeName" : "Custom:LinuxDiskUsage",
  "Content" : {
                "Filesystem" : "/dev/xvda1",
                "Size" : "8.0G",
                "Use%": "17%"
              }
}
output=$(df -hTP | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{print "{ \"Filesystem\": \"""\", \"Size\": \"""\", \"Use\%\": \"""\"},"}')
content= echo "{\"SchemaVersion\":\"1.0\",\"TypeName\":\"Custom:LinuxDiskUsage\",\"Content\":[$output]}"

会做的。基本上,由于您不使用任何东西来生成 JSON,因此您必须自己生成。您的输出中可能有太多逗号。这可以通过加入或删除最后一个字符来解决。

你完全可以用 awk 做到这一点:

df -h --output=source,size,pcent | awk '
         BEGIN { 
                 printf "{\n\t\"SchemaVersion\" : \"1.0\",\n\t\"TypeName\" : \"Customer:LinuxDiskUsage\",\n\t\"Content\" : "
               } 
         NR > 1 && [=10=] !~ /tmpfs/ && [=10=] !~ /cdrom/ { 
                printf "\n\t\t{\n\t\t\t\"Filesystem\" : \"%s\"\n\t\t\t\"Size\" : \"%s\",\n\t\t\t\"Use%\" : \"%s\"\n\t\t}\n",,, 
               } 
         END { 
                printf "\t}\n" 
             }'

一个班轮:

df -h --output=source,size,pcent | awk 'BEGIN { printf "{\n\t\"SchemaVersion\" : \"1.0\",\n\t\"TypeName\" : \"Customer:LinuxDiskUsage\",\n\t\"Content\" : "} NR > 1 && [=11=] !~ /tmpfs/ && [=11=] !~ /cdrom/ { printf "\n\t\t{\n\t\t\t\"Filesystem\" : \"%s\"\n\t\t\t\"Size\" : \"%s\",\n\t\t\t\"Use%\" : \"%s\"\n\t\t}\n",,, } END { printf "\t}\n" }'

首先,使用 df 的输出标志从输出中去除任何“噪音”。也不需要先通过 grep 然后通过 awk。使用 awk 的 BEGIN 块打印 SchemaVersion、TypeName 和 Content 标签。在主块中,当没有遇到 tmpfs 和 cdrom 以及 headers (NR>1) 时,打印文件系统、使用和大小标签的 df 命令的输出。在 END 块中,打印结束标记。