→ 🚀Are you a Lansweeper Champion?! Join our Contributor Program Sign up here!

Community FAQ
cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 
EricCao
Engaged Sweeper

Hi, 

We need to create a report showing all Ubuntu or Linux VMs (we use Hyper-V) and their assigned # of vCPU, RAM and disk volume usage (total vs free).

I was able to create a report for Windows VMs, but for Linux it seems completely different.

I tried below but still no luck. Appreciate your help!!

 

 

 

 

 

Select Top 1000000 tblAssets.AssetID,
  tblAssets.AssetName,
  tsysAssetTypes.AssetTypename,
  tsysAssetTypes.AssetTypeIcon10 As icon,
  tblLinuxSystem.OperatingSystem,
  Cast(Round(tblLinuxVolumeGroup.Size / 1024.0, 0) As Int) As
  [Total Disk Space (GB)],
  Cast(Round(tblLinuxVolumeGroup.Free / 1024.0, 0) As Int) As
  [Free Disk Space (GB)]
From tblAssets
  Inner Join tblAssetCustom On tblAssets.AssetID = tblAssetCustom.AssetID
  Inner Join tsysAssetTypes On tsysAssetTypes.AssetType = tblAssets.Assettype
  Inner Join tblLinuxSystem On tblAssets.AssetID = tblLinuxSystem.AssetID
  Inner Join tblLinuxVolumeGroup On
      tblAssets.AssetID = tblLinuxVolumeGroup.AssetID
Where tblAssetCustom.State = 1

 

 

 

 

3 REPLIES 3
Jacob_H
Lansweeper Employee
Lansweeper Employee

Yo Eric -  welcome to the community - soooooo yeah.  The reason why you're getting dupes is because there are multiple records for something that you're JOIN'ing on... in this case, it's the volumes/partitions and the memory - but in general, it could be anything with multiple records such as a NIC/MAC should you query the network tables and get something with two or more NICs.  I digress.  I also removed the memory lookup as you get NULLs since there are no records sometimes, and replaced it with tblassets.memory as that's the tried-and-true.

There's a few ways of tackling this, depending on your needs of your output - the query builder doesn't handle some of the more complex/dynamic SQL queries/methods/commands, so here's a really dirty manual way of making the fields (add more as you need) for the volumes:

Manually Putting 5 volumes to show:

