:_mod-docs-content-type: CONCEPT [id="service-configurations_{context}"] = Service configurations [role="_abstract"] There is a fundamental difference between the {OpenStackPreviousInstaller} and operator deployments regarding the configuration of the services. In {OpenStackPreviousInstaller} deployments many of the service configurations are abstracted by {OpenStackPreviousInstaller}-specific configuration options. A single {OpenStackPreviousInstaller} option may trigger changes for multiple services and support for drivers, for example, the Block Storage service (cinder), that require patches to the {OpenStackPreviousInstaller} code base. In operator deployments this approach has changed: reduce the installer specific knowledge and leverage {OpenShift} ({OpenShiftShort}) and {rhos_prev_long} ({OpenStackShort}) service specific knowledge whenever possible. To this effect {OpenStackShort} services will have sensible defaults for {OpenShiftShort} deployments and human operators will provide configuration snippets to provide necessary configuration, such as the Block Storage service backend configuration, or to override the defaults. This shortens the distance between a service specific configuration file (such as `cinder.conf`) and what the human operator provides in the manifests. These configuration snippets are passed to the operators in the different `customServiceConfig` sections available in the manifests, and then they are layered in the services available in the following levels. To illustrate this, if you were to set a configuration at the top Block Storage service level (`spec: cinder: template:`) then it would be applied to all the Block Storage services; for example to enable debug in all the Block Storage services you would do: [source,yaml] ---- apiVersion: core.openstack.org/v1beta1 kind: OpenStackControlPlane metadata: name: openstack spec: cinder: template: customServiceConfig: | [DEFAULT] debug = True < . . . > ---- If you only want to set it for one of the Block Storage services, for example the scheduler, then you use the `cinderScheduler` section instead: [source,yaml] ---- apiVersion: core.openstack.org/v1beta1 kind: OpenStackControlPlane metadata: name: openstack spec: cinder: template: cinderScheduler: customServiceConfig: | [DEFAULT] debug = True < . . . > ---- In {OpenShift} it is not recommended to store sensitive information like the credentials to the Block Storage service storage array in the CRs, so most {OpenStackShort} operators have a mechanism to use the {OpenShift} `Secrets` for sensitive configuration parameters of the services and then use them by reference in the `customServiceConfigSecrets` section which is analogous to the `customServiceConfig`. The contents of the `Secret` references passed in the `customServiceConfigSecrets` will have the same format as `customServiceConfig`: a snippet with the section/s and configuration options. When there are sensitive information in the service configuration then it becomes a matter of personal preference whether to store all the configuration in the `Secret` or only the sensitive parts. However, if you split the configuration between `Secret` and `customServiceConfig` you still need the section header (eg: `[DEFAULT]`) to be present in both places. Attention should be paid to each service's adoption process as they may have some particularities regarding their configuration.