diff --git a/roles/kubernetes/preinstall/defaults/main.yml b/roles/kubernetes/preinstall/defaults/main.yml
index 5537b52b870e1f4907e5298523cefb446f4faeb4..aad2f3394ddb6bf7ce34159774936883fb3c98d1 100644
--- a/roles/kubernetes/preinstall/defaults/main.yml
+++ b/roles/kubernetes/preinstall/defaults/main.yml
@@ -38,6 +38,8 @@ resolveconf_cloud_init_conf: /etc/resolveconf_cloud_init.conf
 populate_inventory_to_hosts_file: true
 # K8S Api FQDN will be written into /etc/hosts file.
 populate_loadbalancer_apiserver_to_hosts_file: true
+# etc_hosts_localhost_entries will be written into /etc/hosts file.
+populate_localhost_entries_to_hosts_file: true
 
 sysctl_file_path: "/etc/sysctl.d/99-sysctl.conf"
 
diff --git a/roles/kubernetes/preinstall/tasks/0090-etchosts.yml b/roles/kubernetes/preinstall/tasks/0090-etchosts.yml
index ae4ffadd621b6e1b1d73894f140fdf196c159fb6..ed5ce291fbdecae0c3b6b617f3cd0749b256ab56 100644
--- a/roles/kubernetes/preinstall/tasks/0090-etchosts.yml
+++ b/roles/kubernetes/preinstall/tasks/0090-etchosts.yml
@@ -1,29 +1,31 @@
 ---
-- name: Hosts | create list from inventory
-  set_fact:
-    etc_hosts_inventory_block: |-
-      {% for item in (groups['k8s_cluster'] + groups['etcd']|default([]) + groups['calico_rr']|default([]))|unique -%}
-      {% if 'access_ip' in hostvars[item] or 'ip' in hostvars[item] or 'ansible_default_ipv4' in hostvars[item] -%}
-      {{ hostvars[item]['access_ip'] | default(hostvars[item]['ip'] | default(hostvars[item]['ansible_default_ipv4']['address'])) }}
-      {%- if ('ansible_hostname' in hostvars[item] and item != hostvars[item]['ansible_hostname']) %} {{ hostvars[item]['ansible_hostname'] }}.{{ dns_domain }} {{ hostvars[item]['ansible_hostname'] }} {% else %} {{ item }}.{{ dns_domain }} {{ item }} {% endif %}
+- name: Hosts | update inventory in hosts file
+  block:
+    - name: Hosts | create list from inventory
+      set_fact:
+        etc_hosts_inventory_block: |-
+          {% for item in (groups['k8s_cluster'] + groups['etcd']|default([]) + groups['calico_rr']|default([]))|unique -%}
+          {% if 'access_ip' in hostvars[item] or 'ip' in hostvars[item] or 'ansible_default_ipv4' in hostvars[item] -%}
+          {{ hostvars[item]['access_ip'] | default(hostvars[item]['ip'] | default(hostvars[item]['ansible_default_ipv4']['address'])) }}
+          {%- if ('ansible_hostname' in hostvars[item] and item != hostvars[item]['ansible_hostname']) %} {{ hostvars[item]['ansible_hostname'] }}.{{ dns_domain }} {{ hostvars[item]['ansible_hostname'] }} {% else %} {{ item }}.{{ dns_domain }} {{ item }} {% endif %}
 
-      {% endif %}
-      {% endfor %}
-  delegate_to: localhost
-  connection: local
-  delegate_facts: yes
-  run_once: yes
+          {% endif %}
+          {% endfor %}
+      delegate_to: localhost
+      connection: local
+      delegate_facts: yes
+      run_once: yes
 
-- name: Hosts | populate inventory into hosts file
-  blockinfile:
-    path: /etc/hosts
-    block: "{{ hostvars.localhost.etc_hosts_inventory_block }}"
-    state: present
-    create: yes
-    backup: yes
-    unsafe_writes: yes
-    marker: "# Ansible inventory hosts {mark}"
-    mode: 0644
+    - name: Hosts | populate inventory into hosts file
+      blockinfile:
+        path: /etc/hosts
+        block: "{{ hostvars.localhost.etc_hosts_inventory_block }}"
+        state: present
+        create: yes
+        backup: yes
+        unsafe_writes: yes
+        marker: "# Ansible inventory hosts {mark}"
+        mode: 0644
   when: populate_inventory_to_hosts_file
 
 - name: Hosts | populate kubernetes loadbalancer address into hosts file
