Provision it. Configure it. One plan.

Today that's Terraform, Ansible, and a drawer of glue scripts holding them together. Conn3x does both jobs: one binary, one plan, one state, for your cloud and every server it creates.

Get startedStar it on GitHub

v0.1 is out. Open source, MPL-2.0, built in public.

$ conn3x plan
+ digitalocean_droplet.web
+ conn3x_package.web__nginx["web1"]
+ conn3x_file.web__page["web1"]
    host = (known after apply)
+ conn3x_service.web__running["web1"]
Plan: 4 to add, 0 to change, 0 to destroy.
Summarised from a real plan: the droplet, and the steps that set it up, waiting on an address that doesn't exist yet.

What it does

See everything before it runs

One plan shows the server you're about to create and the exact changes headed for it, line by line. Run it again later and it tells you what someone changed by hand.

Keep your providers

Conn3x is built on OpenTofu, so every Terraform and OpenTofu provider works as it is, and so do the modules and state you already have.

Install nothing on your servers

No Python, no agent. Conn3x connects over SSH, checks the host key every time, and runs plain shell commands, as root or through sudo.

It's early, and Linux first: Rocky, RHEL, AlmaLinux, Fedora, Debian and Ubuntu.

Bring your playbooks

conn3x convert ansible -i inventory site.yml rewrites each task it can prove means the same thing. What it can't, a loop or a Jinja filter, stays in the file with the reason, so nothing gets guessed.

site.yml
- name: Ship the nginx config
  copy:
    src: nginx.conf
    dest: /etc/nginx/nginx.conf
    mode: "0644"
  notify: Reload nginx
site.tf
step "ship_the_nginx_config" {
  file {
    path    = "/etc/nginx/nginx.conf"
    content = file("${path.module}/files/nginx.conf")
    mode    = "0644"
  }
  notify = [handler.reload_nginx]
}

Two tools, or one

Terraform or OpenTofu, plus AnsibleConn3x
To installTwo tools, and Python on the controller and every hostOne binary
StateTerraform state for the cloud, none for the hostsOne state for both
Seeing host changesA separate --check --diff runIn the same plan as the cloud
Cloud addresses in host configInventory scripts or pluginsAn expression
Finding drift on hostsRun the playbook in check modeconn3x drift, both layers

Fifteen minutes to your first circuit

All you need is one Linux server you can reach over SSH.