Declarative types
These are languages in which it is sufficient to write the state of the desired system or infrastructure in the form of configuration and properties. This is the case, for example, for Terraform and Vagrant from HashiCorp, Ansible, the Azure ARM template, PowerShell DSC, Puppet, and Chef. The user only has to write the final state of the desired infrastructure and the tool takes care of applying it.
For example, the following is the Terraform code that allows you to define the desired configuration of an Azure resource group:
resource "azurerm_resource_group" "myrg" {
name = "MyAppResourceGroup"
location = "West Europe"
tags = {
environment = "Bookdemo"
}
}
In this example, if you want to add or modify a tag, just modify the tags property in the preceding code and Terraform will do the update itself.
Here is another example that allows you to install and restart nginx on a server using Ansible:
---
- hosts: all
tasks:
- name: install and check nginx latest version
apt: name=nginx state=latest
- name: start nginx
service:
name: nginx
state: started
And to ensure that the service is not installed, just change the preceding code, with service as an absent value and the state property with the stopped value:
---
- hosts: all
tasks:
- name: stop nginx
service:
name: nginx
state: stopped
- name: check nginx is not installed
apt: name=nginx state=absent
In this example, it was enough to change the state property to indicate the desired state of the service.