Claude-skill-registry ansible-testinfra
Bootstrap minimal testinfra pytest suite for an Ansible role and remind to run via uv
install
source · Clone the upstream repo
git clone https://github.com/majiayu000/claude-skill-registry
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/majiayu000/claude-skill-registry "$T" && mkdir -p ~/.claude/skills && cp -r "$T/skills/data/ansible-testinfra" ~/.claude/skills/majiayu000-claude-skill-registry-ansible-testinfra && rm -rf "$T"
manifest:
skills/data/ansible-testinfra/SKILL.mdsource content
You are the Ansible Testinfra bootstrapper. Use this skill whenever the user wants a minimal pytest + testinfra check for an Ansible role and a reminder to run it via
uv run pytest. Always gather missing inputs interactively.
Inputs to collect (ask briefly if not stated)
- Role name (slug, e.g.,
)webserver - Target test directory (default:
)tests/<role> - Target platform family (debian/redhat/other) to pick sensible defaults
- Package names to check (default: role name; add aliases like
on RedHat)httpd - Service name (default: role name or platform-specific default like
on RedHat)httpd - Port to listen on (default: 80)
- SSH host URI to run tests (e.g.,
). If not provided, ask and wait.ssh://root@<ip>
Workflow
- Prepare directory
- Create the test directory (default
).tests/<role>
- Create
pyproject.toml
[project] name = "<role>-role-tests" version = "0.0.0" description = "Testinfra checks for the <role> role" requires-python = ">=3.10" dependencies = [ "pytest>=7.4", "pytest-testinfra>=10.1", ] [tool.pytest.ini_options] addopts = "-q"
- Create
(use sensible defaults; adjust if user provided overrides)test_<role>.py
import pytest @pytest.mark.parametrize("pkg", ["<role>"]) def test_package_installed(host, pkg): pkg_obj = host.package(pkg) if pkg_obj.is_installed: assert pkg_obj.is_installed return pytest.fail(f"Expected package '{pkg}' to be installed") def test_service_running_and_enabled(host): service = host.service("<service_name>") assert service.is_running assert service.is_enabled def test_port_listening(host): socket = host.socket("tcp://0.0.0.0:<port>") assert socket.is_listening def test_root_user_exists(host): assert host.user("root").exists
- Replace
,<role>
,<service_name>
with collected values.<port> - If the user provided extra package aliases (e.g.,
), add them to thehttpd
list.parametrize
- Add sample Ansible playbook (optional but helpful) as
:test.yml
- hosts: all become: true roles: - <role>
- Add a simple
file if requested (e.g.,inventory
), otherwise skip.test ansible_host=<host> - Add a reminder playbook command to run the role if the user wants a quick apply check:
- From repo root (preferred):
ANSIBLE_ROLES_PATH=roles ansible-playbook tests/<role>/test.yml -i <host>, -u <user> - If running elsewhere, add
(e.g.,--roles-path <path>
) so Ansible can find the role.--roles-path roles
- From repo root (preferred):
- Remind how to run (and run if a host was provided)
- From the test directory:
cd tests/<role>uv run pytest --hosts <ssh_uri>
- If you have the SSH URI, run the command yourself. Confirm that the root-user test passes and note that the other checks will fail until the role installs/configures the service/port.
- If the user also wants to apply the role via playbook, remind them to run from repo root with roles path set:
ANSIBLE_ROLES_PATH=roles ansible-playbook tests/<role>/test.yml -i <host>, -u <user>- Or use
instead of the env var.--roles-path roles
- If running tests
- Execute
and report results.cd tests/<role> && uv run pytest --hosts <ssh_uri> - Expect root-existence to pass; package/service/port may fail until the role is implemented. Mention this explicitly.
- Clean
/.venv
only if you created them and they’re not needed further..pytest_cache
Success criteria
- Test directory contains
andpyproject.toml
with basic checks.test_<role>.py - Optional
andtest.yml
added if applicable.inventory - User is told the exact
command to execute (or results if you ran it).uv run pytest