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.2.tar.gz (64.0 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.2-py3-none-manylinux_2_28_x86_64.whl (2.3 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

verg-0.6.2-py3-none-manylinux_2_28_aarch64.whl (2.1 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

verg-0.6.2-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.2.tar.gz.

File metadata

  • Download URL: verg-0.6.2.tar.gz
  • Upload date:
  • Size: 64.0 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.2.tar.gz
Algorithm Hash digest
SHA256 8bda0948f568fed685eb45f6db6feeccd439c954fd621af25865a297d2b969bc
MD5 ba258fb13d11cdbeaf32ce7121b54578
BLAKE2b-256 276ea66b7e5ca481747e99094849fcdf9b7d5e7e931aeaac4972d7e4ba0a1ecf

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for verg-0.6.2-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 66f3f45e54ea641b865ebffba35f3ef44a636551bfae4fa77f0aaa1463d43173
MD5 4c96bfdbea9667856f0beb67f8481448
BLAKE2b-256 e69e2f4f6196bb9a4032aef81f78aea0ca37323e7394997cd3d4e2a3ce5a9bad

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for verg-0.6.2-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 5d2aca0aafeba8f0cf7d4b895b44a70056f81a2ea9334176a0d3071b12a6164e
MD5 d1976e783fbb097a5e4e09c22c66d854
BLAKE2b-256 aa7c28f01e0726cfe4b9247548c90d010085bd25c78695adcaf96a2b4e26d00c

See more details on using hashes here.

File details

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

File metadata

  • Download URL: verg-0.6.2-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.2-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 d06217eeb47077a034f6b65fa3a924db8e1d7c60ff1b9a05b947030d59f89dbc
MD5 c2d219c4c2c6abda707d99cb852a075c
BLAKE2b-256 3324d5c585683224c940afd2cf6090cd133c732c1c99771ba30be7aa7377c3fb

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for verg-0.6.2-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 7f395cc29beb526b223762cd12ac78b4997cd1497e6d774ed893acde7ed588e7
MD5 6eee18f8210deee460c19e3268147a50
BLAKE2b-256 e30370dee462c08bf806584d0d6184ec15d49a6547728b2b49b718674e7ca24d

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