Initialize sf-jobs repository
diff --git a/roles/ansible-lint/README.rst b/roles/ansible-lint/README.rst
new file mode 100644
index 0000000..081b47c
--- /dev/null
+++ b/roles/ansible-lint/README.rst
@@ -0,0 +1,7 @@
+Runs ansible-lint
+
+**Role Variables**
+
+.. zuul:rolevar:: ansible_lint_roles_dir
+
+   Set this variable to the Ansible roles directory.
diff --git a/roles/ansible-lint/defaults/main.yaml b/roles/ansible-lint/defaults/main.yaml
new file mode 100644
index 0000000..e652cf0
--- /dev/null
+++ b/roles/ansible-lint/defaults/main.yaml
@@ -0,0 +1,2 @@
+---
+ansible_lint_roles_dir: null
diff --git a/roles/ansible-lint/tasks/main.yaml b/roles/ansible-lint/tasks/main.yaml
new file mode 100644
index 0000000..c705e13
--- /dev/null
+++ b/roles/ansible-lint/tasks/main.yaml
@@ -0,0 +1,26 @@
+---
+- name: Run ansible-lint on yaml files
+  shell: >
+    find * -name "*.yml" -or -name "*.yaml" |
+        xargs --no-run-if-empty ansible-lint -p --nocolor
+  register: __files
+  ignore_errors: yes
+  environment:
+    PATH: "{{ ansible_env.PATH }}:{{ ansible_env.HOME }}/.local/bin"
+  args:
+    chdir: "{{ zuul.project.src_dir }}"
+
+- name: Run ansible-lint on roles dir
+  shell: "ansible-lint -p --nocolor {{ ansible_lint_roles_dir }}/*"
+  register: __roles
+  ignore_errors: yes
+  environment:
+    PATH: "{{ ansible_env.PATH }}:{{ ansible_env.HOME }}/.local/bin"
+  args:
+    chdir: "{{ zuul.project.src_dir }}"
+  when: ansible_lint_roles_dir
+
+- name: Fail if linter failed
+  fail:
+    msg: "One or more file(s) failed lint checks"
+  when: (ansible_lint_roles_dir and __roles.rc) or __files.rc