Ansible CLI
Verified against ansible-core 2.20.0, flags verified via `<cmd> --help`, 2026-08-20 · official docs
Ad-hoc one-off commands, running playbooks, encrypting secrets with Vault, and inspecting inventory.
Ad-hoc commands (no playbook)#
ansible all -i inventory.ini -m ping # connectivity check against every host ansible webservers -i inventory.ini -a "systemctl status nginx" # -a with no -m defaults to the 'command' module ansible webservers -i inventory.ini -m yum -a "name=nginx state=present" -b # -b = become (sudo) ansible webservers -i inventory.ini -m ping -l "web01,web02" # limit to a subset of the matched pattern
-m ping is the standard first check when troubleshooting connectivity — it verifies SSH access and that Python is reachable on the target, without changing anything. -a without -m implicitly uses the command module, running the string as a raw shell command.
Running a playbook#
ansible-playbook -i inventory.ini site.yml ansible-playbook -i inventory.ini site.yml --limit web01 ansible-playbook -i inventory.ini site.yml --tags "deploy,config" ansible-playbook -i inventory.ini site.yml --skip-tags "slow-tests" ansible-playbook -i inventory.ini site.yml -e "app_version=1.4.2" # pass extra vars from the command line
Dry-run and diff before applying#
ansible-playbook -i inventory.ini site.yml --check # predict changes without making them ansible-playbook -i inventory.ini site.yml --check --diff # + show the actual file/template diffs ansible-playbook -i inventory.ini site.yml --syntax-check # validate YAML/module syntax only, no connection ansible-playbook -i inventory.ini site.yml --list-tasks # show what would run, in order
--check mode is not a guarantee — modules that don't support check mode (some shell/command tasks) either skip or report inaccurately. Treat it as a strong signal for well-behaved modules, not an absolute preview for every task type.
Debugging a playbook run#
ansible-playbook -i inventory.ini site.yml -v # verbose (stack -vv, -vvv, -vvvv for more detail per level) ansible-playbook -i inventory.ini site.yml --start-at-task="Install package" # resume from a specific task ansible-playbook -i inventory.ini site.yml --step # confirm each task interactively before running it
Ansible Vault — encrypting secrets#
ansible-vault create secrets.yml # create a new encrypted file ansible-vault edit secrets.yml # decrypt, open in $EDITOR, re-encrypt on save ansible-vault view secrets.yml # print decrypted contents, don't write to disk ansible-vault encrypt group_vars/prod/vault.yml # encrypt an existing plaintext file in place ansible-vault decrypt group_vars/prod/vault.yml ansible-playbook -i inventory.ini site.yml --ask-vault-pass # prompt for the vault password at runtime ansible-playbook -i inventory.ini site.yml --vault-password-file=.vault-pass # read it from a file instead
Inventory#
ansible-inventory -i inventory.ini --list # full inventory as JSON ansible-inventory -i inventory.ini --graph # human-readable group/host tree ansible-inventory -i inventory.ini --host web01 # variables resolved for one specific host
Static inventory files use INI or YAML — group hosts under [groupname] headers in INI, with [groupname:vars] for group-level variables and [groupname:children] to nest groups. --graph is the fastest way to sanity-check that a nested group structure actually resolved the way you intended before running a playbook against it.