diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..656e87e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,2 @@
+*~
+.tox
diff --git a/.zuul.yaml b/.zuul.yaml
new file mode 100644
index 0000000..7ccbd0a
--- /dev/null
+++ b/.zuul.yaml
@@ -0,0 +1,8 @@
+---
+- project:
+    check:
+      jobs:
+        - openstack-tox-linters
+    gate:
+      jobs:
+        - openstack-tox-linters
diff --git a/test-requirements.txt b/test-requirements.txt
new file mode 100644
index 0000000..266f880
--- /dev/null
+++ b/test-requirements.txt
@@ -0,0 +1,2 @@
+PyYAML>=3.1.0
+yamllint>=0.5.2
diff --git a/tox.ini b/tox.ini
new file mode 100644
index 0000000..4e2fa48
--- /dev/null
+++ b/tox.ini
@@ -0,0 +1,30 @@
+[tox]
+envlist = linters
+minversion = 2.3
+skipsdist = True
+
+[testenv]
+basepython = python3
+install_command = pip install -U {opts} {packages}
+setenv = VIRTUAL_ENV={envdir}
+         OS_STDOUT_CAPTURE=1
+         OS_STDERR_CAPTURE=1
+         OS_TEST_TIMEOUT=60
+deps = -r{toxinidir}/test-requirements.txt
+
+[testenv:linters]
+whitelist_externals = bash
+commands =
+  bash -c "find {toxinidir}        \
+            \( -name .tox -prune \)         \
+            -o -type f -name '*.yaml'       \
+            -print0 | xargs -0 yamllint"
+
+[testenv:venv]
+commands = {posargs}
+
+[testenv:true]
+# Use same environment directory as venv to save space and install time
+envdir = {toxworkdir}/venv
+commands = true
+whitelist_externals = true