ansible
✓Verified·Scanned 2/18/2026
This skill provides Ansible best-practice guidance for YAML, variable precedence, idempotence, handlers, privilege escalation, and common mistakes. It references credential handling via --ask-vault-pass, vault password file, and ansible.cfg, which involves handling secrets but is purpose-aligned.
from clawhub.ai·v79d1ad1·3.1 KB·0 installs
Scanned from 1.0.0 at 79d1ad1 · Transparency log ↗
$ vett add clawhub.ai/ivangdavila/ansible
YAML Syntax Traps
- Jinja2 in value needs quotes —
"{{ variable }}"not{{ variable }} :in string needs quotes —msg: "Note: this works"notmsg: Note: this- Boolean strings:
yes,no,true,falseparsed as bool — quote if literal string - Indentation must be consistent — 2 spaces standard, tabs forbidden
Variable Precedence
- Extra vars (
-e) override everything — highest precedence - Host vars beat group vars — more specific wins
vars:in playbook beats inventory vars — order: inventory < playbook < extra vars- Undefined variable fails — use
{{ var | default('fallback') }}
Idempotence
command/shellmodules aren't idempotent — always "changed", usecreates:or specific module- Use
apt,yum,copyetc. — designed for idempotence changed_when: falsefor commands that don't change state — like queriescreates:/removes:for command idempotence — skips if file exists/doesn't
Handlers
- Handlers only run if task reports changed — not on "ok"
- Handlers run once at end of play — not immediately after notify
- Multiple notifies to same handler = one run — deduplicated
--force-handlersto run even on failure — ormeta: flush_handlers
Become (Privilege Escalation)
become: yesto run as root —become_user:for specific userbecome_method: sudois default — usesuordoasif needed- Password needed for sudo —
--ask-become-passor in ansible.cfg - Some modules need become at task level — even if playbook has
become: yes
Conditionals
when:without Jinja2 braces —when: ansible_os_family == "Debian"notwhen: "{{ ... }}"- Multiple conditions use
and/or— or list for implicitand is defined,is not definedfor optional vars —when: my_var is defined- Boolean variables:
when: my_bool— don't compare== true
Loops
loop:is modern,with_items:is legacy — both work, loop preferredloop_control.loop_varfor nested loops — avoids variable collisionitemis the loop variable — useloop_control.labelfor cleaner outputuntil:for retry loops —until: result.rc == 0 retries: 5 delay: 10
Facts
gather_facts: nospeeds up play — but can't useansible_*variables- Facts cached with
fact_caching— persists across runs - Custom facts in
/etc/ansible/facts.d/*.fact— JSON or INI, available asansible_local
Common Mistakes
register:captures output even on failure — checkresult.rcorresult.failedignore_errors: yescontinues but doesn't change result — task still "failed" in registerdelegate_to: localhostfor local commands — butlocal_actionis cleaner- Vault password for encrypted files —
--ask-vault-passor vault password file --check(dry run) not supported by all modules —command,shellalways skip