SELECT
    a.AssetID,
    a.AssetName,
    t.AssetTypename,
    t.AssetTypeIcon10 AS icon,
    -- Volume 1
    (SELECT TOP 1 Filesystem
     FROM tblLinuxHardDisks
     WHERE tblLinuxHardDisks.AssetID = a.AssetID
     ORDER BY Filesystem) AS Volume1,
    (SELECT TOP 1 CAST(Size / 1024 AS NUMERIC)
     FROM tblLinuxHardDisks
     WHERE tblLinuxHardDisks.AssetID = a.AssetID
     ORDER BY Filesystem) AS Volume1_TotalMB,
    (SELECT TOP 1 CAST(Available / 1024 AS NUMERIC)
     FROM tblLinuxHardDisks
     WHERE tblLinuxHardDisks.AssetID = a.AssetID
     ORDER BY Filesystem) AS Volume1_FreeMB,
    -- Volume 2
    (SELECT TOP 1 Filesystem
     FROM tblLinuxHardDisks AS t2
     WHERE t2.AssetID = a.AssetID
       AND t2.Filesystem NOT IN (
           SELECT TOP 1 Filesystem
           FROM tblLinuxHardDisks
           WHERE tblLinuxHardDisks.AssetID = a.AssetID
           ORDER BY Filesystem
       )
     ORDER BY Filesystem) AS Volume2,
    (SELECT TOP 1 CAST(Size / 1024 AS NUMERIC)
     FROM tblLinuxHardDisks AS t2
     WHERE t2.AssetID = a.AssetID
       AND t2.Filesystem NOT IN (
           SELECT TOP 1 Filesystem
           FROM tblLinuxHardDisks
           WHERE tblLinuxHardDisks.AssetID = a.AssetID
           ORDER BY Filesystem
       )
     ORDER BY Filesystem) AS Volume2_TotalMB,
    (SELECT TOP 1 CAST(Available / 1024 AS NUMERIC)
     FROM tblLinuxHardDisks AS t2
     WHERE t2.AssetID = a.AssetID
       AND t2.Filesystem NOT IN (
           SELECT TOP 1 Filesystem
           FROM tblLinuxHardDisks
           WHERE tblLinuxHardDisks.AssetID = a.AssetID
           ORDER BY Filesystem
       )
     ORDER BY Filesystem) AS Volume2_FreeMB,
    -- Volume 3
    (SELECT TOP 1 Filesystem
     FROM tblLinuxHardDisks AS t3
     WHERE t3.AssetID = a.AssetID
       AND t3.Filesystem NOT IN (
           SELECT TOP 2 Filesystem
           FROM tblLinuxHardDisks
           WHERE tblLinuxHardDisks.AssetID = a.AssetID
           ORDER BY Filesystem
       )
     ORDER BY Filesystem) AS Volume3,
    (SELECT TOP 1 CAST(Size / 1024 AS NUMERIC)
     FROM tblLinuxHardDisks AS t3
     WHERE t3.AssetID = a.AssetID
       AND t3.Filesystem NOT IN (
           SELECT TOP 2 Filesystem
           FROM tblLinuxHardDisks
           WHERE tblLinuxHardDisks.AssetID = a.AssetID
           ORDER BY Filesystem
       )
     ORDER BY Filesystem) AS Volume3_TotalMB,
    (SELECT TOP 1 CAST(Available / 1024 AS NUMERIC)
     FROM tblLinuxHardDisks AS t3
     WHERE t3.AssetID = a.AssetID
       AND t3.Filesystem NOT IN (
           SELECT TOP 2 Filesystem
           FROM tblLinuxHardDisks
           WHERE tblLinuxHardDisks.AssetID = a.AssetID
           ORDER BY Filesystem
       )
     ORDER BY Filesystem) AS Volume3_FreeMB,
    -- Volume 4
    (SELECT TOP 1 Filesystem
     FROM tblLinuxHardDisks AS t4
     WHERE t4.AssetID = a.AssetID
       AND t4.Filesystem NOT IN (
           SELECT TOP 3 Filesystem
           FROM tblLinuxHardDisks
           WHERE tblLinuxHardDisks.AssetID = a.AssetID
           ORDER BY Filesystem
       )
     ORDER BY Filesystem) AS Volume4,
    (SELECT TOP 1 CAST(Size / 1024 AS NUMERIC)
     FROM tblLinuxHardDisks AS t4
     WHERE t4.AssetID = a.AssetID
       AND t4.Filesystem NOT IN (
           SELECT TOP 3 Filesystem
           FROM tblLinuxHardDisks
           WHERE tblLinuxHardDisks.AssetID = a.AssetID
           ORDER BY Filesystem
       )
     ORDER BY Filesystem) AS Volume4_TotalMB,
    (SELECT TOP 1 CAST(Available / 1024 AS NUMERIC)
     FROM tblLinuxHardDisks AS t4
     WHERE t4.AssetID = a.AssetID
       AND t4.Filesystem NOT IN (
           SELECT TOP 3 Filesystem
           FROM tblLinuxHardDisks
           WHERE tblLinuxHardDisks.AssetID = a.AssetID
           ORDER BY Filesystem
       )
     ORDER BY Filesystem) AS Volume4_FreeMB,
    -- Volume 5
    (SELECT TOP 1 Filesystem
     FROM tblLinuxHardDisks AS t5
     WHERE t5.AssetID = a.AssetID
       AND t5.Filesystem NOT IN (
           SELECT TOP 4 Filesystem
           FROM tblLinuxHardDisks
           WHERE tblLinuxHardDisks.AssetID = a.AssetID
           ORDER BY Filesystem
       )
     ORDER BY Filesystem) AS Volume5,
    (SELECT TOP 1 CAST(Size / 1024 AS NUMERIC)
     FROM tblLinuxHardDisks AS t5
     WHERE t5.AssetID = a.AssetID
       AND t5.Filesystem NOT IN (
           SELECT TOP 4 Filesystem
           FROM tblLinuxHardDisks
           WHERE tblLinuxHardDisks.AssetID = a.AssetID
           ORDER BY Filesystem
       )
     ORDER BY Filesystem) AS Volume5_TotalMB,
    (SELECT TOP 1 CAST(Available / 1024 AS NUMERIC)
     FROM tblLinuxHardDisks AS t5
     WHERE t5.AssetID = a.AssetID
       AND t5.Filesystem NOT IN (
           SELECT TOP 4 Filesystem
           FROM tblLinuxHardDisks
           WHERE tblLinuxHardDisks.AssetID = a.AssetID
           ORDER BY Filesystem
       )
     ORDER BY Filesystem) AS Volume5_FreeMB,
    lpp.NumberOfLogicalCores,
    a.Memory,
    a.IPAddress,
    ls.OSRelease,
    a.Lastseen,
    a.Lasttried
FROM tblAssets a
INNER JOIN tblAssetCustom ac ON a.AssetID = ac.AssetID
INNER JOIN tsysAssetTypes t ON t.AssetType = a.AssetType
INNER JOIN tblLinuxPhysicalProcessor lpp ON a.AssetID = lpp.AssetID
INNER JOIN tblLinuxSystem ls ON a.AssetID = ls.AssetID
WHERE ac.State = 1
ORDER BY a.IPNumeric;

  

