diff options
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | TODO | 1 | ||||
-rw-r--r-- | cloudinit/util.py | 38 | ||||
-rw-r--r-- | config/cloud.cfg | 9 | ||||
-rw-r--r-- | config/cloud.cfg.d/05_logging.cfg (renamed from config/logging.cfg) | 0 | ||||
-rw-r--r-- | config/cloud.cfg.d/README | 3 | ||||
-rwxr-xr-x | setup.py | 1 |
7 files changed, 42 insertions, 13 deletions
@@ -16,6 +16,9 @@ - make DataSourceEc2 retries and timeout configurable - add helper routines for apt-get update and install - add 'bootcmd' like 'runcmd' to cloud-config syntax for running things early + - move from '#opt_include' in config file format to conf_d. + ie, now files in /etc/cloud.cfg.d/ is read rather than reading + '#opt_include <filename>' or '#include <filename>' in cloud.cfg 0.6.0: - change permissions of /var/log/cloud-init.log to accomodate syslog writing to it (LP: #704509) @@ -1,4 +1,3 @@ -- conf.d rather than 'opt_include' (or #include) - consider 'failsafe' DataSource If all others fail, setting a default that - sets the user password, writing it to console diff --git a/cloudinit/util.py b/cloudinit/util.py index 72db58f9..3a40cc99 100644 --- a/cloudinit/util.py +++ b/cloudinit/util.py @@ -44,9 +44,7 @@ def get_base_cfg(cfgfile,cfg_builtin="", parsed_cfgs=None): if parsed_cfgs and cfgfile in parsed_cfgs: return(parsed_cfgs[cfgfile]) - contents = read_file_with_includes(cfgfile) - if contents: - syscfg = yaml.load(contents) + syscfg = read_conf_with_confd(cfgfile) kern_contents = read_cc_from_cmdline() if kern_contents: @@ -260,6 +258,40 @@ def read_file_with_includes(fname, rel = ".", stack=[], patt = None): stack.pop() return(contents) +def read_conf_d(confd): + # get reverse sorted list (later trumps newer) + confs = sorted(os.listdir(confd),reverse=True) + + # remove anything not ending in '.cfg' + confs = filter(lambda f: f.endswith(".cfg"), confs) + + # remove anything not a file + confs = filter(lambda f: os.path.isfile("%s/%s" % (confd,f)),confs) + + cfg = { } + for conf in confs: + cfg = mergedict(cfg,read_conf("%s/%s" % (confd,conf))) + + return(cfg) + +def read_conf_with_confd(cfgfile): + cfg = read_conf(cfgfile) + confd = False + if "conf_d" in cfg: + if cfg['conf_d'] is not None: + confd = cfg['conf_d'] + if not isinstance(confd,str): + raise Exception("cfgfile %s contains 'conf_d' with non-string" % cfgfile) + elif os.path.isdir("%s.d" % cfgfile): + confd = "%s.d" % cfgfile + + if not confd: return(cfg) + + confd_cfg = read_conf_d(confd) + + return(mergedict(confd_cfg,cfg)) + + def get_cmdline(): if 'DEBUG_PROC_CMDLINE' in os.environ: cmdline = os.environ["DEBUG_PROC_CMDLINE"] diff --git a/config/cloud.cfg b/config/cloud.cfg index c27cc5e8..d9f352e8 100644 --- a/config/cloud.cfg +++ b/config/cloud.cfg @@ -32,12 +32,3 @@ cloud_final_modules: - keys-to-console - phone-home - final-message - -## logging.cfg contains info on logging output for cloud-init -#include logging.cfg - -## distro.cfg contains the local distro specific values -#opt_include distro.cfg - -##local.cfg is for local overrides of any of the above -#opt_include local.cfg diff --git a/config/logging.cfg b/config/cloud.cfg.d/05_logging.cfg index 2e7ac2ed..2e7ac2ed 100644 --- a/config/logging.cfg +++ b/config/cloud.cfg.d/05_logging.cfg diff --git a/config/cloud.cfg.d/README b/config/cloud.cfg.d/README new file mode 100644 index 00000000..60702e9d --- /dev/null +++ b/config/cloud.cfg.d/README @@ -0,0 +1,3 @@ +# All files in this directory will be read by cloud-init +# They are read in lexical order. Later files overwrite values in +# earlier files. @@ -38,6 +38,7 @@ setup(name='cloud-init', 'cloud-init-cfg.py', ], data_files=[('/etc/cloud', glob('config/*.cfg')), + ('/etc/cloud/cloud.cfg.d', glob('config/cloud.cfg.d/*')), ('/etc/cloud/templates', glob('templates/*')), ('/etc/init', glob('upstart/*.conf')), ('/usr/share/cloud-init', []), |