diff --git a/common/services.yaml b/common/services.yaml
index 19c60774ae..0aa78c9566 100644
--- a/common/services.yaml
+++ b/common/services.yaml
@@ -365,7 +365,10 @@ outputs:
       monitoring_subscriptions: {get_attr: [MonitoringSubscriptionsConfig, value]}
       logging_sources: {get_attr: [LoggingSourcesConfig, value]}
       logging_groups: {get_attr: [LoggingGroupsConfig, value]}
-      config_settings: {map_merge: {get_attr: [ServiceChain, role_data, config_settings]}}
+      config_settings:
+        yaql:
+          expression: $.data.where($ != null).reduce($1.mergeWith($2), {})
+          data: {get_attr: [ServiceChain, role_data, config_settings]}
       global_config_settings: {get_attr: [GlobalConfigSettings, value]}
       service_config_settings: {get_attr: [ServiceConfigSettings, value]}
       workflow_tasks: {get_attr: [WorkflowTasks, value]}
diff --git a/releasenotes/notes/merge_keys_from_services-cd17425d58b49840.yaml b/releasenotes/notes/merge_keys_from_services-cd17425d58b49840.yaml
new file mode 100644
index 0000000000..6701dabd8c
--- /dev/null
+++ b/releasenotes/notes/merge_keys_from_services-cd17425d58b49840.yaml
@@ -0,0 +1,21 @@
+---
+features:
+  - |
+    It is now possible to specify values for any key in `config_settings`
+    from multiple services; multiple values will be merged using YAQL
+    mergeWith() function. For example, assuming two services defining
+    a key as follows:
+
+      config_settings:
+        mykey:
+        - val1
+
+      config_settings:
+        mykey:
+        - val2
+        - val3
+
+    the content of the key, as seen by ansible or puppet on the nodes,
+    will be:
+
+      mykey: ['val1','val2','val3']