A powerful and easy-to-use configuration management system.
Go Shell Makefile
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Failed to load latest commit information.
apply when apply fails due to changes still being present; use those diffs … Dec 19, 2016
blackbox blackbox(test_graph_generation): increase wait time to 1s Feb 24, 2017
ci update protoc to 3.5.1 Mar 24, 2018
cmd cmd(autocomplete): clarify instructions Feb 22, 2017
docs docs: changes based on review feedback Mar 7, 2017
examples update pip package to fix failing example Jan 3, 2017
executor remove embedded resource.Status from docker image and docker network Dec 14, 2016
fetch replace "context" with "golang.org/x/net/context" Oct 26, 2016
fuzzing fuzzing: change names to functions under test Dec 2, 2016
gen/systemd code climate fixes Feb 23, 2017
graph code review updates Nov 14, 2016
healthcheck replace "context" with "golang.org/x/net/context" Oct 26, 2016
helpers update dependencies Feb 13, 2017
keystore Fix lint and vet warnings Oct 5, 2016
load load: remove addGroupDependenciesToGroup Feb 24, 2017
parse fuzzing(names): move fuzzer into package Dec 2, 2016
plan code climate fixes Dec 14, 2016
prettyprinters Make template more readable Dec 2, 2016
render render: remove unnecessary conversions Dec 21, 2016
resource systemd docs: fix links to systemd properties Mar 3, 2017
rpc remove nop task from thunks Dec 20, 2016
samples unarchive: update sample hcl to use file.directory Feb 27, 2017
vendor move from glide to dep, add (pruned) vendor/ Nov 15, 2017
.codeclimate.yml ignore some cc issues Feb 23, 2017
.gitignore move from glide to dep, add (pruned) vendor/ Nov 15, 2017
CHANGELOG.md Update changelog for 0.6.0-beta1 Feb 27, 2017
CODE_OF_CONDUCT.md code_of_conduct: clean up whitespace Sep 29, 2016
CONTRIBUTING.md Add statement about testing bugs to contribution doc Oct 11, 2016
Gopkg.lock move from glide to dep, add (pruned) vendor/ Nov 15, 2017
Gopkg.toml move from glide to dep, add (pruned) vendor/ Nov 15, 2017
LICENSE module: add May 17, 2016
Makefile remove glide dependency for make test Nov 15, 2017
README.md docs: update readme Mar 7, 2017
changelog.sh add changelog generation script Nov 17, 2016
check_license.sh updates to makefile for better linting performance and to check for m… Aug 24, 2016
install-converge.sh Be sure that script is fully downloaded before run Sep 7, 2017
main.go Merge branch 'feature/load-http' of ssh://github.com/asteris-llc/conv… Jun 20, 2016
wercker.yml have wercker install script on get.converge.sh Jan 3, 2017


Converge Logo

Converge is a configuration management tool that makes it easy to manage servers, laptops and other devices.

Key features:

  • Easy to install and run. A single binary and configuration file is all you need.
  • Resources to make changes on your system: docker images and containers, users and groups, systemd, and more. The Resource Reference at converge.aster.is has a complete list of resources and their configuration settings.
  • A powerful graph engine that automatically generates dependencies and runs tasks in parallel.
  • API-first communication using grpc.
  • Module verification: only run trusted modules.

Converge Graph

Slack Status Code Climate

Table of Contents


The install-converge.sh script will download and install the converge binary to your /usr/local/bin/ directory:

sudo ./install-converge.sh -v 0.4.0

The same installation script is available at get.converge.sh:

curl get.converge.sh | sudo bash -

You can also use go get:

go get github.com/asteris-llc/converge

or download a release for your platform from the releases page on Github.


Comprehensive documentation can be found at converge.aster.is.

You can learn more about Converge from the following blog posts and presentations:


Converge uses HCL for syntax. HCL is a superset of JSON that looks (and acts) quite a bit nicer.

The basic unit of composition in converge is the module. Modules have parameters and contain resources. Creating a module looks something like this:

# write "hello world" to disk
param "message" {
  default = "Hello, World in {{param `filename`}}"

param "filename" {
  default = "test.txt"

file.content "render" {
  destination = "{{param `filename`}}"
  content     = "{{param `message`}}"

Invoke this with converge apply --local samples/fileContent.hcl to place a test file on your system. You can also converge plan --local samples/fileContent.hcl to see what changes will be made before you apply them.



For linting, you'll need:

tool go get
golint github.com/golang/lint/golint
go tool vet (built in)
gosimple honnef.co/go/simple/cmd/gosimple
unconvert github.com/mdempsky/unconvert
structcheck github.com/opennota/check/cmd/structcheck
varcheck github.com/opennota/check/cmd/varcheck
aligncheck github.com/opennota/check/cmd/aligncheck
gas github.com/HewlettPackard/gas


You'll need:

  • Google's protobuf compiler, 3.0 or above.
  • The go protoc plugin: go get -a github.com/golang/protobuf/protoc-gen-go
  • The grpc gateway plugin(s): go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger

Continuous Integration and Testing

We use Wercker for CI with a custom base image. The Dockerfile for that image can be found at /ci/Dockerfile in the root of the project, and is pushed as asteris/converge-ci. You can test Converge in the container with the following invocation:

docker run -i \
           -t \
           --rm \
           --volume $(pwd):/go/src/github.com/asteris-llc/converge \
           asteris/converge-ci \
           /bin/bash -c 'cd /go/src/github.com/asteris-llc/converge; make test'

Benchmarks are run with make bench, and fuzzing is run with make fuzzing/{target}.


Converge is licensed under the Apache 2.0 license. See LICENSE for full details.