Infrastructure as Code (IaC) is a powerful paradigm for envisioning, configuring, and deploying an IT environment. In the IaC model, a computer system is not constructed manually but is described in a file using a specialized language. An automation tool then reads the file and builds the system to the user’s specifications. The efficiency and versatility of IaC have made it a popular complement to DevOps and the cloud computing revolution.
Several automation platforms support IaC, each with many different features and benefits. When you start to envision an IaC solution, you’ll need to consider which of those features will work best for your needs. One important consideration to keep in mind when comparing IaC automation platforms is whether the tool supports imperative or declarative operations.
The terms imperative and declarative come up frequently in IAC discussions. Both terms refer to how the user provides direction to the automation platform. With an imperative tool, you define the steps to execute in order to reach the desired solution. With a declarative tool, you define the desired state of the final solution, and the automation platform determines how to achieve that state.
Imperative systems are often initially easier. You could say that an imperative system is organized more like how a human thinks. Imperative systems allow you to continue to think about configuration as a series of actions or steps, each bringing you closer to the goal. Another benefit of imperative language is that it allows you to automate very detailed and complex configurations by building up multiple layers of commands. And, because an imperative system gives the user more control over how to accomplish a task, it is often more efficient and easier to optimize for a specific purpose than a declarative system.
With all the advantages of imperative languages, you might be wondering why declarative languages are so much in vogue. Declarative tools have been gaining popularity for several years now and arguably are the dominant format for IaC automation. One reason for the popularity of declarative tools is that they require less knowledge on the user’s part, at least once you understand how they work.
With an imperative tool, the user must have enough knowledge to tell the automation platform what to do. With a declarative system, the user only needs to define the state of the final configuration, and the platform determines how to get there. The complexity of the step-by-step execution is hidden from the user.
Another benefit of a declarative language is that it is more idempotent. The concept of idempotence refers to a process that can be executed multiple times with the same result. Because a declarative language just defines the final state, you always end up in the same place no matter where you start. On the other hand, an imperative language envisions a task as a series of predefined steps that could take you to a different endpoint depending on the starting point.
The leading IaC automation platforms occupy various places on the spectrum from imperative to declarative, although many tools have at least some capacity to support both approaches. Chef is generally known as an imperative tool. Terraform and Puppet are considered declarative. Ansible and Salt are mostly declarative but offer some support for imperative commands.
You’ll have many factors to consider when you shop for an IaC automation platform. The choice of imperative versus declarative is only one criterion in a greater matrix of options. However, when you start to design your future IaC environment, it is important to spend some time visualizing whether an imperative or declarative solution would be a better fit for your organization.