diff --git a/roles/kubernetes/preinstall/defaults/main.yml b/roles/kubernetes/preinstall/defaults/main.yml
index e215875179ae5331460a6c686c70cf50db1c467d..5118ec59337e8117a6538505d5f3510c9c928597 100644
--- a/roles/kubernetes/preinstall/defaults/main.yml
+++ b/roles/kubernetes/preinstall/defaults/main.yml
@@ -33,3 +33,8 @@ populate_inventory_to_hosts_file: true
 preinstall_selinux_state: permissive
 
 sysctl_file_path: "/etc/sysctl.d/99-sysctl.conf"
+
+etc_hosts_filter:
+  ::1:
+    - localhost
+    - localhost.localdomain
diff --git a/roles/kubernetes/preinstall/tasks/etchosts.yml b/roles/kubernetes/preinstall/tasks/etchosts.yml
index 80456f3547e0cd1a5f149c7a160b7d56450fdcbb..99a7b0127f830199c1d17b0136d965699fa7762e 100644
--- a/roles/kubernetes/preinstall/tasks/etchosts.yml
+++ b/roles/kubernetes/preinstall/tasks/etchosts.yml
@@ -22,18 +22,51 @@
     - loadbalancer_apiserver is defined
     - loadbalancer_apiserver.address is defined
 
-- name: Hosts | localhost ipv4 in hosts file
-  lineinfile:
-    dest: /etc/hosts
-    line: "127.0.0.1 localhost localhost.localdomain"
-    regexp: '^127.0.0.1.*$'
-    state: present
-    backup: yes
+- name: Hosts | Retrieve hosts file content
+  slurp:
+    src: /etc/hosts
+  register: etc_hosts_content
+
+- name: Hosts | Extract existing entries for localhost from hosts file
+  set_fact:
+    entry: "{{ item | regex_replace('[ ]+', ' ')|regex_replace('#.+$')|trim }}"
+  with_items: "{{ (etc_hosts_content['content'] | b64decode).split('\n') }}"
+  register: etc_hosts_localhosts
+  when:
+    - etc_hosts_content.content is defined
+    - (item|match('^::1 .*') or item|match('^127.0.0.1 .*'))
+
+- name: Hosts | Convert extract entries for localhost as dict
+  set_fact:
+    etc_hosts_localhosts_dict: >-
+      {% set splitted = item.split(' ') %}{{ etc_hosts_localhosts_dict|default({}) | combine({splitted[0]: splitted[1::] }) }}
+  with_items: "{{ etc_hosts_localhosts.results | selectattr('ansible_facts', 'defined') | map(attribute='ansible_facts.entry') | list }}"
+
+- name: Hosts | Initiate target hosts file entries dict and filter unwanted values
+  set_fact:
+    etc_hosts_localhosts_dict_target: >-
+      {%- set target_entries = [] -%}
+      {%- for entry in item.value -%}
+      {%- if entry not in etc_hosts_filter.get(item.key,[]) -%}
+      {%- set DO = target_entries.append(entry) -%}
+      {%- endif -%}
+      {%- endfor -%}
+      {{ etc_hosts_localhosts_dict_target|default({}) | combine({item.key: target_entries}) }}
+  with_dict: "{{etc_hosts_localhosts_dict}}"
+
+- name: Hosts | Update target hosts file entries dict with required entries
+  set_fact:
+    etc_hosts_localhosts_dict_target: >-
+      {{ etc_hosts_localhosts_dict_target|default({}) | combine({item.ip: (etc_hosts_localhosts_dict_target[item.ip]|default([]) + item.entries)|unique}) }}
+  with_items:
+    - {ip: '127.0.0.1', entries: ['localhost', 'localhost.localdomain']}
+    - {ip: '::1', entries: ['localhost6', 'localhost6.localdomain']}
 
-- name: Hosts | localhost ipv6 in hosts file
+- name: Hosts | Update (if necessary) hosts file
   lineinfile:
     dest: /etc/hosts
-    line: "::1 localhost6 localhost6.localdomain"
-    regexp: '^::1.*$'
+    line: "{{ item.key }} {{ item.value|join(' ') }}"
+    regexp: "^{{ item.key }}.*$"
     state: present
     backup: yes
+  with_dict: "{{ etc_hosts_localhosts_dict_target }}"