Skip to content

AI instance count

DevWithNehaCloud edited this page Sep 15, 2026 · 1 revision

python script

import oci
import csv

# OCI authentication
config = oci.config.from_file()

identity = oci.identity.IdentityClient(config)
compute = oci.core.ComputeClient(config)
virtual_network = oci.core.VirtualNetworkClient(config)

tenancy_id = config["tenancy"]

# Get all compartments
compartments = [
    tenancy_id
]

compartment_response = oci.pagination.list_call_get_all_results(
    identity.list_compartments,
    tenancy_id,
    compartment_id_in_subtree=True,
    access_level="ANY"
)

for compartment in compartment_response.data:
    if compartment.lifecycle_state == "ACTIVE":
        compartments.append(compartment.id)

print(f"Total compartments scanned: {len(compartments)}")

# CSV file
csv_file = "oci_compute_inventory.csv"

rows = []

total_instances = 0
public_instances = 0
private_instances = 0

for compartment_id in compartments:

    # Get compartment name
    if compartment_id == tenancy_id:
        compartment_name = "Tenancy Root"
    else:
        compartment = identity.get_compartment(compartment_id).data
        compartment_name = compartment.name

    # Get all instances
    instances = oci.pagination.list_call_get_all_results(
        compute.list_instances,
        compartment_id
    ).data

    for instance in instances:

        if instance.lifecycle_state != "RUNNING":
            continue

        total_instances += 1

        public_ip = ""
        private_ip = ""

        # Get VNIC attachments for the instance
        vnic_attachments = oci.pagination.list_call_get_all_results(
            compute.list_vnic_attachments,
            compartment_id,
            instance_id=instance.id
        ).data

        for attachment in vnic_attachments:

            vnic = virtual_network.get_vnic(
                attachment.vnic_id
            ).data

            private_ip = vnic.private_ip

            if vnic.public_ip:
                public_ip = vnic.public_ip
                break

        if public_ip:
            access_type = "Public"
            public_instances += 1
        else:
            access_type = "Private"
            private_instances += 1

        rows.append([
            compartment_name,
            instance.display_name,
            instance.lifecycle_state,
            access_type,
            private_ip,
            public_ip
        ])


# Write CSV
with open(csv_file, "w", newline="", encoding="utf-8") as file:

    writer = csv.writer(file)

    writer.writerow([
        "Compartment",
        "Instance Name",
        "Status",
        "Access Type",
        "Private IP",
        "Public IP"
    ])

    writer.writerows(rows)


print("\n===== OCI COMPUTE INVENTORY =====")
print(f"Total Running Instances : {total_instances}")
print(f"Public Instances        : {public_instances}")
print(f"Private Instances       : {private_instances}")
print(f"CSV Report              : {csv_file}")

open code editor in OCI console and create a file inventory.py, paste the above script and save this

Now open in integrated terminal and run the script

python --version
image
python inventory.py
image

this script has also generated the csv download it.

image image image

If we want to see the stopped instances also then copy this python script

import oci
import csv

# OCI authentication
config = oci.config.from_file()

identity = oci.identity.IdentityClient(config)
compute = oci.core.ComputeClient(config)
virtual_network = oci.core.VirtualNetworkClient(config)

tenancy_id = config["tenancy"]

# --------------------------------------------------
# Get all compartments including root tenancy
# --------------------------------------------------

compartments = [
    {
        "id": tenancy_id,
        "name": "Tenancy Root"
    }
]

compartment_response = oci.pagination.list_call_get_all_results(
    identity.list_compartments,
    tenancy_id,
    compartment_id_in_subtree=True,
    access_level="ANY"
)

for compartment in compartment_response.data:
    if compartment.lifecycle_state == "ACTIVE":
        compartments.append({
            "id": compartment.id,
            "name": compartment.name
        })

print(f"Total compartments scanned: {len(compartments)}")

# --------------------------------------------------
# Counters
# --------------------------------------------------

total_instances = 0
running_instances = 0
stopped_instances = 0
public_instances = 0
private_instances = 0

rows = []

# --------------------------------------------------
# Scan all compartments
# --------------------------------------------------

for compartment in compartments:

    compartment_id = compartment["id"]
    compartment_name = compartment["name"]

    print(f"Scanning compartment: {compartment_name}")

    instances = oci.pagination.list_call_get_all_results(
        compute.list_instances,
        compartment_id
    ).data

    for instance in instances:

        # Do NOT filter only RUNNING instances
        # We want RUNNING + STOPPED + other non-terminated states

        lifecycle_state = instance.lifecycle_state

        # Skip terminated instances
        if lifecycle_state == "TERMINATED":
            continue

        total_instances += 1

        if lifecycle_state == "RUNNING":
            running_instances += 1

        elif lifecycle_state == "STOPPED":
            stopped_instances += 1

        public_ip = ""
        private_ip = ""

        # --------------------------------------------------
        # Find VNIC and check public/private IP
        # --------------------------------------------------

        vnic_attachments = oci.pagination.list_call_get_all_results(
            compute.list_vnic_attachments,
            compartment_id,
            instance_id=instance.id
        ).data

        for attachment in vnic_attachments:

            vnic = virtual_network.get_vnic(
                attachment.vnic_id
            ).data

            private_ip = vnic.private_ip

            if vnic.public_ip:
                public_ip = vnic.public_ip
                break

        # --------------------------------------------------
        # Classify Public / Private
        # --------------------------------------------------

        if public_ip:
            access_type = "Public"
            public_instances += 1
        else:
            access_type = "Private"
            private_instances += 1

        # --------------------------------------------------
        # Add data to CSV
        # --------------------------------------------------

        rows.append([
            compartment_name,
            instance.display_name,
            lifecycle_state,
            access_type,
            private_ip,
            public_ip
        ])


# --------------------------------------------------
# Create CSV
# --------------------------------------------------

csv_file = "oci_compute_inventory.csv"

with open(csv_file, "w", newline="", encoding="utf-8") as file:

    writer = csv.writer(file)

    writer.writerow([
        "Compartment",
        "Instance Name",
        "Status",
        "Access Type",
        "Private IP",
        "Public IP"
    ])

    writer.writerows(rows)


# --------------------------------------------------
# Final Summary
# --------------------------------------------------

print("\n======================================")
print("       OCI COMPUTE INVENTORY")
print("======================================")

print(f"Total Instances  : {total_instances}")
print(f"Running Instances: {running_instances}")
print(f"Stopped Instances: {stopped_instances}")
print(f"Public Instances : {public_instances}")
print(f"Private Instances: {private_instances}")

print("\nCSV Report Generated:")
print(csv_file)

run the script

image

check the downloaded csv file

image

Clone this wiki locally