@@ -39,39 +41,44 @@
     - loadbalancer_apiserver is defined
     - loadbalancer_apiserver.address is defined
 
-- name: Hosts | Retrieve hosts file content
-  slurp:
-    src: /etc/hosts
-  register: etc_hosts_content
+- name: Hosts | Update localhost entries in hosts file
+  block:
+    - 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:
-    etc_hosts_localhosts_dict: >-
-      {%- set splitted = (item | regex_replace('[ \t]+', ' ')|regex_replace('#.*$')|trim).split( ' ') -%}
-      {{ etc_hosts_localhosts_dict|default({}) | combine({splitted[0]: splitted[1::] }) }}
-  with_items: "{{ (etc_hosts_content['content'] | b64decode).splitlines() }}"
-  when:
-    - etc_hosts_content.content is defined
-    - (item is match('^::1 .*') or item is match('^127.0.0.1 .*'))
+    - name: Hosts | Extract existing entries for localhost from hosts file
+      set_fact:
+        etc_hosts_localhosts_dict: >-
+          {%- set splitted = (item | regex_replace('[ \t]+', ' ')|regex_replace('#.*$')|trim).split( ' ') -%}
+          {{ etc_hosts_localhosts_dict|default({}) | combine({splitted[0]: splitted[1::] }) }}
+      with_items: "{{ (etc_hosts_content['content'] | b64decode).splitlines() }}"
+      when:
+        - etc_hosts_content.content is defined
+        - (item is match('^::1 .*') or item is match('^127.0.0.1 .*'))
 
-- name: Hosts | Update target hosts file entries dict with required entries
-  set_fact:
-    etc_hosts_localhosts_dict_target: >-
-      {%- set target_entries = (etc_hosts_localhosts_dict|default({})).get(item.key, []) | difference(item.value.get('unexpected' ,[])) -%}
-      {{ etc_hosts_localhosts_dict_target|default({}) | combine({item.key: (target_entries + item.value.expected)|unique}) }}
-  loop: "{{ etc_hosts_localhost_entries|dict2items }}"
+    - name: Hosts | Update target hosts file entries dict with required entries
+      set_fact:
+        etc_hosts_localhosts_dict_target: >-
+          {%- set target_entries = (etc_hosts_localhosts_dict|default({})).get(item.key, []) | difference(item.value.get('unexpected' ,[])) -%}
+          {{ etc_hosts_localhosts_dict_target|default({}) | combine({item.key: (target_entries + item.value.expected)|unique}) }}
+      loop: "{{ etc_hosts_localhost_entries|dict2items }}"
 
-- name: Hosts | Update (if necessary) hosts file
-  lineinfile:
-    dest: /etc/hosts
-    line: "{{ item.key }} {{ item.value|join(' ') }}"
-    regexp: "^{{ item.key }}.*$"
-    state: present
-    backup: yes
-    unsafe_writes: yes
-  loop: "{{ etc_hosts_localhosts_dict_target|default({})|dict2items }}"
+    - name: Hosts | Update (if necessary) hosts file
+      lineinfile:
+        dest: /etc/hosts
+        line: "{{ item.key }} {{ item.value|join(' ') }}"
+        regexp: "^{{ item.key }}.*$"
+        state: present
+        backup: yes
+        unsafe_writes: yes
+      loop: "{{ etc_hosts_localhosts_dict_target|default({})|dict2items }}"
+  when: populate_localhost_entries_to_hosts_file
 
 # gather facts to update ansible_fqdn
 - name: Update facts
   setup:
     gather_subset: min
+  when:
+    - not dns_late
diff --git a/roles/kubernetes/preinstall/tasks/main.yml b/roles/kubernetes/preinstall/tasks/main.yml
index 45fa3d14823bfe2a1d70517dea53cd98cb4a7db9..51c0352b8e9af8493b35d96e706a98b50f44b59c 100644
--- a/roles/kubernetes/preinstall/tasks/main.yml
+++ b/roles/kubernetes/preinstall/tasks/main.yml
@@ -74,8 +74,6 @@
     - bootstrap-os
 
 - import_tasks: 0090-etchosts.yml
-  when:
-    - not dns_late
   tags:
     - bootstrap-os
     - etchosts