diff --git a/ansible/roles/cheaha.node/tasks/main.yml b/ansible/roles/cheaha.node/tasks/main.yml
index 37ecd8768aab0c98f9377ac4ae95fc1dbebafb6b..a308992a037b7f8523d0ae6af22baf85d190f767 100644
--- a/ansible/roles/cheaha.node/tasks/main.yml
+++ b/ansible/roles/cheaha.node/tasks/main.yml
@@ -146,3 +146,6 @@
 - name: Set timezone to America/Chicago
   community.general.timezone:
     name: America/Chicago
+
+- name: Install zsh
+  import_tasks: zsh.yml
diff --git a/ansible/roles/cheaha.node/tasks/zsh.yml b/ansible/roles/cheaha.node/tasks/zsh.yml
new file mode 100644
index 0000000000000000000000000000000000000000..bd8c3a06a750cedc667c1f41c036d3ba865b8d61
--- /dev/null
+++ b/ansible/roles/cheaha.node/tasks/zsh.yml
@@ -0,0 +1,41 @@
+---
+- name: Install zsh pre-requisites
+  yum:
+    name:
+      - gcc
+      - ncurses-devel
+
+- name: Download and untar zsh
+  ansible.builtin.unarchive:
+    src: "{{ zsh_src_url }}"
+    dest: /tmp
+    remote_src: true
+    validate_certs: no
+
+- name: Configure zsh
+  ansible.builtin.command: ./configure --with-tcsetpgrp
+  args:
+    chdir: "/tmp/zsh-{{ zsh_ver }}"
+  become: true
+
+- name: Make zsh
+  ansible.builtin.command: make
+  args:
+    chdir: "/tmp/zsh-{{ zsh_ver }}"
+  become: true
+
+- name: Install zsh
+  ansible.builtin.command: make install
+  args:
+    chdir: "/tmp/zsh-{{ zsh_ver }}"
+  become: true
+
+- name: Add zsh into /etc/shells
+  ansible.builtin.lineinfile:
+    path: /etc/shells
+    line: /usr/local/bin/zsh
+    state: present
+    owner: root
+    group: root
+    mode: '0644'
+  become: true
diff --git a/ansible/roles/cheaha.node/vars/main.yml b/ansible/roles/cheaha.node/vars/main.yml
index d6c81c2de668d9e1811f655138f608c29acc4997..801effeb45e69f2064ea316f4d69d7c1ba9b4794 100644
--- a/ansible/roles/cheaha.node/vars/main.yml
+++ b/ansible/roles/cheaha.node/vars/main.yml
@@ -1,2 +1,4 @@
 ---
 # vars file for cheaha.node
+  zsh_ver: 5.7.1
+  zsh_src_url: "https://www.zsh.org/pub/old/zsh-{{ zsh_ver }}.tar.xz"