Manage multiple Linux servers: tools that work
SSH config, tmux, Ansible, Uptime Kuma, Zabbix and Webmin, ranked by how many servers you have: what each replaces, setup cost in minutes, the one gotcha.
Filtering by topic #ansible · clear
SSH config, tmux, Ansible, Uptime Kuma, Zabbix and Webmin, ranked by how many servers you have: what each replaces, setup cost in minutes, the one gotcha.
When a flat Ansible playbook is enough and when a role earns its directories: the role layout, ansible-galaxy init, role calls, and variable precedence.
An idempotent Ansible playbook that installs Zabbix server on Ubuntu 24.04, a vaulted database password that actually wins, and agents across your inventory.
Ansible check mode explained: what --check and --diff really prove, and where a dry run gives you a wrong answer before you apply for real.
import_playbook, import_tasks and include_tasks do different jobs. See which one your site.yml needs, and prove it with ansible-playbook --list-tasks.
Your Ansible inventory decides which host gets which variable: INI and YAML forms, groups, group_vars, host_vars, connection settings and precedence.
Keep passwords and API tokens in a playbook repo safely: encrypt a vars file or one inline string, split staging from production, and rekey cleanly.
Terraform creates the VPS, Ansible configures it. The real split, why provisioners fight both tools, the handoff commands, and when you need only Ansible.
Install Ansible with pipx on Ubuntu 24.04, write an inventory and a first playbook that hardens a fresh VPS, plus fixes for Permission denied and sudo errors.
Ansible treats an unreachable host differently from a failed task. Use ignore_unreachable, serial and max_fail_percentage, and still see what was missed.
Learn what Ansible facts cost, when gather_facts: false is the right call, and how gather_subset and JSON fact caching cut the wait on every run.
Gate the reboot on evidence the host reports: the Ubuntu marker file, the Red Hat exit code, then reboot in slices so the whole fleet stays up.
Render an nginx config from a Jinja2 template, notify a handler so it reloads only on a real change, then run the play twice to prove idempotence.