diff --git a/lib/ssconf.py b/lib/ssconf.py
index 29db858da4e5cd8968fb21524659fe618dd5d50d..c1f5ce17c970eccdb33d6f49680433a583f824b9 100644
--- a/lib/ssconf.py
+++ b/lib/ssconf.py
@@ -138,6 +138,26 @@ class SimpleStore(object):
       raise errors.ConfigurationError("Can't read ssconf file %s: %s" %
                                       (filename, str(err)))
 
+  def ReadAll(self):
+    """Reads all keys and returns their values.
+
+    @rtype: dict
+    @return: Dictionary, ssconf key as key, value as value
+
+    """
+    result = []
+
+    for key in _VALID_KEYS:
+      try:
+        value = self._ReadFile(key)
+      except errors.ConfigurationError:
+        # Ignore non-existing files
+        pass
+      else:
+        result.append((key, value))
+
+    return dict(result)
+
   def WriteFiles(self, values, dry_run=False):
     """Writes ssconf files used by external scripts.
 
diff --git a/test/ganeti.ssconf_unittest.py b/test/ganeti.ssconf_unittest.py
index eb9273545f3d1fbdb5710e80f1b13839429131e3..201973f23f647232c90d7057207ec8b95acb4af6 100755
--- a/test/ganeti.ssconf_unittest.py
+++ b/test/ganeti.ssconf_unittest.py
@@ -149,6 +149,16 @@ class TestSimpleStore(unittest.TestCase):
                                            default="something.example.com"),
                      "cluster.example.com")
 
+  def testReadAllNoFiles(self):
+    self.assertEqual(self.sstore.ReadAll(), {})
+
+  def testReadAllSingleFile(self):
+    utils.WriteFile(self.sstore.KeyToFilename(constants.SS_CLUSTER_NAME),
+                    data="cluster.example.com")
+    self.assertEqual(self.sstore.ReadAll(), {
+      constants.SS_CLUSTER_NAME: "cluster.example.com",
+      })
+
   def testWriteFiles(self):
     values = {
       constants.SS_CLUSTER_NAME: "cluster.example.com",