diff --git a/manifests/keystone/auth.pp b/manifests/keystone/auth.pp
index fda271ab..19d2c5cf 100644
--- a/manifests/keystone/auth.pp
+++ b/manifests/keystone/auth.pp
@@ -79,6 +79,22 @@
 #   (Optional) List of roles assigned to Cinder v3 user
 #   Defaults to ['admin']
 #
+# [*system_scope*]
+#   (Optional) Scope for system operations used by Cinder v3 user.
+#   Defaults to 'all'
+#
+# [*system_scope_v3*]
+#   (Optional) Scope for system operations used by Cinder v3 user.
+#   Defaults to 'all'
+#
+# [*system_roles*]
+#   (Optional) List of system roles assigned to Cinder user.
+#   Defaults to []
+#
+# [*system_roles_v3*]
+#   (Optional) List of system roles assigned to Cinder v3 user.
+#   Defaults to []
+#
 # [*public_url_v3*]
 #   (0ptional) The v3 endpoint's public url.
 #   This url should *not* contain any trailing '/'.
@@ -111,6 +127,10 @@ class cinder::keystone::auth (
   $tenant_user_v3         = 'services',
   $roles                  = ['admin'],
   $roles_v3               = ['admin'],
+  $system_scope           = 'all',
+  $system_scope_v3        = 'all',
+  $system_roles           = [],
+  $system_roles_v3        = [],
   $email                  = 'cinder@localhost',
   $email_user_v3          = 'cinderv3@localhost',
   $public_url_v3          = 'http://127.0.0.1:8776/v3/%(tenant_id)s',
@@ -129,6 +149,9 @@ class cinder::keystone::auth (
 
   include cinder::deps
 
+  Keystone_user_role<| name == "${auth_name}@${tenant}" |> -> Anchor['cinder::service::end']
+  Keystone_user_role<| name == "${auth_name}@::::${system_scope}" |> -> Anchor['cinder::service::end']
+
   if $configure_endpoint_v3 {
     Keystone_endpoint["${region}/${service_name_v3}::${service_type_v3}"] -> Anchor['cinder::service::end']
   }
@@ -146,6 +169,8 @@ class cinder::keystone::auth (
     email               => $email,
     tenant              => $tenant,
     roles               => $roles,
+    system_scope        => $system_scope,
+    system_roles        => $system_roles,
   }
 
   keystone::resource::service_identity { 'cinderv3':
@@ -161,13 +186,11 @@ class cinder::keystone::auth (
     email               => $email_user_v3,
     tenant              => $tenant_user_v3,
     roles               => $roles_v3,
+    system_scope        => $system_scope_v3,
+    system_roles        => $system_roles_v3,
     public_url          => $public_url_v3,
     admin_url           => $admin_url_v3,
     internal_url        => $internal_url_v3,
   }
 
-  if $configure_user_role {
-    Keystone_user_role["${auth_name}@${tenant}"] -> Anchor['cinder::service::end']
-  }
-
 }
diff --git a/manifests/keystone/authtoken.pp b/manifests/keystone/authtoken.pp
index ea91ae3b..b36b813b 100644
--- a/manifests/keystone/authtoken.pp
+++ b/manifests/keystone/authtoken.pp
@@ -28,6 +28,10 @@
 #   (Optional) Name of domain for $project_name
 #   Defaults to 'Default'
 #
+# [*system_scope*]
+#   (Optional) Scope for system operations
+#   Defaults to $::os_service_default
+#
 # [*insecure*]
 #  (Optional) If true, explicitly allow TLS without checking server cert
 #  against any certificate authorities.  WARNING: not recommended.  Use with
@@ -203,6 +207,7 @@ class cinder::keystone::authtoken(
   $project_name                   = 'services',
   $user_domain_name               = 'Default',
   $project_domain_name            = 'Default',
+  $system_scope                   = $::os_service_default,
   $insecure                       = $::os_service_default,
   $auth_section                   = $::os_service_default,
   $auth_type                      = 'password',
@@ -256,6 +261,7 @@ class cinder::keystone::authtoken(
       auth_section                   => $auth_section,
       user_domain_name               => $user_domain_name,
       project_domain_name            => $project_domain_name,
+      system_scope                   => $system_scope,
       insecure                       => $insecure,
       cache                          => $cache,
       cafile                         => $cafile,
diff --git a/manifests/keystone/service_user.pp b/manifests/keystone/service_user.pp
index a8d2c279..aadeb9eb 100644
--- a/manifests/keystone/service_user.pp
+++ b/manifests/keystone/service_user.pp
@@ -28,6 +28,10 @@
 #   (Optional) Name of domain for $project_name
 #   Defaults to 'Default'
 #
+# [*system_scope*]
+#   (Optional) Scope for system operations
+#   Defaults to $::os_service_default
+#
 # [*send_service_user_token*]
 #   (Optional) The service uses service token feature when this is set as true
 #   Defaults to 'false'
@@ -70,6 +74,7 @@ class cinder::keystone::service_user(
   $project_name            = 'services',
   $user_domain_name        = 'Default',
   $project_domain_name     = 'Default',
+  $system_scope            = $::os_service_default,
   $send_service_user_token = false,
   $insecure                = $::os_service_default,
   $auth_type               = 'password',
@@ -91,6 +96,7 @@ class cinder::keystone::service_user(
     auth_type               => $auth_type,
     user_domain_name        => $user_domain_name,
     project_domain_name     => $project_domain_name,
+    system_scope            => $system_scope,
     send_service_user_token => $send_service_user_token,
     insecure                => $insecure,
     cafile                  => $cafile,
diff --git a/releasenotes/notes/system_scope-keystone-d9a9cc0c614cd433.yaml b/releasenotes/notes/system_scope-keystone-d9a9cc0c614cd433.yaml
new file mode 100644
index 00000000..dd40cbfd
--- /dev/null
+++ b/releasenotes/notes/system_scope-keystone-d9a9cc0c614cd433.yaml
@@ -0,0 +1,16 @@
+---
+features:
+  - |
+    The ``cinder::keystone::auth`` class now supports the following new
+    parameters to define system-scoped roles.
+
+    - ``system_scope``
+    - ``system_roles``
+    - ``system_scope_v3``
+    - ``system_roles_v3``
+
+  - |
+    The ``system_scope`` parameter has been added to the following classes.
+
+    - ``cinder::keystone::authtoken``
+    - ``cinder::keystone::service_user``
diff --git a/spec/classes/cinder_keystone_auth_spec.rb b/spec/classes/cinder_keystone_auth_spec.rb
index 068b2fcf..b578a553 100644
--- a/spec/classes/cinder_keystone_auth_spec.rb
+++ b/spec/classes/cinder_keystone_auth_spec.rb
@@ -22,6 +22,8 @@ describe 'cinder::keystone::auth' do
         :email               => 'cinder@localhost',
         :tenant              => 'services',
         :roles               => ['admin'],
+        :system_scope        => 'all',
+        :system_roles        => [],
       ) }
 
       it { is_expected.to contain_keystone__resource__service_identity('cinderv3').with(
@@ -36,6 +38,8 @@ describe 'cinder::keystone::auth' do
         :email               => 'cinderv3@localhost',
         :tenant              => 'services',
         :roles               => ['admin'],
+        :system_scope        => 'all',
+        :system_roles        => [],
         :public_url          => 'http://127.0.0.1:8776/v3/%(tenant_id)s',
         :internal_url        => 'http://127.0.0.1:8776/v3/%(tenant_id)s',
         :admin_url           => 'http://127.0.0.1:8776/v3/%(tenant_id)s',
@@ -49,13 +53,17 @@ describe 'cinder::keystone::auth' do
           :email                  => 'alt_cinder@alt_localhost',
           :tenant                 => 'alt_service',
           :roles                  => ['admin', 'service'],
+          :system_scope           => 'alt_all',
+          :system_roles           => ['admin', 'member', 'reader'],
           :configure_user         => false,
           :configure_user_role    => false,
           :password_user_v3       => 'cinderv3_password',
           :auth_name_v3           => 'alt_cinderv3',
           :email_user_v3          => 'alt_cinderv3@alt_localhost',
           :tenant_user_v3         => 'alt_servicev3',
-          :roles_v3               => ['admin', 'service'],
+          :roles_v3               => ['adminv3', 'servicev3'],
+          :system_scope_v3        => 'alt_all_v3',
+          :system_roles_v3        => ['adminv3', 'memberv3', 'readerv3'],
           :configure_user_v3      => true,
           :configure_user_role_v3 => true,
           :service_description_v3 => 'Alternative Cinder Service v3',
@@ -79,6 +87,8 @@ describe 'cinder::keystone::auth' do
         :email               => 'alt_cinder@alt_localhost',
         :tenant              => 'alt_service',
         :roles               => ['admin', 'service'],
+        :system_scope        => 'alt_all',
+        :system_roles        => ['admin', 'member', 'reader'],
       ) }
 
       it { is_expected.to contain_keystone__resource__service_identity('cinderv3').with(
@@ -93,7 +103,9 @@ describe 'cinder::keystone::auth' do
         :password            => 'cinderv3_password',
         :email               => 'alt_cinderv3@alt_localhost',
         :tenant              => 'alt_servicev3',
-        :roles               => ['admin', 'service'],
+        :roles               => ['adminv3', 'servicev3'],
+        :system_scope        => 'alt_all_v3',
+        :system_roles        => ['adminv3', 'memberv3', 'readerv3'],
         :public_url          => 'https://10.10.10.10:80',
         :internal_url        => 'http://10.10.10.11:81',
         :admin_url           => 'http://10.10.10.12:81',
diff --git a/spec/classes/cinder_keystone_authtoken_spec.rb b/spec/classes/cinder_keystone_authtoken_spec.rb
index dc54db66..faeedc08 100644
--- a/spec/classes/cinder_keystone_authtoken_spec.rb
+++ b/spec/classes/cinder_keystone_authtoken_spec.rb
@@ -18,6 +18,7 @@ describe 'cinder::keystone::authtoken' do
           :project_name                   => 'services',
           :user_domain_name               => 'Default',
           :project_domain_name            => 'Default',
+          :system_scope                   => '<SERVICE DEFAULT>',
           :insecure                       => '<SERVICE DEFAULT>',
           :auth_section                   => '<SERVICE DEFAULT>',
           :auth_type                      => 'password',
@@ -62,6 +63,7 @@ describe 'cinder::keystone::authtoken' do
           :project_name                   => 'service_project',
           :user_domain_name               => 'domainX',
           :project_domain_name            => 'domainX',
+          :system_scope                   => 'all',
           :insecure                       => false,
           :auth_section                   => 'new_section',
           :auth_type                      => 'password',
@@ -103,6 +105,7 @@ describe 'cinder::keystone::authtoken' do
           :project_name                   => 'service_project',
           :user_domain_name               => 'domainX',
           :project_domain_name            => 'domainX',
+          :system_scope                   => 'all',
           :insecure                       => false,
           :auth_section                   => 'new_section',
           :auth_type                      => 'password',