Package: os-apply-config
Team and repository tagsos-apply-configApply configuration from cloud metadata (JSON)What does it do?It turns metadata from one or more JSON files like this:{"keystone": {"database": {"host": "127.0.0.1", "user": "keystone", "password": "foobar"}}}into service config files like this:[sql]
connection = mysql://keystone:foobar@127.0.0.1/keystone
...other settings...UsageJust pass it the path to a directory tree of templates:sudo os-apply-config -t /home/me/my_templatesBy default it will read config files according to the contents of
the file/var/lib/os-collect-config/os_config_files.json. In
order to remain backward compatible it will also fall back to
/var/run/os-collect-config/os_config_files.json, but the fallback
path is deprecated and will be removed in a later release. The main
path can be changed with the command line switch–os-config-files,
or the environment variableOS_CONFIG_FILES_PATH. The list can
also be overridden with the environment variableOS_CONFIG_FILES.
If overriding withOS_CONFIG_FILES, the paths are expected to be colon,
“:”, separated. Each json file referred to must have a mapping as their
root structure. Keys in files mentioned later in the list will override
keys in earlier files from this list. For example:OS_CONFIG_FILES=/tmp/ec2.json:/tmp/cfn.json os-apply-configThis will readec2.jsonandcfn.json, and if they have any
overlapping keys, the value fromcfn.jsonwill be used. That will
populate the tree for any templates found in the template path. Seehttps://opendev.org/openstack/os-collect-configfor a
program that will automatically collect data and populate this list.You can also overrideOS_CONFIG_FILESwith the–metadatacommand
line option, specifying it multiple times instead of colon separating
the list.os-apply-configwill also always try to read metadata in the old
legacy paths first to populate the tree. These paths can be changed
with–fallback-metadata.TemplatesThe template directory structure should mimic a root filesystem, and
contain templates for only those files you want configured. For
example:~/my_templates$ tree
.
+-- etc
    +-- keystone
    |    +-- keystone.conf
    +-- mysql
          +-- mysql.confAn example tree can be foundhere.If a template is executable it will be treated as anexecutable
template.  Otherwise, it will be treated as amustache template.Mustache TemplatesIf you don’t need any logic, just some string substitution, use a
mustache template.Metadata settings are accessed with dot (‘.’) notation:[sql]
connection = mysql://{{keystone.database.user}}:{{keystone.database.password}}@{{keystone.database.host}}/keystoneExecutable TemplatesConfiguration requiring logic is expressed in executable templates.An executable template is a script which accepts configuration as a
JSON string on standard in, and writes a config file to standard out.The script should exit non-zero if it encounters a problem, so that
os-apply-config knows what’s up.The output of the script will be written to the path corresponding to
the executable template’s path in the template tree:#!/usr/bin/env ruby
require 'json'
params = JSON.parse STDIN.read
puts "connection = mysql://#{c['keystone']['database']['user']}:#{c['keystone']['database']['password']}@#{c['keystone']['database']['host']}/keystone"You could even embed mustache in a heredoc, and use that:#!/usr/bin/env ruby
require 'json'
require 'mustache'
params = JSON.parse STDIN.read

template = <<-eos
[sql]
connection = mysql://{{keystone.database.user}}:{{keystone.database.password}}@{{keystone.database.host}}/keystone

[log]
...
eos

# tweak params here...

puts Mustache.render(template, params)Quick Start# install it
sudo pip install -U git+https://opendev.org/openstack/os-apply-config.git

# grab example templates
git clone https://opendev.org/openstack/tripleo-image-elements /tmp/config

# run it
os-apply-config -t /tmp/config/elements/nova/os-apply-config/ -m /tmp/config/elements/seed-stack-config/config.json -o /tmp/config_output