Sobes.tech
Middle

Why are two folders with variables needed in the DevOps role, and what are they?

sobes.tech AI

Answer from AI

As a DevOps, two variable folders are usually used to separate common and environment-specific settings. This increases flexibility, reusability, and security of configurations.

The two main folders:

  1. group_vars: Contains variables applied to all hosts in a specific inventory group. Variables from these files are applied to hosts included in the group, with the filename matching the group name (e.g., group_vars/web_servers.yaml) or in the group_vars/all.yaml file (applied to all hosts). This is convenient for defining common settings for a group of servers (e.g., network settings, installation paths).
  2. host_vars: Contains variables specific to individual hosts. Variables from these files are applied only to the specific host, with the filename matching the host name (e.g., host_vars/server1.example.com.yaml). Used for unique host settings (e.g., specific interface IP addresses, software versions, specific access credentials).

Example directory structure when using Ansible:

# Directory structure with variables
.
├── inventory  # Inventory file or directory
│   └── hosts.yaml
├── group_vars
│   ├── all.yaml       # Variables for all hosts
│   └── web_servers.yaml # Variables for the web_servers group
└── host_vars
    ├── server1.example.com.yaml # Variables for host server1
    └── server2.example.com.yaml # Variables for host server2

Example contents of files:

// group_vars/all.yaml
---
# Common variables for all hosts
tz: "Europe/Moscow"
ntp_servers:
  - 0.pool.ntp.org
  - 1.pool.ntp.org
// group_vars/web_servers.yaml
---
# Variables for the web_servers group
http_port: 80
https_port: 443
document_root: "/var/www/html"
// host_vars/server1.example.com.yaml
---
# Specific variables for server1
external_ip: "192.168.1.100"
database_server: "db.example.com"

Advantages of this separation:

  • Hierarchy and priority: Ensures a clear hierarchy of variable application (host_vars have higher priority than group_vars, and group_vars for a specific group have higher priority than group_vars/all).
  • Reusability: Common settings can be defined once in group_vars and applied to multiple hosts.
  • Readability and manageability: Configuration becomes more understandable and maintainable, as specific and common settings are separated.
  • Security: Sensitive specific data (e.g., passwords or keys for a particular host) can be stored in host_vars and encrypted separately if necessary.

In the context of other tools (e.g., Terraform with .tfvars files or application configuration files), the principle of separating common and environment/instance-specific variables remains, although directory names may differ. For example, Terraform often uses files like terraform.tfvars (for defaults) and environment-specific files like dev.tfvars, stage.tfvars, prod.tfvars.

The main idea is to separate immutable "common" parameters from changing "environmental" or "host-specific"" ones to simplify configuration management.