Skip to content

Configuration Management Strategies

When building pipelines, there are many possible strategies for structuring your configuration in source control. No single method can cover all situations. After reading this document, we hope you feel equipped to select an approach.

Single Repository for Each Foundation

This is the simplest thing that could possibly work. It's the default assumed in all our examples, unless we've articulated a specific reason to choose a different approach. It entails using a single Git repository for each foundation.

Tracking foundation changes are simple, getting started is easy, duplicating foundations is simply a matter of cloning a repository, and configuration files are not difficult to understand.

This is the strategy used throughout the Install Ops Man How to Guide and the Upgrading an Existing Ops Manager How to Guide. This is also the strategy implicit in our Tanzu Application Service reference pipeline.

The Tanzu Application Service reference pipeline is an example pipeline that can be used as a reference for your own foundation. Let's examine an example configuration repository that uses the "Single Repository for each Foundation" pattern:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
├── auth.yml
├── pas.yml
├── director.yml
├── download-opsman.yml
├── download-product-configs
│   ├── healthwatch.yml
│   ├── opsman.yml
│   ├── pas-windows.yml
│   ├── pas.yml
│   └── telemetry.yml
├── env.yml
├── healthwatch.yml
├── opsman.yml
└── pas-windows.yml

Notice that there is only one subdirectory and that all other files are at the repositories base directory. This minimizes parameter mapping in the platform-automation tasks. For example, in the configure-director step:

1
2
3
4
5
6
- task: configure-director
  image: platform-automation-image
  file: platform-automation-tasks/tasks/configure-director.yml
  input_mapping:
    config: configuration
    env: configuration

we map the config files to the expected input named env of the configure-director task. Because the configure-director task's default ENV parameter is env.yml, it automatically uses the env.yml file in our configuration repo. We do not need to explicitly name the ENV parameter for the task. This also works for director.yml.

For reference, here is the configure-director task:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
---
platform: linux

inputs:
- name: platform-automation-tasks
- name: config # contains the director configuration file
- name: env # contains the env file with target OpsMan Information
- name: vars # variable files to be made available
  optional: true
- name: secrets
  # secret files to be made available
  # separate from vars, so they can be store securely
  optional: true
- name: ops-files # operations files to custom configure the product
  optional: true

params:
  VARS_FILES:
  # - Optional
  # - Filepath to the Ops Manager vars yaml file
  # - The path is relative to root of the task build,
  #   so `vars` and `secrets` can be used.

  OPS_FILES:
  # - Optional
  # - Filepath to the Ops Manager operations yaml files
  # - The path is relative to root of the task build

  ENV_FILE: env.yml
  # - Required
  # - Filepath of the env config YAML
  # - The path is relative to root of the `env` input

  DIRECTOR_CONFIG_FILE: director.yml
  # - Required
  # - Filepath to the director configuration yaml file
  # - The path is relative to the root of the `config` input

run:
  path: platform-automation-tasks/tasks/configure-director.sh

Multiple Foundations with one Repository

Multiple foundations may use a single Git configuration source but have different variables loaded from a foundation specific vars file, Credhub, Git repository, etc. This approach is very similar to the Single Repository for Each Foundation described above, except that variables are loaded in from external sources.

The variable source may be loaded in a number of ways. For example, it may be loaded from a separate foundation specific Git repository, a foundation specific subdirectory in the configuration source, or even a foundation specific vars file found in the base Git configuration.

This strategy can reduce the number of overall configuration files and configuration repositories in play, and can reduce foundation drift (as the basic configuration is being pulled from a single source). However, configuration management and secrets handling can quickly become more challenging.

This is the strategy used in our Reference Pipeline

For an example repo structure using this strategy, see the config repo used by the Reference Pipeline and the Resources Pipeline

As our How To Guides expand, we will explore this strategy further. Stay tuned for more.