diff --git a/ansible/roles/hsExprTest/defaults/main.yml b/ansible/roles/hsExprTest/defaults/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9b1832805a3ff2c5baedc39e7f45caa8a58a394b
--- /dev/null
+++ b/ansible/roles/hsExprTest/defaults/main.yml
@@ -0,0 +1,2 @@
+---
+cabal_bin: "cabal"
diff --git a/ansible/roles/hsExprTest/tasks/install.yml b/ansible/roles/hsExprTest/tasks/install.yml
new file mode 100644
index 0000000000000000000000000000000000000000..995c3f11fafdfd8aa56d37c940b9353afc8a8e78
--- /dev/null
+++ b/ansible/roles/hsExprTest/tasks/install.yml
@@ -0,0 +1,40 @@
+---
+- block:
+    - name: "Cabal update"
+      command: "{{cabal_bin}} v2-update --with-ghc=ghc-{{ghc_version}}"
+
+    - name: Remove stale GHC environments
+      file:
+        path: "/tmp/env.{{config.user}}"
+        state: absent
+
+    - name: Hackage modules
+      command: "{{cabal_bin}} v2-install --with-ghc=ghc-{{ghc_version}} --lib --package-env=/tmp/env.{{config.user}} {{item}}"
+      loop: "{{pkgs}}"
+
+    - name: Hackage extra modules
+      command: "{{cabal_bin}} v2-install --with-ghc=ghc-{{ghc_version}} --lib --package-env=/tmp/env.{{config.user}} {{item}}"
+
+      loop: "{{config.extra_pkgs}}"
+      when: config.extra_pkgs is defined
+
+    - name: hsExprTest checkout
+      git:
+        dest: '~/hsExprTest'
+        repo: https://github.com/vlstill/hsExprTest.git
+        update: true
+
+    - name: Install hsExprTest
+      command:
+        chdir: '~/hsExprTest'
+        cmd: "{{cabal_bin}} v2-install --with-ghc=ghc-{{ghc_version}} --lib --package-env=/tmp/env.{{config.user}}"
+
+    - name: Create GHC environment dir
+      file:
+        state: directory
+        path: "~/.local/share/ghc/x86_64-linux-{{ghc_version}}/environments"
+
+    - name: Deploy modified GHC environment
+      command: "mv /tmp/env.{{config.user}} ~/.local/share/ghc/x86_64-linux-{{ghc_version}}/environments/default"
+  become: true
+  become_user: "{{config.user}}"
diff --git a/ansible/roles/hsExprTest/tasks/main.yml b/ansible/roles/hsExprTest/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..922b29d4fd38495099b8e671c330ef6d1a89acf3
--- /dev/null
+++ b/ansible/roles/hsExprTest/tasks/main.yml
@@ -0,0 +1,5 @@
+---
+- include_tasks: install.yml
+  loop: "{{configs}}"
+  loop_control:
+    loop_var: config