diff --git a/roles/etcd/defaults/main.yml b/roles/etcd/defaults/main.yml
index f4f4acff830a994775201264107ff55c40eef7c7..e23f0f6efed37e3a5f97c0bdc0ae93b8f06134da 100644
--- a/roles/etcd/defaults/main.yml
+++ b/roles/etcd/defaults/main.yml
@@ -9,6 +9,8 @@ etcd_events_cluster_enabled: false
 etcd_backup_prefix: "/var/backups"
 etcd_data_dir: "/var/lib/etcd"
 
+# Number of etcd backups to retain. Set to a value < 0 to retain all backups
+etcd_backup_retention_count: -1
 
 etcd_config_dir: /etc/ssl/etcd
 etcd_cert_dir: "{{ etcd_config_dir }}/ssl"
diff --git a/roles/etcd/handlers/backup.yml b/roles/etcd/handlers/backup.yml
index 966da538b55c8b7e75211996f59283418aa24d84..aeaa2b5fb72107b178fa791d3a082f3ece6253d2 100644
--- a/roles/etcd/handlers/backup.yml
+++ b/roles/etcd/handlers/backup.yml
@@ -8,6 +8,7 @@
     - Stat etcd v2 data directory
     - Backup etcd v2 data
     - Backup etcd v3 data
+    - Remove old etcd backups
   when: etcd_cluster_is_healthy.rc == 0
 
 - name: Refresh Time Fact
@@ -57,3 +58,9 @@
   register: etcd_backup_v3_command
   until: etcd_backup_v3_command.rc == 0
   delay: "{{ retry_stagger | random + 3 }}"
+
+- name: Remove old etcd backups
+  shell:
+    chdir: "{{ etcd_backup_prefix }}"
+    cmd: "find . -name 'etcd-*' | head -n -{{ etcd_backup_retention_count }} | xargs rm -rf"
+  when: etcd_backup_retention_count >= 0