diff --git a/tasks/main.yml b/tasks/main.yml
index 8937bd7468235aa2f5299c810eb8b5b6127e36e6..2fd346d021691a05722ce7d1822740ed7327c03d 100644
--- a/tasks/main.yml
+++ b/tasks/main.yml
@@ -9,19 +9,31 @@
         - pelican_gitreceive_output is defined
 
 - name: APT install prerequisites
+  when: ansible_pkg_mgr == 'apt'
   apt:
-      name: python-dev
+      name: [python-dev, libssl-dev, libffi-dev, build-essential]
       state: present
       update_cache: yes
       cache_valid_time: 3600
 
+- name: Create virtualenv directory
+  file:
+      path: /var/lib/pelican-gitreceive
+      owner: git
+      group: git
+      mode: 0o0700
+      state: directory
+
 - name: pip install
+  become: True
+  become_user: git
   with_items:
       - pelican
-      - fabric
+      - Fabric
   pip:
       name: '{{ item }}'
       state: present
+      virtualenv: /var/lib/pelican-gitreceive
 
 - name: Create directory structure
   file:
diff --git a/templates/receiver.sh b/templates/receiver.sh
index a7e9e8fa481958782a90a48d372a5eb3078f6f09..961a809bf059206f8211b94186df64336078898c 100644
--- a/templates/receiver.sh
+++ b/templates/receiver.sh
@@ -4,8 +4,10 @@ echo Recieving blog...
 tempdir="$(mktemp -d)"
 cd $tempdir
 tar -xf -
-echo Fetching Git submodules
+echo Fetching Git submodules...
 git submodule update --init --recursive
+echo Activating virtualenv...
+. /var/lib/pelican-gitreceive/bin/activate
 echo Building blog...
 fab  build
 echo Syncing blog...