Configuration confusion = Friday Filosofical Finking

Cameron Simpson cs at cskk.id.au
Fri May 3 19:19:14 EDT 2019


On 04May2019 09:02, DL Neil <PythonList at DancesWithMice.info> wrote:
>When configuring an application, which mechanisms do you [not] use for 
>setting particular operating-parameters, and/or do you *only* utilise 
>a particular method to initialise certain categories of 
>configuration-data?
[...]

I don't conventions with have complete coverage of your list, but:

>Here are some categories of config-data:
>
>- k: CONSTANTS or variable_constants

I like programmes to be able to run without a configuration file. Aside 
from API keys and other credentials, I like both modules and main 
programmes to have reasonable wired in default CONSTANTS for when there 
is no external configuration. Even for a database I might at least 
provide something like:

  DEFAULT_DBHOST = '127.0.0.1'

to expect a local database server if there's no configuration.

>- keys: API keys
>- credentials: DB configurations

Keys and credentials are always in separate files, and _not_ under 
revision control. At least not under the same control as the code - they 
should never leak into a code repo.

However, the location of those files might be configurable. pArticularly 
when the application can be invoked from the command line it is often 
desirable to be able to say "get your configuration from over there".

>- logs: log definitions

I believe the logging module supports putting logging configuration in a 
file; I haven't used it.

>- coding: DEBUG

Usually default off (so that production mode is the default, reducing 
accidents), triggerable by setting the environment variable $DEBUG to 
"1".  And the logging configuration might specific log levels.

>- ops: userID (in the sense of addressing, billing, or control)
>- limitations: environment (eg only runs under *nix or MS-Windows)
>- user: personalID, user-category, credentials, 2FA

Userids tend to go in configuration so that one can run an instance of 
the application for this purpose, and and also for that purpose.

Regarding mechanisms, my hierarchy of configuration tends to go:

  code default CONSTANTS
  configuration file
  environment variables
  command line options

in order of override. Not all things get control from all levels. In 
particular security related modes _might_ not pay attention to any 
environment variables, and might even mandate explicit settings in a 
config file. To avoid accidents and assumptions.

For flattish configuration I do like the .ini file format: it is very 
easy to read and edit. The situation is articularly good now that 
Python3's parser supports both easy dictionary/mapping access to the 
fields and also will write out such a mapping in .ini format, which is 
great for generating configurations (example: the "init" step for a new 
app: it can dump the entire config out to the standard place if there's 
no existing config file, giving the user a prefilled file with all the 
setting available for inspection and adjustment).

Cheers,
Cameron Simpson <cs at cskk.id.au>



More information about the Python-list mailing list