Configuration Management - (pg 31) - Processes by which all artifacts relevant to your project, and the relationships between them, are stored, retrieved, uniquely identified and modified.
Configuration - (pg 39) - information that can be used to change the behavior of software at build time, deploy time, and run time.
Environment - (pg 49) - The hardware, software, infrastructure, and external systems an application depends on in order to work
Version Control
Answers the questions
What constitutes a particular version of your software?
What was done by whom; when and why?
Details
Everything that could change in your application stored in a controlled manner
Check in regularly (this is not a problem with git anymore methinks)
Use good commit messages
Configuration
Flexibility
Ultimate configurability vs Single purpose software
Configuration adds complexity
Configuration is hard for authors to think about
Types of Configuration
build-time
package-time
run-time
Management
Questions to answer
How to represent?
YAML, XML, Database
Version control, database, registry
How do deployment scripts access this?
Database, YAML, HTTP; via some interface, e.g., getProperty()1
How does it vary between environments?
Per Application, version, environment
Testing config
Smoke test during deployment for external systems
Smoke tests for applications to confirm deployment
Environments
Manual environment configuration
The worst approach to managing configuration information is to deal with it on an ad-hoc basis.
Environment creation should be a fully automated process
Environment configuration information
Info to worry about
OS version
Packages
Network
external services
data
Basic Principals of Configuration
Keep binary files separate
Keep configuration in one place
Third party software
Can we deploy it
Can we version it
Does it fit into our automated deployment strategy