Blog
Thoughts on engineering, design, and building great products.
Handlers, Loops and Conditionals
Control playbook flow: loop to repeat a task over many values, when to run conditionally, handlers to react to changes (restart on config change), and block/rescue for clean error handling. With real run logs.
Variables, Facts and Templates (Jinja2)
Make playbooks flexible: variables (declared in many places, with a precedence order), facts (host information Ansible gathers automatically), and Jinja2 templates to generate config files dynamically from variables and facts. Watch the rendered file appear on a real host.
Modules and Idempotency
Deep dive: how a module works internally to achieve idempotency — read the current state, compare to desired, change only the difference, then report changed. Why command/shell aren't idempotent, check mode, and a tour of common modules.
Playbook: Structure and Tasks
The playbook is the heart of Ansible — a YAML file describing desired state. This article: the structure of plays and tasks, writing and running your first playbook to install a web server, reading the PLAY RECAP, FQCN, and check mode (dry-run).
Inventory: Static, Dynamic, Groups and Variables
Inventory is where Ansible knows which machines to manage. This article: write a static inventory (INI/YAML), gather hosts into groups and nested groups, assign variables via group_vars/host_vars, target with patterns, and dynamic inventory for the cloud.
Installation and Your First Ad-hoc Commands
Set up the control node (install Ansible), prepare a host to manage, write the config and inventory files, then run your first ad-hoc commands: ping, command, shell, setup, and become to run as root.
Ansible Architecture: Control Node, Inventory, Module and SSH
Deep dive into Ansible's architecture: control node, managed node, inventory, module. And exactly what happens when you run a command — Ansible packages the module, ships it over SSH to the host, runs it with the host's Python, gets JSON back. Observe it for real with -vvv.