remove 'biultin' config, separate cloud.cfg
This set of changes makes '/etc/cloud/cloud.cfg' support "#include" and "#opt_include". The idea is to then provide a base configuration and allow distro or local changes that would override that.
This commit is contained in:
@@ -1,4 +0,0 @@
|
|||||||
cloud_type: auto
|
|
||||||
user: ubuntu
|
|
||||||
disable_root: 1
|
|
||||||
preserve_hostname: False
|
|
@@ -27,86 +27,17 @@ userdata = datadir + '/user-data.txt.i'
|
|||||||
user_scripts_dir = datadir + "/scripts"
|
user_scripts_dir = datadir + "/scripts"
|
||||||
boothooks_dir = datadir + "/boothooks"
|
boothooks_dir = datadir + "/boothooks"
|
||||||
cloud_config = datadir + '/cloud-config.txt'
|
cloud_config = datadir + '/cloud-config.txt'
|
||||||
#cloud_config = '/tmp/cloud-config.txt'
|
|
||||||
data_source_cache = cachedir + '/obj.pkl'
|
data_source_cache = cachedir + '/obj.pkl'
|
||||||
system_config = '/etc/cloud/cloud.cfg'
|
system_config = '/etc/cloud/cloud.cfg'
|
||||||
cfg_env_name = "CLOUD_CFG"
|
cfg_env_name = "CLOUD_CFG"
|
||||||
|
|
||||||
cfg_builtin = """
|
|
||||||
cloud_type: auto
|
|
||||||
user: ubuntu
|
|
||||||
disable_root: 1
|
|
||||||
|
|
||||||
cloud_config_modules:
|
|
||||||
- mounts
|
|
||||||
- ssh-import-id
|
|
||||||
- ssh
|
|
||||||
- grub-dpkg
|
|
||||||
- apt-update-upgrade
|
|
||||||
- puppet
|
|
||||||
- updates-check
|
|
||||||
- disable-ec2-metadata
|
|
||||||
- runcmd
|
|
||||||
- byobu
|
|
||||||
|
|
||||||
log_cfg: built_in
|
|
||||||
"""
|
|
||||||
|
|
||||||
def_log_file = '/var/log/cloud-init.log'
|
def_log_file = '/var/log/cloud-init.log'
|
||||||
|
cfg_builtin = """
|
||||||
|
log_cfgs: [ ]
|
||||||
|
cloud_type: auto
|
||||||
|
"""
|
||||||
logger_name = "cloudinit"
|
logger_name = "cloudinit"
|
||||||
|
|
||||||
built_in_log_base = """
|
|
||||||
[loggers]
|
|
||||||
keys=root,cloudinit
|
|
||||||
|
|
||||||
[handlers]
|
|
||||||
keys=consoleHandler,cloudLogHandler
|
|
||||||
|
|
||||||
[formatters]
|
|
||||||
keys=simpleFormatter,arg0Formatter
|
|
||||||
|
|
||||||
[logger_root]
|
|
||||||
level=DEBUG
|
|
||||||
handlers=consoleHandler,cloudLogHandler
|
|
||||||
|
|
||||||
[logger_cloudinit]
|
|
||||||
level=DEBUG
|
|
||||||
qualname=cloudinit
|
|
||||||
handlers=
|
|
||||||
propagate=1
|
|
||||||
|
|
||||||
[handler_consoleHandler]
|
|
||||||
class=StreamHandler
|
|
||||||
level=WARNING
|
|
||||||
formatter=arg0Formatter
|
|
||||||
args=(sys.stderr,)
|
|
||||||
|
|
||||||
[formatter_arg0Formatter]
|
|
||||||
format=%(asctime)s - %(filename)s[%(levelname)s]: %(message)s
|
|
||||||
|
|
||||||
[formatter_simpleFormatter]
|
|
||||||
format=[CLOUDINIT] %(asctime)s - %(filename)s[%(levelname)s]: %(message)s
|
|
||||||
datefmt=
|
|
||||||
|
|
||||||
"""
|
|
||||||
|
|
||||||
built_in_log_clougLogHandlerLog="""
|
|
||||||
[handler_cloudLogHandler]
|
|
||||||
class=FileHandler
|
|
||||||
level=DEBUG
|
|
||||||
formatter=simpleFormatter
|
|
||||||
args=('__CLOUDINIT_LOGGER_FILE__',)
|
|
||||||
"""
|
|
||||||
|
|
||||||
built_in_log_cloudLogHandlerSyslog= """
|
|
||||||
[handler_cloudLogHandler]
|
|
||||||
class=handlers.SysLogHandler
|
|
||||||
level=DEBUG
|
|
||||||
formatter=simpleFormatter
|
|
||||||
args=("/dev/log", handlers.SysLogHandler.LOG_USER)
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
import os
|
import os
|
||||||
from configobj import ConfigObj
|
from configobj import ConfigObj
|
||||||
|
|
||||||
@@ -132,32 +63,31 @@ def logging_set_from_cfg_file(cfg_file=system_config):
|
|||||||
logging_set_from_cfg(util.get_base_cfg(cfg_file,cfg_builtin))
|
logging_set_from_cfg(util.get_base_cfg(cfg_file,cfg_builtin))
|
||||||
|
|
||||||
def logging_set_from_cfg(cfg, logfile=None):
|
def logging_set_from_cfg(cfg, logfile=None):
|
||||||
if logfile is None:
|
log_cfgs = []
|
||||||
|
logcfg=util.get_cfg_option_str(cfg, "log_cfg", False)
|
||||||
|
if logcfg:
|
||||||
|
# if there is a 'logcfg' entry in the config, respect
|
||||||
|
# it, it is the old keyname
|
||||||
|
log_cfgs = [ logcfg ]
|
||||||
|
elif "log_cfgs" in cfg:
|
||||||
|
for cfg in cfg['log_cfgs']:
|
||||||
|
if isinstance(cfg,list):
|
||||||
|
log_cfgs.append('\n'.join(cfg))
|
||||||
|
else:
|
||||||
|
log_cfgs.append()
|
||||||
|
|
||||||
|
if not len(log_cfgs):
|
||||||
|
sys.stderr.write("Warning, no logging configured\n")
|
||||||
|
|
||||||
|
for logcfg in log_cfgs:
|
||||||
try:
|
try:
|
||||||
open(def_log_file,"a").close()
|
logging.config.fileConfig(StringIO.StringIO(logcfg))
|
||||||
logfile = def_log_file
|
return
|
||||||
except IOError as e:
|
except:
|
||||||
if e.errno == errno.EACCES:
|
pass
|
||||||
logfile = "/dev/null"
|
|
||||||
else: raise
|
|
||||||
|
|
||||||
logcfg=util.get_cfg_option_str(cfg, "log_cfg", "built_in")
|
|
||||||
failsafe = "%s\n%s" % (built_in_log_base, built_in_log_clougLogHandlerLog)
|
|
||||||
builtin = False
|
|
||||||
if logcfg.lower() == "built_in":
|
|
||||||
logcfg = "%s\n%s" % (built_in_log_base, built_in_log_cloudLogHandlerSyslog)
|
|
||||||
builtin = True
|
|
||||||
|
|
||||||
logcfg=logcfg.replace("__CLOUDINIT_LOGGER_FILE__",logfile)
|
raise Exception("no valid logging found\n")
|
||||||
try:
|
|
||||||
logging.config.fileConfig(StringIO.StringIO(logcfg))
|
|
||||||
return
|
|
||||||
except:
|
|
||||||
if not builtin:
|
|
||||||
sys.stderr.write("Warning, setting config.fileConfig failed\n")
|
|
||||||
|
|
||||||
failsafe=failsafe.replace("__CLOUDINIT_LOGGER_FILE__",logfile)
|
|
||||||
logging.config.fileConfig(StringIO.StringIO(failsafe))
|
|
||||||
|
|
||||||
import DataSourceEc2
|
import DataSourceEc2
|
||||||
import DataSourceNoCloud
|
import DataSourceNoCloud
|
||||||
@@ -196,7 +126,7 @@ class CloudInit:
|
|||||||
if self.cfg:
|
if self.cfg:
|
||||||
return(self.cfg)
|
return(self.cfg)
|
||||||
|
|
||||||
conf = util.get_base_cfg(system_config,cfg_builtin)
|
conf = util.get_base_cfg(self.sysconfig,cfg_builtin)
|
||||||
|
|
||||||
# support reading the old ConfigObj format file and merging
|
# support reading the old ConfigObj format file and merging
|
||||||
# it into the yaml dictionary
|
# it into the yaml dictionary
|
||||||
|
@@ -17,6 +17,7 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
import yaml
|
import yaml
|
||||||
import os
|
import os
|
||||||
|
import os.path
|
||||||
import errno
|
import errno
|
||||||
import subprocess
|
import subprocess
|
||||||
from Cheetah.Template import Template
|
from Cheetah.Template import Template
|
||||||
@@ -24,6 +25,7 @@ import cloudinit
|
|||||||
import urllib2
|
import urllib2
|
||||||
import logging
|
import logging
|
||||||
import traceback
|
import traceback
|
||||||
|
import re
|
||||||
|
|
||||||
WARN = logging.WARN
|
WARN = logging.WARN
|
||||||
DEBUG = logging.DEBUG
|
DEBUG = logging.DEBUG
|
||||||
@@ -41,7 +43,8 @@ def read_conf(fname):
|
|||||||
raise
|
raise
|
||||||
|
|
||||||
def get_base_cfg(cfgfile,cfg_builtin=""):
|
def get_base_cfg(cfgfile,cfg_builtin=""):
|
||||||
syscfg = read_conf(cfgfile)
|
contents = read_file_with_includes(cfgfile)
|
||||||
|
syscfg = yaml.load(contents)
|
||||||
if cfg_builtin:
|
if cfg_builtin:
|
||||||
builtin = yaml.load(cfg_builtin)
|
builtin = yaml.load(cfg_builtin)
|
||||||
else:
|
else:
|
||||||
@@ -168,3 +171,55 @@ def read_seeded(base="", ext="", timeout=2):
|
|||||||
|
|
||||||
def logexc(log,lvl=logging.DEBUG):
|
def logexc(log,lvl=logging.DEBUG):
|
||||||
log.log(lvl,traceback.format_exc())
|
log.log(lvl,traceback.format_exc())
|
||||||
|
|
||||||
|
class RecursiveInclude(Exception):
|
||||||
|
pass
|
||||||
|
|
||||||
|
def read_file_with_includes(fname, rel = ".", stack=[], patt = None):
|
||||||
|
if not fname.startswith("/"):
|
||||||
|
fname = os.sep.join((rel, fname))
|
||||||
|
|
||||||
|
fname = os.path.realpath(fname)
|
||||||
|
|
||||||
|
if fname in stack:
|
||||||
|
raise(RecursiveInclude("%s recursively included" % fname))
|
||||||
|
if len(stack) > 10:
|
||||||
|
raise(RecursiveInclude("%s included, stack size = %i" %
|
||||||
|
(fname, len(stack))))
|
||||||
|
|
||||||
|
if patt == None:
|
||||||
|
patt = re.compile("^#(opt_include|include)[ \t].*$",re.MULTILINE)
|
||||||
|
|
||||||
|
try:
|
||||||
|
fp = open(fname)
|
||||||
|
contents = fp.read()
|
||||||
|
fp.close()
|
||||||
|
except:
|
||||||
|
raise
|
||||||
|
|
||||||
|
rel = os.path.dirname(fname)
|
||||||
|
stack.append(fname)
|
||||||
|
|
||||||
|
cur = 0
|
||||||
|
clen = len(contents)
|
||||||
|
while True:
|
||||||
|
match = patt.search(contents[cur:])
|
||||||
|
if not match: break
|
||||||
|
loc = match.start() + cur
|
||||||
|
endl = match.end() + cur
|
||||||
|
|
||||||
|
(key, cur_fname) = contents[loc:endl].split(None,2)
|
||||||
|
cur_fname = cur_fname.strip()
|
||||||
|
|
||||||
|
try:
|
||||||
|
inc_contents = read_file_with_includes(cur_fname, rel, stack, patt)
|
||||||
|
except IOError, e:
|
||||||
|
if e.errno == errno.ENOENT and key == "#opt_include":
|
||||||
|
inc_contents = ""
|
||||||
|
else:
|
||||||
|
raise
|
||||||
|
contents = contents[0:loc] + inc_contents + contents[endl+1:]
|
||||||
|
cur = loc + len(inc_contents)
|
||||||
|
stack.pop()
|
||||||
|
return(contents)
|
||||||
|
|
||||||
|
26
config/cloud.cfg
Normal file
26
config/cloud.cfg
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
cloud: auto
|
||||||
|
user: ubuntu
|
||||||
|
disable_root: 1
|
||||||
|
preserve_hostname: False
|
||||||
|
|
||||||
|
cloud_config_modules:
|
||||||
|
- mounts
|
||||||
|
- ssh-import-id
|
||||||
|
- ssh
|
||||||
|
- grub-dpkg
|
||||||
|
- apt-update-upgrade
|
||||||
|
- puppet
|
||||||
|
- updates-check
|
||||||
|
- disable-ec2-metadata
|
||||||
|
- runcmd
|
||||||
|
- byobu
|
||||||
|
|
||||||
|
## logging.cfg contains info on logging output for cloud-init
|
||||||
|
#include logging.cfg
|
||||||
|
|
||||||
|
## dpkg-cloud-sources.cfg contains the values
|
||||||
|
## selected by dpkg configuration
|
||||||
|
#opt_include distro.cfg
|
||||||
|
|
||||||
|
##local.cfg is for local overrides of any of the above
|
||||||
|
#opt_include local.cfg
|
57
config/logging.cfg
Normal file
57
config/logging.cfg
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
## this yaml formated config file handles setting
|
||||||
|
## logger information. The values that are necessary to be set
|
||||||
|
## are seen at the bottom. The top '_log' are only used to remove
|
||||||
|
## redundency in a syslog and fallback-to-file case.
|
||||||
|
##
|
||||||
|
## The 'log_cfgs' entry defines a list of logger configs
|
||||||
|
## Each entry in the list is tried, and the first one that
|
||||||
|
## works is used. If a log_cfg list entry is an array, it will
|
||||||
|
## be joined with '\n'.
|
||||||
|
_log:
|
||||||
|
- &log_base |
|
||||||
|
[loggers]
|
||||||
|
keys=root,cloudinit
|
||||||
|
|
||||||
|
[handlers]
|
||||||
|
keys=consoleHandler,cloudLogHandler
|
||||||
|
|
||||||
|
[formatters]
|
||||||
|
keys=simpleFormatter,arg0Formatter
|
||||||
|
|
||||||
|
[logger_root]
|
||||||
|
level=DEBUG
|
||||||
|
handlers=consoleHandler,cloudLogHandler
|
||||||
|
|
||||||
|
[logger_cloudinit]
|
||||||
|
level=DEBUG
|
||||||
|
qualname=cloudinit
|
||||||
|
handlers=
|
||||||
|
propagate=1
|
||||||
|
|
||||||
|
[handler_consoleHandler]
|
||||||
|
class=StreamHandler
|
||||||
|
level=WARNING
|
||||||
|
formatter=arg0Formatter
|
||||||
|
args=(sys.stderr,)
|
||||||
|
|
||||||
|
[formatter_arg0Formatter]
|
||||||
|
format=%(asctime)s - %(filename)s[%(levelname)s]: %(message)s
|
||||||
|
|
||||||
|
[formatter_simpleFormatter]
|
||||||
|
format=[CLOUDINIT] %(filename)s[%(levelname)s]: %(message)s
|
||||||
|
- &log_file |
|
||||||
|
[handler_cloudLogHandler]
|
||||||
|
class=FileHandler
|
||||||
|
level=DEBUG
|
||||||
|
formatter=simpleFormatter
|
||||||
|
args=('/var/log/cloud-init.log',)
|
||||||
|
- &log_syslog |
|
||||||
|
[handler_cloudLogHandler]
|
||||||
|
class=handlers.SysLogHandler
|
||||||
|
level=DEBUG
|
||||||
|
formatter=simpleFormatter
|
||||||
|
args=("/dev/log", handlers.SysLogHandler.LOG_USER)
|
||||||
|
|
||||||
|
log_cfgs:
|
||||||
|
- [ *log_base, *log_syslog ]
|
||||||
|
- [ *log_base, *log_file ]
|
2
setup.py
2
setup.py
@@ -37,7 +37,7 @@ setup(name='cloud-init',
|
|||||||
'cloud-init-run-module.py',
|
'cloud-init-run-module.py',
|
||||||
'cloud-init-cfg.py'
|
'cloud-init-cfg.py'
|
||||||
],
|
],
|
||||||
data_files=[('/etc/cloud', ['cloud.cfg']),
|
data_files=[('/etc/cloud', glob('config/*.cfg')),
|
||||||
('/etc/cloud/templates', glob('templates/*')),
|
('/etc/cloud/templates', glob('templates/*')),
|
||||||
('/etc/init', glob('upstart/*.conf')),
|
('/etc/init', glob('upstart/*.conf')),
|
||||||
('/usr/share/cloud-init', []),
|
('/usr/share/cloud-init', []),
|
||||||
|
Reference in New Issue
Block a user