Skip to content

kpetremann/jackadi

Repository files navigation

Jackadi logo

Developer-first automation platform

Jackadi

Status

Warning

Jackadi is currently in an alpha. You're welcome to try it out and give feedback.

What is Jackadi?

Jackadi is a developer-first distributed task execution platform designed for developers with a plugin system. Jackadi is client/server based.

The main motivation is to create a framework where developers write tasks as pure code without abstractions or hidden behaviors. Task writing is meant to be natural and direct.

Key principles:

  • Pure Go Approach: Tasks are written as Go code with no hidden behaviors - what you write is what you get.
  • No Runtime Dependencies: Tasks have no runtime dependencies on other tasks; all dependencies are resolved at compile-time.
  • No Abstractions: Task writing is natural for Go developers with minimal framework-specific knowledge needed.
  • Flexible Use Cases: From simple package installation to complex workflows like server management and upgrades.

Features

Feature Description
Distributed Task Execution Execute tasks across multiple nodes from a central manager.
Plugin System Extend functionality through custom Go plugins.
Advanced Targeting Target nodes via list, glob, regex, advanced query.
Specs Collection Gather and store system information from nodes.
Security mTLS, node acceptance workflow, protection against rogue nodes.
Developer-Friendly Tasks/specs are Go function registered with a simple SDK.
Web API Integrate Jackadi with your infrastructure stack.

Documentation

Full documentation can be found here.

Architecture

architecture

In a nutshell:

  • Nodes are connected to a manager via persistent bidirectional gRPC.
  • Simple plugin system:
    • All tasks and specs collectors are pure Go functions.
    • The plugin system is based on hashicorp/go-plugin.
    • The SDK is simple and easy to use.
  • Tasks results are stored in a local BadgerDB.

Quick demo tour

Quickstart

# Start the manager
manager --mtls=false

# Start an node
node --id="node1" --mtls=false

# Accept the node connection (if not using auto-accept)
jack nodes list
jack nodes accept node1

# The node should be now in "accepted" list
jack nodes list

# Check nodes health
jack nodes health

# Run a task
jack run node1 cmd.run "echo hello"

Write my first plugin

Create a Go project

package main

import "github.com/kpetremann/jackadi/sdk"

func Hello(name string) (string, error) {
	return fmt.Sprintf("Hello %s!", name), nil
}

func main() {
	tour := sdk.New("tour")
	tour.MustRegisterTask("hello", Hello).WithDescription("Greetings.")
	sdk.MustServe(tour)
}

Compile the plugin

CGO_ENABLED=0 go build -o tour .

Put the plugin in the manager

Copy the file in the manager /opt/jackadi/plugins directory.

Then configure /etc/jackadi/plugins.yaml file:

"*":
  - tour

Synchronize the plugin to the node

jack run node1 plugins.sync

Run the plugin

jack run node1 tour.hello

About

Developer-first infrastructure automation and configuration — no DSL, just real code

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Sponsor this project

  •  

Packages

 
 
 

Contributors

Languages