diff --git a/roles/ceph-rbd/defaults/main.yml b/roles/ceph-rbd/defaults/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d40a33d286773c6be1b1af2b23cfff8874272ab2
--- /dev/null
+++ b/roles/ceph-rbd/defaults/main.yml
@@ -0,0 +1,18 @@
+---
+
+ceph_packages:
+  - ceph-common
+
+ceph_mon_hosts: []
+ceph_login:
+ceph_password:
+ceph_pool_name:
+ceph_image_name:
+ceph_image_format: 2
+ceph_image_size: 2T
+ceph_parameters:
+  - "--size {{ ceph_image_size }}"
+  - "--image-format {{ ceph_image_format }}"
+  - "--image-feature layering"
+
+...
diff --git a/roles/ceph-rbd/handlers/main.yml b/roles/ceph-rbd/handlers/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..8d14e8ae2bc5be9e612b68137728fca38cca2733
--- /dev/null
+++ b/roles/ceph-rbd/handlers/main.yml
@@ -0,0 +1,8 @@
+---
+
+- name: enable rbdmap service
+  systemd:
+    name: rbdmap
+    state: restarted
+
+...
diff --git a/roles/ceph-rbd/tasks/main.yml b/roles/ceph-rbd/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..08498e83e13a8e53188d405b8442197d1ef1127a
--- /dev/null
+++ b/roles/ceph-rbd/tasks/main.yml
@@ -0,0 +1,52 @@
+---
+
+- name: install ceph
+  apt:
+    force_apt_get: true
+    install_recommends: false
+    name: "{{ ceph_packages }}"
+
+- name: ceph config
+  template:
+    src: ceph.conf.j2
+    dest: /etc/ceph/ceph.conf
+
+- name: ceph keyring
+  template:
+    src: ceph.client.user.keyring.j2
+    dest: /etc/ceph/ceph.client.{{ ceph_login }}.keyring
+    mode: 0600
+
+- name: check rbd image presence
+  when: inventory_hostname == play_hosts[0]
+  register: ceph_check_image
+  changed_when: ceph_check_image.stdout != ceph_image_name
+  command:
+    cmd: rbd -n client.{{ ceph_login }} list {{ ceph_pool_name }}
+
+- name: create rbd image
+  when:
+    - ceph_check_image.changed
+    - inventory_hostname == play_hosts[0]
+  command:
+    cmd: rbd -n client.{{ ceph_login }} create {{ ceph_pool_name }}/{{ ceph_image_name }} {% for param in ceph_parameters %}{{ param }} {% endfor %}
+
+- name: map rbd image to device
+  command:
+    cmd: rbd -n client.{{ ceph_login }} map {{ ceph_pool_name }}/{{ ceph_image_name }}
+    creates: /dev/rbd0
+
+- name: configure rbd map at boot
+  notify: restart rbdmap
+  lineinfile:
+    path: /etc/ceph/rbdmap
+    backup: true
+    line: "{{ ceph_pool_name }}/{{ ceph_image_name }} id={{ ceph_login }},keyring=/etc/ceph/ceph.client.{{ ceph_login }}.keyring"
+
+- name: enable rbdmap service
+  systemd:
+    name: rbdmap
+    enabled: true
+    state: started
+
+...
diff --git a/roles/ceph-rbd/templates/ceph.client.user.keyring.j2 b/roles/ceph-rbd/templates/ceph.client.user.keyring.j2
new file mode 100644
index 0000000000000000000000000000000000000000..b46c78a193f7e8a533b819c4a42a77e4df52eb9b
--- /dev/null
+++ b/roles/ceph-rbd/templates/ceph.client.user.keyring.j2
@@ -0,0 +1,2 @@
+[client.{{ ceph_login }}]
+key = {{ ceph_password }}
diff --git a/roles/ceph-rbd/templates/ceph.conf.j2 b/roles/ceph-rbd/templates/ceph.conf.j2
new file mode 100644
index 0000000000000000000000000000000000000000..998af5810b542d44aa6e65d84355b86f40ab1be2
--- /dev/null
+++ b/roles/ceph-rbd/templates/ceph.conf.j2
@@ -0,0 +1,2 @@
+[global]
+mon_host = {{ ceph_mon_hosts | join(',') }}
diff --git a/roles/ocfs2/defaults/main.yml b/roles/ocfs2/defaults/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..961ab9302baf563b60de1aeb27a8deb19b90ce3c
--- /dev/null
+++ b/roles/ocfs2/defaults/main.yml
@@ -0,0 +1,21 @@
+---
+
+ocfs2_packages:
+  - ocfs2-tools
+
+ocfs2_mount_path:
+ocfs2_mount_device:
+
+ocfs2_firewall_enabled: true
+ocfs2_ferm_rules_filename: ocfs2
+ocfs2_ferm_input_rules:
+  - saddr: "{{ play_hosts | map('extract', hostvars, ['ansible_default_ipv4', 'address']) | list }}"
+    proto:
+      - tcp
+      - udp
+    dport:
+      - 7777
+ocfs2_ferm_output_rules: []
+ocfs2_ferm_global_settings:
+
+...
diff --git a/roles/ocfs2/handlers/main.yml b/roles/ocfs2/handlers/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f8a7e91519c9596a864f725ef90151ef1ce8bbd1
--- /dev/null
+++ b/roles/ocfs2/handlers/main.yml
@@ -0,0 +1,8 @@
+---
+
+- name: restart o2cb
+  systemd:
+    name: o2cb
+    state: restarted
+
+...
diff --git a/roles/ocfs2/tasks/main.yml b/roles/ocfs2/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..844a1b07e83a2fb5ef906dd6b853d2e36d3667d7
--- /dev/null
+++ b/roles/ocfs2/tasks/main.yml
@@ -0,0 +1,53 @@
+---
+
+- name: install packages
+  apt:
+    force_apt_get: true
+    install_recommends: false
+    name: "{{ ocfs2_packages }}"
+
+- name: configure cluster
+  notify: restart o2cb
+  template:
+    src: cluster.conf.j2
+    dest: /etc/ocfs2/cluster.conf
+
+- name: load at boot
+  notify: restart o2cb
+  replace:
+    path: /etc/default/o2cb
+    regexp: '^O2CB_ENABLED=.*$'
+    replace: 'O2CB_ENABLED=true'
+    backup: true
+
+- meta: flush_handlers
+
+- name: format mapped device
+  when: inventory_hostname == play_hosts[0]
+  filesystem:
+    fstype: ocfs2
+    opts: -T mail
+    dev: /dev/rbd0
+
+- name: mount mapped device
+  mount:
+    path: "{{ ocfs2_mount_path }}"
+    src: "{{ ocfs2_mount_device }}"
+    fstype: ocfs2
+    opts: _netdev,nointr,noatime
+    backup: true
+    state: mounted
+
+# FIREWALL
+
+- name: firewall
+  when: ocfs2_firewall_enabled
+  vars:
+    ferm_rules_filename: "{{ ocfs2_ferm_rules_filename }}"
+    ferm_input_rules: "{{ ocfs2_ferm_input_rules }}"
+    ferm_output_rules: "{{ ocfs2_ferm_output_rules }}"
+    ferm_global_settings: "{{ ocfs2_ferm_global_settings }}"
+  include_role:
+    name: ferm
+
+...
diff --git a/roles/ocfs2/templates/cluster.conf.j2 b/roles/ocfs2/templates/cluster.conf.j2
new file mode 100644
index 0000000000000000000000000000000000000000..6fdcaab80a38c458e1c7ac0690df349410eab382
--- /dev/null
+++ b/roles/ocfs2/templates/cluster.conf.j2
@@ -0,0 +1,11 @@
+cluster:
+  node_count = {{ play_hosts | length }}
+  name = ocfs2
+{% for host in play_hosts %}
+node:
+  ip_port = 7777
+  ip_address = {{ hostvars[host]['ansible_default_ipv4']['address'] }}
+  number = {{ loop.index }}
+  name = {{ host }}
+  cluster = ocfs2
+{% endfor %}