diff --git a/ansible/.devcontainer/devcontainer.json.jinja b/ansible/.devcontainer/devcontainer.json.jinja
new file mode 120000
index 0000000..f3733b0
--- /dev/null
+++ b/ansible/.devcontainer/devcontainer.json.jinja
@@ -0,0 +1 @@
+../../generic/.devcontainer/devcontainer.json.jinja
\ No newline at end of file
diff --git a/ansible/.editorconfig b/ansible/.editorconfig
new file mode 120000
index 0000000..a7109bc
--- /dev/null
+++ b/ansible/.editorconfig
@@ -0,0 +1 @@
+../generic/.editorconfig
\ No newline at end of file
diff --git a/ansible/CHANGELOG.md.jinja b/ansible/CHANGELOG.md.jinja
new file mode 120000
index 0000000..3cc3f6f
--- /dev/null
+++ b/ansible/CHANGELOG.md.jinja
@@ -0,0 +1 @@
+../generic/CHANGELOG.md.jinja
\ No newline at end of file
diff --git a/ansible/Taskfile.yaml.jinja b/ansible/Taskfile.yaml.jinja
new file mode 100644
index 0000000..66908ef
--- /dev/null
+++ b/ansible/Taskfile.yaml.jinja
@@ -0,0 +1,34 @@
+version: "3"
+
+tasks:
+  docs:
+    desc: Start a server which serves the project documentation
+    cmds:
+      - mkdocs serve {% if git_provider == 'github' %}--config-file=.github/.mkdocsrc{% endif %}
+  inventory:
+    desc: Display the inventory as seen from Ansible in graph form
+    cmds:
+      - ansible-inventory --graph
+  inventory-list:
+    desc: Display the inventory as seen from Ansible in list form
+    cmds:
+      - ansible-inventory --list
+  lint:
+    desc: Check the syntax of Ansible playbooks
+    cmds:
+      - ansible-lint
+  run:
+    desc: Run playbook
+    cmds:
+      - ansible-playbook main.yaml
+  setup:
+    desc: Install dependencies and setup the project
+    cmds:
+      - pre-commit install {%- if git_provider == 'github' %} --config .github/.precommitrc{% endif %} --hook-type pre-commit --hook-type commit-msg
+      - pip install --user ansible-lint
+      - ansible-galaxy install -r requirements.yaml
+  default:
+    cmds:
+      - task --list
+
+silent: true
diff --git a/ansible/ansible.cfg b/ansible/ansible.cfg
new file mode 100644
index 0000000..3f05714
--- /dev/null
+++ b/ansible/ansible.cfg
@@ -0,0 +1,2 @@
+[defaults]
+inventory  = ./inventory.yaml
diff --git a/ansible/inventory.yaml b/ansible/inventory.yaml
new file mode 100644
index 0000000..b0f6507
--- /dev/null
+++ b/ansible/inventory.yaml
@@ -0,0 +1,5 @@
+---
+ungrouped:
+  hosts:
+    localhost:
+      ansible_connection: local
diff --git a/ansible/main.yaml b/ansible/main.yaml
new file mode 100644
index 0000000..d74a028
--- /dev/null
+++ b/ansible/main.yaml
@@ -0,0 +1,7 @@
+---
+- name: Demo Playbook
+  hosts: all
+  tasks:
+    - name: Debug information
+      ansible.builtin.debug:
+        msg: "The hostname is {{ ansible_hostname }}"
diff --git a/ansible/requirements.yaml b/ansible/requirements.yaml
new file mode 100644
index 0000000..03c40c6
--- /dev/null
+++ b/ansible/requirements.yaml
@@ -0,0 +1,7 @@
+---
+collections:
+  - name: ansible.utils
+    version: 3.0.0
+# roles:
+#   - name: TBD
+#     version: TBD
diff --git a/ansible/version.txt.jinja b/ansible/version.txt.jinja
new file mode 120000
index 0000000..aa1d710
--- /dev/null
+++ b/ansible/version.txt.jinja
@@ -0,0 +1 @@
+../generic/version.txt.jinja
\ No newline at end of file
diff --git a/ansible/{% if git_provider == 'github' %}.github{% endif %}/.commitlintrc b/ansible/{% if git_provider == 'github' %}.github{% endif %}/.commitlintrc
new file mode 120000
index 0000000..3335227
--- /dev/null
+++ b/ansible/{% if git_provider == 'github' %}.github{% endif %}/.commitlintrc	
@@ -0,0 +1 @@
+../../generic/{% if git_provider == 'github' %}.github{% endif %}/.commitlintrc
\ No newline at end of file
diff --git a/ansible/{% if git_provider == 'github' %}.github{% endif %}/.devcontainer/devcontainer.json.jinja b/ansible/{% if git_provider == 'github' %}.github{% endif %}/.devcontainer/devcontainer.json.jinja
new file mode 100644
index 0000000..2386f50
--- /dev/null
+++ b/ansible/{% if git_provider == 'github' %}.github{% endif %}/.devcontainer/devcontainer.json.jinja	
@@ -0,0 +1,12 @@
+// For format details, see https://aka.ms/devcontainer.json. For config options, see the
+{
+  "name": "{{project_name}}",
+  "image": "ghcr.io/jwbennet/project-base-dev-container:2.2.0",
+  "features": {
+    // renovate: depType=devcontainerFeature datasource=docker
+    "ghcr.io/devcontainers-contrib/features/ansible:2.0.17": {
+      // renovate: depType=devDependencies datasource=github-tags depName=ansible/ansible extractVersion=true
+      "version": "2.16.3"
+    }
+  }
+}
diff --git a/ansible/{% if git_provider == 'github' %}.github{% endif %}/.lintstagedrc b/ansible/{% if git_provider == 'github' %}.github{% endif %}/.lintstagedrc
new file mode 120000
index 0000000..6a4903e
--- /dev/null
+++ b/ansible/{% if git_provider == 'github' %}.github{% endif %}/.lintstagedrc	
@@ -0,0 +1 @@
+../../generic/{% if git_provider == 'github' %}.github{% endif %}/.lintstagedrc
\ No newline at end of file
diff --git a/ansible/{% if git_provider == 'github' %}.github{% endif %}/.mkdocsrc.jinja b/ansible/{% if git_provider == 'github' %}.github{% endif %}/.mkdocsrc.jinja
new file mode 120000
index 0000000..580092f
--- /dev/null
+++ b/ansible/{% if git_provider == 'github' %}.github{% endif %}/.mkdocsrc.jinja	
@@ -0,0 +1 @@
+../../generic/{% if git_provider == 'github' %}.github{% endif %}/.mkdocsrc.jinja
\ No newline at end of file
diff --git a/ansible/{% if git_provider == 'github' %}.github{% endif %}/.precommitrc b/ansible/{% if git_provider == 'github' %}.github{% endif %}/.precommitrc
new file mode 120000
index 0000000..60946f1
--- /dev/null
+++ b/ansible/{% if git_provider == 'github' %}.github{% endif %}/.precommitrc	
@@ -0,0 +1 @@
+../../generic/{% if git_provider == 'github' %}.github{% endif %}/.precommitrc
\ No newline at end of file
diff --git a/ansible/{% if git_provider == 'github' %}.github{% endif %}/.prettierrc b/ansible/{% if git_provider == 'github' %}.github{% endif %}/.prettierrc
new file mode 120000
index 0000000..1ae0676
--- /dev/null
+++ b/ansible/{% if git_provider == 'github' %}.github{% endif %}/.prettierrc	
@@ -0,0 +1 @@
+../../generic/{% if git_provider == 'github' %}.github{% endif %}/.prettierrc
\ No newline at end of file
diff --git a/ansible/{% if git_provider == 'github' %}.github{% endif %}/renovate.json.jinja b/ansible/{% if git_provider == 'github' %}.github{% endif %}/renovate.json.jinja
new file mode 120000
index 0000000..1218147
--- /dev/null
+++ b/ansible/{% if git_provider == 'github' %}.github{% endif %}/renovate.json.jinja	
@@ -0,0 +1 @@
+../../generic/{% if git_provider == 'github' %}.github{% endif %}/renovate.json.jinja
\ No newline at end of file
diff --git a/ansible/{% if git_provider == 'github' %}.github{% endif %}/workflows/devcontainer-build-and-push.yaml.jinja b/ansible/{% if git_provider == 'github' %}.github{% endif %}/workflows/devcontainer-build-and-push.yaml.jinja
new file mode 120000
index 0000000..feeb526
--- /dev/null
+++ b/ansible/{% if git_provider == 'github' %}.github{% endif %}/workflows/devcontainer-build-and-push.yaml.jinja	
@@ -0,0 +1 @@
+../../../generic/{% if git_provider == 'github' %}.github{% endif %}/workflows/devcontainer-build-and-push.yaml.jinja
\ No newline at end of file
diff --git a/ansible/{% if git_provider == 'github' %}.github{% endif %}/workflows/release-please.yaml.jinja b/ansible/{% if git_provider == 'github' %}.github{% endif %}/workflows/release-please.yaml.jinja
new file mode 120000
index 0000000..947e851
--- /dev/null
+++ b/ansible/{% if git_provider == 'github' %}.github{% endif %}/workflows/release-please.yaml.jinja	
@@ -0,0 +1 @@
+../../../generic/{% if git_provider == 'github' %}.github{% endif %}/workflows/release-please.yaml.jinja
\ No newline at end of file
diff --git a/ansible/{% if git_provider == 'github' %}.github{% endif %}/workflows/renovate.yaml.jinja b/ansible/{% if git_provider == 'github' %}.github{% endif %}/workflows/renovate.yaml.jinja
new file mode 120000
index 0000000..3f977d6
--- /dev/null
+++ b/ansible/{% if git_provider == 'github' %}.github{% endif %}/workflows/renovate.yaml.jinja	
@@ -0,0 +1 @@
+../../../generic/{% if git_provider == 'github' %}.github{% endif %}/workflows/renovate.yaml.jinja
\ No newline at end of file
diff --git a/copier.yaml b/copier.yaml
index 4de690c..854dc15 100644
--- a/copier.yaml
+++ b/copier.yaml
@@ -6,6 +6,7 @@ project_type:
   type: str
   help: Which type of project to copy?
   choices:
+    Ansible: ansible
     Generic: generic
   default: generic
 custom_devcontainer_features: