All cheatsheets
Linux · Cheatsheet
Ansible Cheatsheet
Inventory, ad-hoc, playbooks, roles, vault, check mode, and the magic vars (hostvars, groups) every playbook author needs.
Updated 2026-05-21 8 min
Inventory & ad-hoc
| ansible-inventory -i hosts.ini --list | Render inventory as JSON |
| ansible-inventory --graph | Tree view of groups + hosts |
| ansible all -m ping | Connectivity test (uses python on target) |
| ansible web -m setup | Gather all facts from group 'web' |
| ansible db -m shell -a 'systemctl status postgresql' | Run a shell command |
| ansible web -m copy -a 'src=./nginx.conf dest=/etc/nginx/nginx.conf' --become | Copy + sudo |
Playbook basics
| ansible-playbook site.yml -i hosts.ini | Run a playbook |
| ansible-playbook site.yml --check --diff | Dry-run + show diffs (best practice) |
| ansible-playbook site.yml --limit web1 | Limit to one host |
| ansible-playbook site.yml --tags 'deploy,restart' | Run only tagged tasks |
| ansible-playbook site.yml --skip-tags 'slow' | Skip tagged tasks |
| ansible-playbook site.yml --start-at-task 'Install nginx' | Resume from a task |
| ansible-playbook site.yml -vvv | Verbose (4 levels: v, vv, vvv, vvvv) |
Variables & facts
| ansible-playbook site.yml -e 'env=prod version=1.2' | Extra vars (highest precedence) |
| ansible-playbook site.yml -e @prod.json | Extra vars from file |
| {{ ansible_hostname }} / {{ ansible_default_ipv4.address }} | Common facts |
| {{ hostvars['web1'].ansible_distribution }} | Access another host's facts |
| {{ groups['db'] }} | List of hosts in group 'db' |
| {{ lookup('env', 'HOME') }} | Read env var on controller |
Roles & collections
| ansible-galaxy init roles/nginx | Scaffold a role |
| ansible-galaxy collection install community.kubernetes | Install collection |
| ansible-galaxy install -r requirements.yml | Install role/collection deps |
| roles/<name>/{tasks,handlers,defaults,vars,files,templates,meta} | Standard role layout |
Vault (secrets)
| ansible-vault create secrets.yml | Create encrypted file |
| ansible-vault edit secrets.yml | Edit |
| ansible-vault view secrets.yml | View |
| ansible-vault encrypt_string 'mysecret' --name 'db_pass' | Inline-encrypted value |
| ansible-playbook site.yml --ask-vault-pass | Prompt for password |
| ansible-playbook site.yml --vault-password-file ~/.vault_pass | Read from file |
Common task patterns
| become: true become_user: postgres | Privilege escalation |
| when: ansible_os_family == 'Debian' | Conditional execution |
| loop: "{{ packages }}" | Iterate over a list |
| register: result / debug: var=result | Capture + print task output |
| notify: 'restart nginx' | Trigger handler on change |
| block / rescue / always | Try/catch for tasks |
| delegate_to: localhost | Run task on controller, not target |
Useful modules
| ansible.builtin.apt / yum / dnf | Package management |
| ansible.builtin.service / systemd | Manage services |
| ansible.builtin.template | Jinja2 template → file |
| ansible.builtin.lineinfile / blockinfile | Idempotent file edits |
| ansible.builtin.cron | Manage crontab entries |
| community.general.timezone | Set system timezone |
| kubernetes.core.k8s | Apply Kubernetes manifests |
Performance
| forks = 50 (ansible.cfg) | Parallelism — default is 5 |
| strategy: free | Hosts proceed independently (vs default linear) |
| pipelining = True | Fewer SSH calls per task (2-4x faster) |
| fact_caching = jsonfile | Cache facts across runs |
Want the full hands-on training behind this?
Cloudadhar batches walk you through every command in a real production setup — with labs, code reviews, and 1:1 doubt sessions.