Comparison of Infrastructure as Code tools

Source - Multiple articles by Yevgeniy Brikman & other online articles:


Source Cloud Type Infrastructure Language Agent Master Community Maturity Initial Release
Chef Open All Config Mgmt Mutable Procedural Yes Yes Large High 2005
Puppet Open All Config Mgmt Mutable Declarative Yes Yes Large High  2009
Ansible Open All Config Mgmt Mutable Procedural No No Large Medium  2011
SaltStack Open All Config Mgmt Mutable Declarative Yes Yes Medium Medium  2011
CloudFormation Closed AWS Provisioning Immutable Declarative No No Small Medium 2012
Heat Open All Provisioning Immutable Declarative No No Small Low  2012
Terraform Open All Provisioning Immutable Declarative No No Medium Low  2014
Deployment Manager GCP Config Mgmt Declarative  2015
Pulumi Open All Provisioning Immutable Declarative  2017

The goal of DevOps is to make software delivery vastly more efficient.

Instead of constant outages and downtime, you build resilient, self-healing systems, and use monitoring and alerting to catch problems that can’t be resolved automatically.

There are four core values in the DevOps movement: Culture, Automation, Measurement, and Sharing (sometimes abbreviated as the acronym CAMS)

The idea behind infrastructure as code (IAC) is that you write and execute code to define, deploy, and update your infrastructure.

There are four broad categories of IAC tools:
- Ad hoc scripts
- Configuration management tools
- Server templating tools
- Server provisioning tools

Chef, Puppet, Ansible, and SaltStack are all configuration management tools, which means they are designed to install and manage software on existing servers.

Code that works correctly no matter how many times you run it is called idempotent code.

An alternative to configuration management that has been growing in popularity recently are server templating tools such as Docker, Packer, and Vagrant.

A server templating tool like Packer can be used to create a self-contained image of a server. You can then use other tools, such as Ansible, to install that image across all of your servers.

A virtual machine (VM) emulates an entire computer system, including the hardware. You run a hypervisor, such as VMWare, VirtualBox, or Parallels, to virtualize (i.e., simulate) the underlying CPU, memory, hard drive, and networking.

A container emulates the user space of an operating system. All the containers running on a single server share that server’s operating system kernel and hardware, so the isolation is not as secure as with VMs.

VMs virtualize the hardware, whereas containers only virtualize user space.

Server templating is a key component of the shift to immutable infrastructure. The idea behind immutable infrastructure is that once you’ve deployed a server, you never make changes to it again. If you need to update something (e.g., deploy a new version of your code), you create a new image from your server template and you deploy it on a new server.

Server provisioning tools such as Terraform, CloudFormation, and OpenStack Heat are responsible for creating the servers themselves.


A declarative style is great when you need to update your infrastructure or make any changes to it. Whereas the imperative is good for a deploy and forget model, but that isn’t always great if you’re looking to be an agile organization or have a changing infrastructure. 

Terraform is a binary that translates the contents of your configurations into API calls to cloud providers
GCP Deployment Manager is a hosted service that allows you to integrate with other GCP services such as Identity Access Management like Cloud Formation from AWS which is only structured to work within AWS infrastructure, and it integrates well with AWS services.

Terraform is the swiss army knife of IaC tools. It is not only idempotent, Terraform is completely cloud-agnostic and helps you tackle large infrastructure for complex distributed applications.  

Ansible provides a “radically simple” IT automation engine. It is designed for multi-tier deployments and uses no agents. Ansible is a strong fit for configuration management, application deployment, and intra-service orchestration by describing how all the systems inter-relate.

Also see - 

Comments