The second and dynamic way, but painful if you aren't ingesting the data programmatically, is to concatenate the records into a single field, using the STUFF command.  I used a semicolon as delimiter... so you'd have to parse it back out:

WITH HardDisks AS (
    SELECT
        AssetID,
        STUFF((
            SELECT '; ' + Filesystem
            FROM tblLinuxHardDisks
            WHERE tblLinuxHardDisks.AssetID = hd.AssetID
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS Filesystems,
        STUFF((
            SELECT '; ' + CAST(Size / 1024 AS NVARCHAR)
            FROM tblLinuxHardDisks
            WHERE tblLinuxHardDisks.AssetID = hd.AssetID
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS TotalMB,
        STUFF((
            SELECT '; ' + CAST(Used / 1024 AS NVARCHAR)
            FROM tblLinuxHardDisks
            WHERE tblLinuxHardDisks.AssetID = hd.AssetID
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS UsedMB,
        STUFF((
            SELECT '; ' + CAST(Available / 1024 AS NVARCHAR)
            FROM tblLinuxHardDisks
            WHERE tblLinuxHardDisks.AssetID = hd.AssetID
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, '') AS FreeMB
    FROM tblLinuxHardDisks hd
    GROUP BY AssetID
)
SELECT TOP 1000000
    a.AssetID,
    a.AssetName,
    t.AssetTypename,
    t.AssetTypeIcon10 AS icon,
    hd.Filesystems,
    hd.TotalMB,
    hd.UsedMB,
    hd.FreeMB,
    lpp.NumberOfLogicalCores,
	a.Memory,
   -- md.MemorySizes,
    a.IPAddress,
    ls.OSRelease,
    a.Lastseen,
    a.Lasttried
FROM tblAssets a
INNER JOIN tblAssetCustom ac ON a.AssetID = ac.AssetID
INNER JOIN tsysAssetTypes t ON t.AssetType = a.AssetType
LEFT JOIN HardDisks hd ON a.AssetID = hd.AssetID
INNER JOIN tblLinuxPhysicalProcessor lpp ON a.AssetID = lpp.AssetID
INNER JOIN tblLinuxSystem ls ON a.AssetID = ls.AssetID
WHERE ac.State = 1
ORDER BY a.IPNumeric;

 The 2nd/dynamic way will break the builder/GUI but will work behind the scenes in SQL Server Management Studio or similar tool.

I hope this helps!

Jacob

 

EricCao
Engaged Sweeper

I made some changes it's working but too many duplicates entries:

Select Top 1000000 tblAssets.AssetID,
  tblAssets.AssetName,
  tsysAssetTypes.AssetTypename,
  tsysAssetTypes.AssetTypeIcon10 As icon,
  tblLinuxHardDisks.Filesystem,
  Cast(tblLinuxHardDisks.Size / 1024 As numeric) As TotalMB,
  Cast(tblLinuxHardDisks.Used / 1024 As numeric) As UsedMB,
  Cast(tblLinuxHardDisks.Available / 1024 As numeric) As FreeMB,
  tblLinuxHardDisks.LastChanged,
  tblLinuxPhysicalProcessor.NumberOfLogicalCores,
  tblLinuxMemoryDevices.Size,
  tblAssets.IPAddress,
  tblLinuxSystem.OSRelease,
  tblAssets.Lastseen,
  tblAssets.Lasttried
From tblAssets
  Inner Join tblAssetCustom On tblAssets.AssetID = tblAssetCustom.AssetID
  Inner Join tsysAssetTypes On tsysAssetTypes.AssetType = tblAssets.Assettype
  Inner Join tblLinuxHardDisks On tblAssets.AssetID = tblLinuxHardDisks.AssetID
  Inner Join tblLinuxSystem On tblAssets.AssetID = tblLinuxSystem.AssetID
  Inner Join tblLinuxPhysicalProcessor On tblAssets.AssetID =
      tblLinuxPhysicalProcessor.AssetID
  Inner Join tblLinuxMemoryDevices On
      tblAssets.AssetID = tblLinuxMemoryDevices.AssetID
Where tblLinuxMemoryDevices.Size Is Not Null And tblAssetCustom.State = 1
Order By tblAssets.IPNumeric,
  tblLinuxHardDisks.Filesystem

Reports & Analytics

Ask about reports you're interested in and share reports you've created. Subscribe to receive daily updates of reports shared in the Community.

New to Lansweeper?

Try Lansweeper For Free

Experience Lansweeper with your own data.
Sign up now for a 14-day free trial.

Try Now