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.5.tar.gz (95.4 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.5-py3-none-manylinux_2_28_x86_64.whl (2.4 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

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

Uploaded Python 3manylinux: glibc 2.28+ ARM64

verg-0.6.5-py3-none-macosx_11_0_arm64.whl (2.1 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

verg-0.6.5-py3-none-macosx_10_12_x86_64.whl (2.2 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

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

File metadata

  • Download URL: verg-0.6.5.tar.gz
  • Upload date:
  • Size: 95.4 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.5.tar.gz
Algorithm Hash digest
SHA256 65c227a56e6c753154d361e97baeee44aa5b3f17dff0172aa96589cacbf346a9
MD5 c0d681b0a90250a897b2583f22976c79
BLAKE2b-256 6f2c0f68750749a19ab5791fd47a4d2b73c12e2f3fd4d98ee85f46f4b07187e2

See more details on using hashes here.

File details

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

File metadata

  • Download URL: verg-0.6.5-py3-none-manylinux_2_28_x86_64.whl
  • Upload date:
  • Size: 2.4 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.5-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 92435e57c466d6e967155fbf5765d3e7e22f534a6b7c0974438a8e093464a14b
MD5 948981918b215e74508b29e831e64387
BLAKE2b-256 e65daa05b12ebc57cb2d924a93458523da8a27a4b23e3c77ffb34b1ee2b96761

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for verg-0.6.5-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 bcca7ffb15b86e0604e8624ee49e7eca5f078e7aad7f0870f978e96dcfe1e3f7
MD5 c0c2a86b74d957ba3e39cd5eb8776611
BLAKE2b-256 711c848f8055e7bffdc73734c281db2222c06b120612dc6ee817b36c922ab291

See more details on using hashes here.

File details

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

File metadata

  • Download URL: verg-0.6.5-py3-none-macosx_11_0_arm64.whl
  • Upload date:
  • Size: 2.1 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.5-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 9f8a4a8c8b3224aac234468a630f79217c6e08cd915b284fca3ef53701d42063
MD5 1fe85ca493746f7de4f27ac8507229ad
BLAKE2b-256 a2bc6d3388d87d93137366004a3c1ac7669bf270ac21e700495d6ac47d432a94

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for verg-0.6.5-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 d77b3d074a7649dde3fb1b7d3dbd105dbf63c7833ad8a14c8c1764c06a4b3396
MD5 d36a66989f95af27f3c3cdadac525117
BLAKE2b-256 6148ddbc3f92a49dfac87715208fa5b290dc6cf4e552dea74574500da2136a41

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