Skip to main content

Infraclass

Infraclass is a lightweight, zero-dependency inventory compiler. You describe your infrastructure as a hierarchy of YAML files — nodes, and reusable "classes" they inherit from — and infraclass merges them into one flat set of config values per node, decrypting any age-encrypted secrets along the way.

Infraclass has no knowledge of pyinfra, Ansible, or any other automation tool. It only produces data — a Python dict, or YAML on stdout. Feeding that data into whatever automation engine you use is a separate step you write yourself (see "Using the compiled data" below).

Project Directory Structure

Rename your data directory to infraclass/ to align with the framework:

automation/
├── your_inventory_script.py   # Your own integration script — see "Using the compiled data"
└── infraclass/                 # Your hierarchical data directory
    ├── classes/                # Reusable configuration blueprints
    │   ├── components/
    │   ├── platform/
    │   │   └── init.yml        # Standard shared properties & secrets
    │   └── roles/
    ├── nodes/                  # Machine-specific inventory targets
    │   └── node1.example.com.yml
    └── vault/
        └── vault.age            # Encrypted secrets store

Setup

Install the package

uv tool install infraclass

Point it at your age key

By default, infraclass looks for your decryption key at ~/.age/identity.age. Put your private key there, or tell infraclass to use a different path:

export INFRACLASS_AGE_KEY_FILE="$HOME/.age/identity.age"

Systemd / Credentials Directory Resolution

When running inside a systemd service (e.g. a CI/CD runner) that provides the vault key via LoadCredentialEncrypted, infraclass finds it automatically — no config changes needed. It looks in $CREDENTIALS_DIRECTORY for a file matching age-key* or age-pq-key*:

import os
import glob

def _get_age_key_path():
    """Resolves the age encryption key path based on systemic environment tags."""
    creds_dir = os.environ.get("CREDENTIALS_DIRECTORY")
    if creds_dir:
        pattern = os.path.join(creds_dir, "age-[kp]*")
        matches = glob.glob(pattern)
        if matches:
            return sorted(matches)[0]

    return os.environ.get("INFRACLASS_AGE_KEY_FILE", os.path.expanduser("~/.age/identity.age"))

Trying it out

From the command line

infraclass show node1.example.com

Prints that node's fully compiled configuration as YAML. This is the quickest way to sanity-check that a node compiles, and to see exactly what data it produces.

By default (or with --mask-secret-values, the same thing spelled out explicitly), the vault isn't decrypted at all — every !secret reference is shown as a <SECRET: id> placeholder, and no passphrase/Touch ID prompt appears. Add --reveal-secret-values to decrypt the vault and print the real secret values instead.

Vault/secret management lives under its own vault command — infraclass vault add, infraclass vault remove <id>, infraclass vault show <id>, infraclass vault audit, infraclass vault prune, infraclass vault re-encrypt. Run infraclass vault --help for the full list.

Calling it from a script instead of the CLI

If you need the compiled data inside a script rather than as YAML from the CLI, call the compiler function directly:

import infraclass

node_data = infraclass.compile_node_data("node1.example.com", base_dir="infraclass")

node_data["parameters"]    # merged config for this node, secrets decrypted
node_data["classes"]       # every class this node inherited from
node_data["applications"]  # any "applications" lists it picked up

This is exactly what inventory.py (in pyinfra) can do: it can loop over every node file, calling compile_node_data for each one, and builds pyinfra's host/group inventory out of the result.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

infraclass-1.1.1.tar.gz (17.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

infraclass-1.1.1-py3-none-any.whl (18.3 kB view details)

Uploaded Python 3

File details

Details for the file infraclass-1.1.1.tar.gz.

File metadata

  • Download URL: infraclass-1.1.1.tar.gz
  • Upload date:
  • Size: 17.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.5

File hashes

Hashes for infraclass-1.1.1.tar.gz
Algorithm Hash digest
SHA256 c90b9cf1570824151da64cd4a6a43b3276b54da44b1dc528b1b900c09e0a03ee
MD5 ddd6b4c547be4a3b243bb6e6960d06bd
BLAKE2b-256 0f42368938e187ad2ebe91122d24248dfe9fa3014bbf503d849e1eb1a4a29d93

See more details on using hashes here.

File details

Details for the file infraclass-1.1.1-py3-none-any.whl.

File metadata

  • Download URL: infraclass-1.1.1-py3-none-any.whl
  • Upload date:
  • Size: 18.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.14.5

File hashes

Hashes for infraclass-1.1.1-py3-none-any.whl
Algorithm Hash digest
SHA256 00e6edac926d85a8fd8ba11c4659d2d4e19636554bb00cdbaf2624aad734a451
MD5 2678c7dbda1b8fd48f4e38a6ad5444fd
BLAKE2b-256 4ca47acd75b84e3487b0f43df8406b06d4542669867e3cbe0364b8a228f081aa

See more details on using hashes here.

Release history Release notifications | RSS feed

1.1.2

2 files

This release

1.1.1 This release

2 files

1.1.0

2 files

1.0.2

2 files

1.0.1

2 files

1.0.0

2 files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page