diff --git a/lib/utils/nodesetup.py b/lib/utils/nodesetup.py
index 80e2b98070ba34a0c39708e706a139443d4a3190..13b70f3c78c3195c8d4c59a12e7d097eba3c1875 100644
--- a/lib/utils/nodesetup.py
+++ b/lib/utils/nodesetup.py
@@ -23,6 +23,7 @@
 """
 
 import os
+from cStringIO import StringIO
 
 from ganeti import constants
 
@@ -46,26 +47,19 @@ def SetEtcHostsEntry(file_name, ip, hostname, aliases):
   # Ensure aliases are unique
   aliases = algo.UniqueSequence([hostname] + aliases)[1:]
 
-  def _WriteEtcHosts(fd):
-    # Duplicating file descriptor because os.fdopen's result will automatically
-    # close the descriptor, but we would still like to have its functionality.
-    out = os.fdopen(os.dup(fd), "w")
-    try:
-      for line in io.ReadFile(file_name).splitlines(True):
-        fields = line.split()
-        if fields and not fields[0].startswith("#") and ip == fields[0]:
-          continue
-        out.write(line)
+  out = StringIO()
+  for line in io.ReadFile(file_name).splitlines(True):
+    fields = line.split()
+    if fields and not fields[0].startswith("#") and ip == fields[0]:
+      continue
+    out.write(line)
 
-      out.write("%s\t%s" % (ip, hostname))
-      if aliases:
-        out.write(" %s" % " ".join(aliases))
-      out.write("\n")
-      out.flush()
-    finally:
-      out.close()
+  out.write("%s\t%s" % (ip, hostname))
+  if aliases:
+    out.write(" %s" % " ".join(aliases))
+  out.write("\n")
 
-  io.WriteFile(file_name, fn=_WriteEtcHosts, mode=0644)
+  io.WriteFile(file_name, data=out.getvalue(), mode=0644)
 
 
 def AddHostToEtcHosts(hostname, ip):
@@ -92,29 +86,22 @@ def RemoveEtcHostsEntry(file_name, hostname):
   @param hostname: the hostname to be removed
 
   """
-  def _WriteEtcHosts(fd):
-    # Duplicating file descriptor because os.fdopen's result will automatically
-    # close the descriptor, but we would still like to have its functionality.
-    out = os.fdopen(os.dup(fd), "w")
-    try:
-      for line in io.ReadFile(file_name).splitlines(True):
-        fields = line.split()
-        if len(fields) > 1 and not fields[0].startswith("#"):
-          names = fields[1:]
-          if hostname in names:
-            while hostname in names:
-              names.remove(hostname)
-            if names:
-              out.write("%s %s\n" % (fields[0], " ".join(names)))
-            continue
-
-        out.write(line)
-
-      out.flush()
-    finally:
-      out.close()
-
-  io.WriteFile(file_name, fn=_WriteEtcHosts, mode=0644)
+  out = StringIO()
+
+  for line in io.ReadFile(file_name).splitlines(True):
+    fields = line.split()
+    if len(fields) > 1 and not fields[0].startswith("#"):
+      names = fields[1:]
+      if hostname in names:
+        while hostname in names:
+          names.remove(hostname)
+        if names:
+          out.write("%s %s\n" % (fields[0], " ".join(names)))
+        continue
+
+    out.write(line)
+
+  io.WriteFile(file_name, data=out.getvalue(), mode=0644)
 
 
 def RemoveHostFromEtcHosts(hostname):