Skip to main content

Desired-state infrastructure convergence engine

Project description

CI Crates.io PyPI License: MIT codecov

verg

Desired-state infrastructure convergence engine. A fast, stateless alternative to Ansible, built in Rust.

Pre-1.0: verg is under active development. Expect breaking changes between minor versions.

Features

  • Fast — pushes a single static binary to targets over SSH, executes locally. No Python, no per-task SSH round-trips.
  • Predictable — stateless convergence. Every run checks reality and converges. No state files.
  • Simple — TOML declarations with Jinja2 templating where needed. No variable precedence maze.
  • Agent-friendly--json output, schema command, structured exit codes. Built for both humans and AI agents.

Quick Start

# Install
cargo install verg

# Initialize a project
verg init

# Edit hosts and state
vim verg/hosts.toml
vim verg/state/base.toml

# Preview changes
verg diff --targets all

# Apply
verg apply --targets all

How It Works

  1. Declare desired state in TOML files under verg/state/
  2. Define hosts in verg/hosts.toml with group assignments
  3. Run verg apply — the tool pushes a binary to each target over SSH, which checks current state and converges

Resource Types

Type Description
pkg System packages (apt, dnf, pacman — auto-detected)
file Files and directories (content, permissions, ownership)
service Systemd services (running/stopped, enabled/disabled)
cmd Run a command (requires idempotency guard)
user System users (create/remove)

Example

# verg/hosts.toml
[hosts.web1]
address = "192.168.1.10"
user = "root"
groups = ["web"]

# verg/state/web.toml
targets = ["web"]

[resource.pkg.nginx]
name = "nginx"
state = "present"

[resource.file.nginx-conf]
path = "/etc/nginx/nginx.conf"
content = "server { listen {{ http_port }}; }"
after = ["pkg.nginx"]

[resource.service.nginx]
name = "nginx"
state = "running"
enabled = true
after = ["file.nginx-conf"]

Commands

Command Description
verg apply -t <targets> Converge targets to desired state
verg diff -t <targets> Show what would change (dry-run)
verg check -t <targets> Verify targets match desired state
verg schema Print resource type schemas as JSON
verg init Scaffold a new project
verg completions <shell> Generate shell completions

License

MIT

Project details


Download files

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

Source Distribution

verg-0.6.3.tar.gz (65.7 kB view details)

Uploaded Source

Built Distributions

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

verg-0.6.3-py3-none-manylinux_2_28_x86_64.whl (2.3 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

verg-0.6.3-py3-none-manylinux_2_28_aarch64.whl (2.0 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

verg-0.6.3-py3-none-macosx_11_0_arm64.whl (2.0 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

verg-0.6.3-py3-none-macosx_10_12_x86_64.whl (2.1 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file verg-0.6.3.tar.gz.

File metadata

  • Download URL: verg-0.6.3.tar.gz
  • Upload date:
  • Size: 65.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for verg-0.6.3.tar.gz
Algorithm Hash digest
SHA256 bbc3d8d0a1ee1328fd4ba6e8db34a65060a8e8d1057843675c2972e614714517
MD5 092779ae192c9de70d7107ebe0178059
BLAKE2b-256 fb27f71785190d46f173173807f79bb73cbe5f89c94b518a687a98f3a94dd589

See more details on using hashes here.

File details

Details for the file verg-0.6.3-py3-none-manylinux_2_28_x86_64.whl.

File metadata

  • Download URL: verg-0.6.3-py3-none-manylinux_2_28_x86_64.whl
  • Upload date:
  • Size: 2.3 MB
  • Tags: Python 3, manylinux: glibc 2.28+ x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for verg-0.6.3-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f8f56bc0da99968df602c0638c8c7c544f9147890196c3862fcafb1d5fcff599
MD5 264f4752dd5521243a7c8c2095178842
BLAKE2b-256 1ae65e8cf096ceced3accf661bd5b50044edba13f793784f45246953bd92ef94

See more details on using hashes here.

File details

Details for the file verg-0.6.3-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for verg-0.6.3-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5902ff96f3d8ca5c2367cc55ba2514d3bde697681ed1513edcae153a3a34168d
MD5 4f9cd6dd00790a920435cce5f48bfa17
BLAKE2b-256 21869686fd1d988571844a67a134d0e47e372f26ae5021f9727ec5160eedcfd8

See more details on using hashes here.

File details

Details for the file verg-0.6.3-py3-none-macosx_11_0_arm64.whl.

File metadata

  • Download URL: verg-0.6.3-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 2.0 MB
  • Tags: Python 3, macOS 11.0+ ARM64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for verg-0.6.3-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 bc56a37357c53a89dac072b493d0d1cd735ba3ed9636603b4867f6689baadc39
MD5 13133ce1181a88a46e027eb07a96b37a
BLAKE2b-256 52be7a7e57a32387bbf2eb9a561696d1ad6f059c290ed86ab40fd3ad6db5fd59

See more details on using hashes here.

File details

Details for the file verg-0.6.3-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for verg-0.6.3-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 420724c32ac7640ed74864d64f2ecc899f83644e8b23dc206093d9e5ce614c8f
MD5 7aa53aa0bb23e89f64c2f7b107a026a3
BLAKE2b-256 f52de258d417c4e0a370eb113972f5af73b9d0cf5964e17bbb74c26c5dbf806d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page