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

Uploaded Python 3manylinux: glibc 2.28+ x86-64

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

Uploaded Python 3manylinux: glibc 2.28+ ARM64

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

Uploaded Python 3macOS 11.0+ ARM64

verg-0.6.4-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.4.tar.gz.

File metadata

  • Download URL: verg-0.6.4.tar.gz
  • Upload date:
  • Size: 75.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.4.tar.gz
Algorithm Hash digest
SHA256 2b5cffefb217b6720b62bda569bc8167730e06f38c25368b77c27b318f30094e
MD5 9bc82afce748e65b97906291fd821632
BLAKE2b-256 d5f0b655c6399368cde4f6899e4677301a1e97374bf8d6bba80fd6cf16338726

See more details on using hashes here.

File details

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

File metadata

  • Download URL: verg-0.6.4-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.4-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e02075f22485bb667f8ab1a2c50282684a7193d50d312a539d7f8a8daeb3173e
MD5 6535488821305f1f7a511edecde5cd23
BLAKE2b-256 e6180339a30c6a53250df963b38108296e3a2dfce4d22b58fbfed4d4b5b02ff6

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for verg-0.6.4-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 9eb45da9446d8e5194e0875faefd0ee6d8c6ff205e6cc195ebc88321edd2e222
MD5 9ab916c90a64b62bd872bd1a6c33f25e
BLAKE2b-256 9de38382b807e64645986d3fe459d3bd8335edea0de17bd09df763655055f529

See more details on using hashes here.

File details

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

File metadata

  • Download URL: verg-0.6.4-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.4-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a4558fa5d4e1a3a0b0e21c17b4c3b1cb7c7f2fe6219ec15d883e81d220f66d9a
MD5 eab02e5e1d05a3fd29e2e189cbbfa523
BLAKE2b-256 89c2933990c10b3fb3ea4be35e79893ad0a5d29e167326b4e491cd75404aa5d7

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for verg-0.6.4-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 1fb0fb7247e0e6b518fe5bc508ea60d7f735d8e63904d4ed057ebef61c39b60a
MD5 b1303e4bcb63b3df5482420e3a180ffc
BLAKE2b-256 4d2c13c19d08440182d42ae8f3fbb5bd839c33fb3f2515ecad6389092bceb633

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