cfn-lint, One Error Found, One Clean Pass
cfn-lint on EL 10 from PyPI into a venv of its own with a link in the PATH; the live test runs pip check, then lints a template with a property the S3 bucket schema lacks (E3002, exit 2) and a clean one (exit 0). Pinned. Original role, live-tested on Rocky Linux 10.
Verification
Live-testedReally deployed to a container sandbox, proven idempotent (a second run changes nothing), verified against the role’s assertions, then torn down.
Conformance
- Static validation (yamllint · ansible-lint)
Provenance
- SHA-256 checksum
- Signature (pending)
Functional
- Live-tested - applied, verified, destroyed
Last verified 2026-09-21 · podman 4.9.3 · ansible 2.21.4 · how we verify
Documentation
cfn-lint
The AWS CloudFormation CLI (cfn-lint) on EL 10, pinned to a version, in a virtual
environment of its own with a link in the PATH. Original role for EL 10,
live-tested with podman on Rocky Linux 10.
There is no package; the documented install is pip. EL 10 carries no
cfn-lint, and pip install into the system Python ties the CLI's
dependencies to whatever the OS ships. This role puts the CLI in
/opt/cfn-lint, a venv apart from the system Python: an OS update
cannot break it, and it cannot break the OS. The live test asserts
import cfnlint fails in /usr/bin/python3.
Pinned, and checked for consistency. cfn_lint_version is what gets
installed; the live test runs pip check inside the venv and expects no
broken requirements.
pip verifies nothing beyond TLS. The index is PyPI over HTTPS; there is
no signature to check. For a byte-for-byte pin, give
cfn_lint_pip_extra_args a requirements file with hashes and
--require-hashes, or a private index.
Proven to run. The live test calls cfn-lint /tmp/cfn-lint-p/bad.yaml and expects
"E3002" - the whole tree loaded and the template linter did its work.
One error found, one clean pass. The live test writes two CloudFormation templates, one with a property the S3 bucket schema does not have, and expects E3002 with exit code 2 for it and exit code 0 for the clean one - the spec loaded, the schema validator ran, the exit code a pipeline keys on is proven in both directions. cfn-lint pulls the CloudFormation resource specification with it; the venv keeps that off the system Python.
License
Commercial - IaC Bazaar EULA. (c) IaC Bazaar.
Usage code & full reference need an account
The complete copy-paste usage, the full input/output reference, and operational notes are free with an account - shown here and bundled in the download. Sign in and this section fills in.
- Variables
- Test
Related modules
aws-codebuild
privileged_mode hands the build the Docker socket, so anything it runs can read every environment variable and assume the service role. Off by default, and a PLAINTEXT variable whose name looks like a secret is refused.
aws-fis
FIS refuses a template with no stop condition, which reads like a guarantee - and source = 'none' is a legal stop condition meaning the experiment never halts by itself. Refused here, along with targets that grow at run time and an empty-target mode that reports success for having tested nothing.
aws-codeartifact
A repository with a public external connection serves whatever the public registry holds for any name it does not. This puts the connection on its own repository, reached through an upstream, and emits the origin-control commands Terraform cannot apply.
aws-appconfig
AppConfig exists to deploy a configuration slowly and roll it back automatically, and both halves are opt-in - the predefined AllAtOnce strategy is 100% of the fleet with zero bake time. Gradual here, and a precondition refuses an environment with no alarms, where automatic rollback has nothing to fire on.
ansible-aws-cli-v2
The AWS CLI v2 from the upstream zip, verified with gpg against the AWS CLI Team key (pinned by fingerprint, in a GnuPG home of its own) before it is unpacked. EL 10 has no package; most installs run curl | unzip and never read the signature. Pinned version, tab completion, and a live test that runs an API call to 'Unable to locate credentials'. Original role, live-tested on Rocky Linux 10.
aws-mwaa
webserver_access_mode defaults to PUBLIC_ONLY, and the Airflow UI is not a dashboard: anyone who reaches it can trigger a DAG, which is arbitrary Python running as the execution role. PRIVATE_ONLY here, all five log streams on, and a precondition refuses an unpinned requirements.txt or plugins.zip - where bucket write access is otherwise the same permission as code execution.