<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Sibusiso Mfana</title>
    <description>The latest articles on DEV Community by Sibusiso Mfana (@itsjustsbu).</description>
    <link>https://dev.to/itsjustsbu</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1062576%2F9a11989a-d3f7-4b1e-b899-0537a768e34c.jpeg</url>
      <title>DEV Community: Sibusiso Mfana</title>
      <link>https://dev.to/itsjustsbu</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/itsjustsbu"/>
    <language>en</language>
    <item>
      <title>Introducing Settle: A Fresh Take on Configuration as Code</title>
      <dc:creator>Sibusiso Mfana</dc:creator>
      <pubDate>Sat, 05 Jul 2025 21:08:56 +0000</pubDate>
      <link>https://dev.to/itsjustsbu/introducing-settle-a-fresh-take-on-configuration-as-code-4ae8</link>
      <guid>https://dev.to/itsjustsbu/introducing-settle-a-fresh-take-on-configuration-as-code-4ae8</guid>
      <description>&lt;p&gt;About three months ago, I started my journey with Ansible, a configuration and Infrastructure as Code (IaC) tool used by over 20,000 companies.&lt;br&gt;
At first, I really liked it.&lt;/p&gt;

&lt;p&gt;There were some genuinely great things about Ansible that made it enjoyable to work with:&lt;/p&gt;

&lt;p&gt;Push-based: I write the config, and it just goes over SSH. No need for a big control plane or cloud API.&lt;/p&gt;

&lt;p&gt;Agentless: No weird daemons to install on every server. Just SSH and vibes.&lt;/p&gt;

&lt;p&gt;Collections: A whole ecosystem of plugins for AWS, Docker, Kubernetes — you name it.&lt;/p&gt;

&lt;p&gt;But the problems started early.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Folx98zxcn6kmh2zo15fg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Folx98zxcn6kmh2zo15fg.png" alt="Image description" width="436" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The friction
&lt;/h2&gt;

&lt;p&gt;Ansible had me debugging ansible.cfg before I even wrote my first playbook.&lt;br&gt;
Then came the Python version hell. One moment it’s working, the next it’s yelling about bcrypt being outdated — and just like that, Ansible left the chat. Eventually, I gave up and started running Ansible inside Docker.&lt;/p&gt;

&lt;p&gt;Along came the YAML mess and its indentation problems. Oh, and the autocomplete feature on VS Code? That’s just decoration.&lt;br&gt;
Error messages? Either very Python-based, vague, or just you messing up Jinja. Not even GitHub Copilot wanted to help out.&lt;/p&gt;

&lt;p&gt;Worst of all, for someone who just joined a new company and is configuring servers? No undo button. 🫤&lt;/p&gt;

&lt;p&gt;Oh, and don’t get me started on the amount of time you have to wait for your Ansible plays to execute. You might as well build the CI/CD pipeline that will cost you a lot to run those Ansible plays — because at least they would discount your convenience.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6f3615f5d05z6u9s3zdz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6f3615f5d05z6u9s3zdz.png" alt="Image description" width="587" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Building of Settle
&lt;/h2&gt;

&lt;p&gt;After two months of after-hours, weekends, missing family events, and saying no to going out, I’ve built Settle to a point where I can demo it and open source it — so we can build it up into the config-as-code tool of the future.&lt;/p&gt;

&lt;p&gt;The future of config is not large YAML files that claim to be easy to follow but require a course to even understand how they are structured.&lt;br&gt;
The future of config is a declarative approach — one that keeps track of the state of your configs, one where the autocomplete tool actually works and helps you get a lot done.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Settle Philosophy
&lt;/h1&gt;

&lt;p&gt;I am building settle on 3 core beliefs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Configuration should feel like programming, not punishment&lt;br&gt;
Configuring servers should be clear, expressive, and easy to plug in and play.&lt;br&gt;
Settle is built in Go and takes inspiration from Terraform for its simplicity and readability — but it is purpose-built for system-level configs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;State matters&lt;br&gt;
Every resource in Settle knows what it should look like and compares that to the real system. It doesn't assume anything — it checks, diffs, and only applies what’s necessary. No more re-running playbooks and hoping for the best.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Fast feedback &amp;gt; Fancy features&lt;br&gt;
We value speed and clarity over features for features' sake.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Settle gives you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fast execution (built in Go)&lt;/li&gt;
&lt;li&gt;Clear, structured plans&lt;/li&gt;
&lt;li&gt;Real dependency graphs&lt;/li&gt;
&lt;li&gt;Sensible logging and dry-runs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If your tool takes longer than your mental context window, it’s already failed you.&lt;/p&gt;

&lt;p&gt;Push-based, agentless, idempotent, state-aware. Just enough abstraction to be useful. No YAML. No drama.&lt;/p&gt;

&lt;p&gt;An example of what a settle unit that installs nginx looks like&lt;/p&gt;

&lt;p&gt;&lt;code&gt;package "nginx" {&lt;br&gt;
    version = "1.18"&lt;br&gt;
    manager = "apt"&lt;br&gt;
  }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Readable. Declarative. fast and easy. &lt;/p&gt;

&lt;h1&gt;
  
  
  Settlectl command
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;settlectl ping&lt;/code&gt; - Checks connectivity to your target hosts over SSH.&lt;br&gt;
Useful for quick reachability checks before applying anything.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;settlectl create&lt;/code&gt; - Applies your configuration and brings resources into the desired state.&lt;br&gt;
Reads from your .stl files and executes the plan.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;settlectl plan&lt;/code&gt; -o plan - Generates a plan that shows what changes will be made to bring your systems into the desired state — without making any changes yet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;settlectl clean&lt;/code&gt; - Remove resources declared in .stl files from remote systems (yes, finally — an undo button).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why did I even bother, if ansible works then why fix it?
&lt;/h2&gt;

&lt;p&gt;Truth be told, this started off as a challenge to myself — to build out what I feel is worth it to me.&lt;br&gt;
Secondly, I want to add value to the tech world. I wanted to gain the confidence to start taking on experts in the system admin, DevOps, and cloud engineering world — and it starts with pissing off Ansible fans. 😉&lt;/p&gt;

&lt;p&gt;Settle is coming soon to GitHub. I’ll be open-sourcing it shortly — and I’d love your feedback, forks, and maybe even a few PRs.&lt;/p&gt;

&lt;p&gt;Follow along. Or join in.&lt;br&gt;
The future of config doesn’t have to be painful.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>tooling</category>
      <category>programming</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
