summaryrefslogtreecommitdiff
path: root/cloudinit
diff options
context:
space:
mode:
authorRomanos Skiadas <rski@intracom-telecom.com>2018-02-22 16:40:05 -0500
committerScott Moser <smoser@ubuntu.com>2018-02-26 14:47:50 -0500
commitd67636f7cc3df3df69b438c27ae0cd8a4416048d (patch)
tree9f692cb96f7f3294358fdf005e501885c5408f78 /cloudinit
parent46cb6716c27d4496ce3d2bea7684803f522f277d (diff)
downloadvyos-cloud-init-d67636f7cc3df3df69b438c27ae0cd8a4416048d.tar.gz
vyos-cloud-init-d67636f7cc3df3df69b438c27ae0cd8a4416048d.zip
Implement puppet 4 support
Make puppet installation more configurable by: - Adding a package_name parameter - Exposing the puppet configuration and puppet ssl directories as parameters. These default to the previous values if unset, but can be set to the new values puppetlabs requires for its puppet 4.x packages. This way puppet 4 configuration is now possible. LP: #1446804
Diffstat (limited to 'cloudinit')
-rw-r--r--cloudinit/config/cc_puppet.py54
-rw-r--r--cloudinit/util.py2
2 files changed, 41 insertions, 15 deletions
diff --git a/cloudinit/config/cc_puppet.py b/cloudinit/config/cc_puppet.py
index 28b1d568..57a170fb 100644
--- a/cloudinit/config/cc_puppet.py
+++ b/cloudinit/config/cc_puppet.py
@@ -21,6 +21,13 @@ under ``version``, and defaults to ``none``, which selects the latest version
in the repos. If the ``puppet`` config key exists in the config archive, this
module will attempt to start puppet even if no installation was performed.
+The module also provides keys for configuring the new puppet 4 paths and
+installing the puppet package from the puppetlabs repositories:
+https://docs.puppet.com/puppet/4.2/reference/whered_it_go.html
+The keys are ``package_name``, ``conf_file`` and ``ssl_dir``. If unset, their
+values will default to ones that work with puppet 3.x and with distributions
+that ship modified puppet 4.x that uses the old paths.
+
Puppet configuration can be specified under the ``conf`` key. The
configuration is specified as a dictionary containing high-level ``<section>``
keys and lists of ``<key>=<value>`` pairs within each section. Each section
@@ -44,6 +51,9 @@ in pem format as a multi-line string (using the ``|`` yaml notation).
puppet:
install: <true/false>
version: <version>
+ conf_file: '/etc/puppet/puppet.conf'
+ ssl_dir: '/var/lib/puppet/ssl'
+ package_name: 'puppet'
conf:
agent:
server: "puppetmaster.example.org"
@@ -63,9 +73,17 @@ from cloudinit import helpers
from cloudinit import util
PUPPET_CONF_PATH = '/etc/puppet/puppet.conf'
-PUPPET_SSL_CERT_DIR = '/var/lib/puppet/ssl/certs/'
PUPPET_SSL_DIR = '/var/lib/puppet/ssl'
-PUPPET_SSL_CERT_PATH = '/var/lib/puppet/ssl/certs/ca.pem'
+PUPPET_PACKAGE_NAME = 'puppet'
+
+
+class PuppetConstants(object):
+
+ def __init__(self, puppet_conf_file, puppet_ssl_dir, log):
+ self.conf_path = puppet_conf_file
+ self.ssl_dir = puppet_ssl_dir
+ self.ssl_cert_dir = os.path.join(puppet_ssl_dir, "certs")
+ self.ssl_cert_path = os.path.join(self.ssl_cert_dir, "ca.pem")
def _autostart_puppet(log):
@@ -92,22 +110,29 @@ def handle(name, cfg, cloud, log, _args):
return
puppet_cfg = cfg['puppet']
-
# Start by installing the puppet package if necessary...
install = util.get_cfg_option_bool(puppet_cfg, 'install', True)
version = util.get_cfg_option_str(puppet_cfg, 'version', None)
+ package_name = util.get_cfg_option_str(
+ puppet_cfg, 'package_name', PUPPET_PACKAGE_NAME)
+ conf_file = util.get_cfg_option_str(
+ puppet_cfg, 'conf_file', PUPPET_CONF_PATH)
+ ssl_dir = util.get_cfg_option_str(puppet_cfg, 'ssl_dir', PUPPET_SSL_DIR)
+
+ p_constants = PuppetConstants(conf_file, ssl_dir, log)
if not install and version:
log.warn(("Puppet install set false but version supplied,"
" doing nothing."))
elif install:
log.debug(("Attempting to install puppet %s,"),
version if version else 'latest')
- cloud.distro.install_packages(('puppet', version))
+
+ cloud.distro.install_packages((package_name, version))
# ... and then update the puppet configuration
if 'conf' in puppet_cfg:
# Add all sections from the conf object to puppet.conf
- contents = util.load_file(PUPPET_CONF_PATH)
+ contents = util.load_file(p_constants.conf_path)
# Create object for reading puppet.conf values
puppet_config = helpers.DefaultingConfigParser()
# Read puppet.conf values from original file in order to be able to
@@ -116,19 +141,19 @@ def handle(name, cfg, cloud, log, _args):
cleaned_lines = [i.lstrip() for i in contents.splitlines()]
cleaned_contents = '\n'.join(cleaned_lines)
puppet_config.readfp(StringIO(cleaned_contents),
- filename=PUPPET_CONF_PATH)
+ filename=p_constants.conf_path)
for (cfg_name, cfg) in puppet_cfg['conf'].items():
# Cert configuration is a special case
# Dump the puppet master ca certificate in the correct place
if cfg_name == 'ca_cert':
# Puppet ssl sub-directory isn't created yet
# Create it with the proper permissions and ownership
- util.ensure_dir(PUPPET_SSL_DIR, 0o771)
- util.chownbyname(PUPPET_SSL_DIR, 'puppet', 'root')
- util.ensure_dir(PUPPET_SSL_CERT_DIR)
- util.chownbyname(PUPPET_SSL_CERT_DIR, 'puppet', 'root')
- util.write_file(PUPPET_SSL_CERT_PATH, cfg)
- util.chownbyname(PUPPET_SSL_CERT_PATH, 'puppet', 'root')
+ util.ensure_dir(p_constants.ssl_dir, 0o771)
+ util.chownbyname(p_constants.ssl_dir, 'puppet', 'root')
+ util.ensure_dir(p_constants.ssl_cert_dir)
+ util.chownbyname(p_constants.ssl_cert_dir, 'puppet', 'root')
+ util.write_file(p_constants.ssl_cert_path, cfg)
+ util.chownbyname(p_constants.ssl_cert_path, 'puppet', 'root')
else:
# Iterate through the config items, we'll use ConfigParser.set
# to overwrite or create new items as needed
@@ -144,8 +169,9 @@ def handle(name, cfg, cloud, log, _args):
puppet_config.set(cfg_name, o, v)
# We got all our config as wanted we'll rename
# the previous puppet.conf and create our new one
- util.rename(PUPPET_CONF_PATH, "%s.old" % (PUPPET_CONF_PATH))
- util.write_file(PUPPET_CONF_PATH, puppet_config.stringify())
+ util.rename(p_constants.conf_path, "%s.old"
+ % (p_constants.conf_path))
+ util.write_file(p_constants.conf_path, puppet_config.stringify())
# Set it up so it autostarts
_autostart_puppet(log)
diff --git a/cloudinit/util.py b/cloudinit/util.py
index 5a919cfe..02dc2ce8 100644
--- a/cloudinit/util.py
+++ b/cloudinit/util.py
@@ -1746,7 +1746,7 @@ def chmod(path, mode):
def write_file(filename, content, mode=0o644, omode="wb", copy_mode=False):
"""
Writes a file with the given content and sets the file mode as specified.
- Resotres the SELinux context if possible.
+ Restores the SELinux context if possible.
@param filename: The full path of the file to write.
@param content: The content to write to the file.