From 1f1ebcedb80e1a2adfd0df16f714ae75f2119766 Mon Sep 17 00:00:00 2001 From: NeatNerdPrime Date: Sun, 25 Jun 2017 00:29:00 +0200 Subject: [PATCH] Puppet module update (#365) * #347 - Fix for debconf validator pointing to wrong file. * reported in https://github.com/andsens/bootstrap-vz/issues/347 flake8: commands succeeded congratulations :) * # development commit * trying to fix the packages install with a forced apt-update prior to installing packages. should fix any issues prior to * # dev commit * Trying to parse the commands with a chrotted log_check_call * # dev commit * "TypeError: sequence item 2: expected string, list found" , trying to fix this * # dev commit - changed the way local packages get installed This commit changes the way local deb packages get installed. * rationale: a local deb package mostly includes a deb to configure apt, e.g.: Puppet apt package. Therefore, after a local dep pkg install , apt should update itself to be able to install packages that come with the repo's configured from the local deb package. This assumes you install LOCAL packages (deb files) first (as a rule of thumb) and AFTER the REMOTE packages (you include other packages by name) * reverted command plugin tasks code * # Dev commit - puppet module update Goal is to install a puppet 4 agent on the bootstrapped image * limitations: Only for debian Jessie, installs only puppet4 * # Feature improvement - Puppet module * a new way to install and configure puppet on a debian jessie * only tested on debian jessie, for now it only installs the PC1 agent package. * future endeavors include all mentioned todo's: * TODO: plugin must be able to install on any debian release * TODO: plugin must be able to offer choice of distro package or apt.puppetlabs.com package * TODO: plugin must be able to select release version package (vanilla or PC1) * TODO: plugin must be able to set up a puppet SERVER , puppetDB optional * TODO: plugin have proper linting * TODO: write test cases * # Derp commit * added project files in GitIgnore * # Dev commit * added release detection and installs appropriate package. * # derp commit * removed unnecessary class parameter. * # derp dev commit * add predecessor to ensure repo package gets installed BEFORE the agent. * # derp fixes commit * i must use info.manifest.release * a little bit refactoring * # derp commit * fixed correct predecessor * # feature & derp dev commit * added feature to install puppet modules with the plugin * # Version upgrade commit New puppet plugin module update * Plugin can select proper debian release package to install * Plugin can install modules directly from forge.puppetlabs.com * Updated documentation with working example * Limitations TL;DR: agent software only, PC1 package only, Absolute pathing, wheezy/jessie only, assumes production environment for modules. * Several ugly derp bugs squashed. * * PR fix commit * Modified puppet readme file as recommended * added small description in changelog https://github.com/andsens/bootstrap-vz/pull/365#discussion_r101378921 https://github.com/andsens/bootstrap-vz/pull/365#discussion_r101379039 * # PR fix commit * Cleaned debugging leftovers https://github.com/andsens/bootstrap-vz/pull/365#discussion_r101379293 * # PR fix commit * Removed todo's from code, creating issues on the project issue tracker. https://github.com/andsens/bootstrap-vz/pull/365#discussion_r101381742 * # PR fix commit * Moved EnableAgent task to the bottom as requested https://github.com/andsens/bootstrap-vz/pull/365#discussion_r101382775 * # PR fix commit * Removed gitignore file, I have absolutely no idea how that got there. * # PR fix commit * Fixed several TOX issues, it's all green now * #MR-365 - dev commit * first try at installing agent with sources/key injection * New tasks in puppet module: AddPuppetlabsPC1SourcesList; InstallPuppetlabsPC1ReleaseKey * it does NOT do any checks. it assumes the url is correct. * #MR-365 - derp commit * removed some unused code in tasks * #365 - tox fix commit * fixed several tox warnings * #365 - tox fix commit * missed one line... * #365 - tox fix commit * Noticed the nature of the tox warnings of 'undefined name', fixed. * # 365 - Task order fix commit * Some tasks had some invalid predecessors defined, removed. * when running a test manifest, it fails due to 'NO_PUBKEY 7F438280EF8D349F', trying a hacky way to address this * #365 - Puppet module update - install with source-key combo * It now properly installs puppet agent package with sources/keys instead of package * Tox is green * Delete .project * Delete .pydevproject * #365 - Puppet module update General puppet module update. * Fixed several issues discussed in the pull request. * Tox is all green * General puppet module update. * This update allows for the installation of the puppetlabs.com agent VERSION 4 from the official apt.puppetlabs.com repo * Allows for the installation of puppet modules. Useful for masterless setups. * Puppet modules you declare in your bootstrap-vz manifest are installed with the --force flag. Limitations and gotcha's: * Only works for Debian Wheezy & Jessie. * The Puppetlabs.com agents are only released for i386 and amd64 architectures. * If you require the puppet 3.x agent, you should not use this module but add "puppet-agent" into the packages list * You need to add your own puppet.conf file to fit your needs, this can be easily included in the assets directive. * Assets path is absolute. * General puppet module update. * This update allows for the installation of the puppetlabs.com agent VERSION 4 from the official apt.puppetlabs.com repo * Allows for the installation of puppet modules. Useful for masterless setups. * Puppet modules you declare in your bootstrap-vz manifest are installed with the --force flag. Limitations and gotcha's: * Only works for Debian Wheezy & Jessie. * The Puppetlabs.com agents are only released for i386 and amd64 architectures. * If you require the puppet 3.x agent, you should not use this module but add "puppet-agent" into the packages list * You need to add your own puppet.conf file to fit your needs, this can be easily included in the assets directive. * Assets path is absolute. * #365 - Changed the way trusted keys are fetched. * @andsens is right, keyrings are better added by injecting them into the image, removing the need to install package 'ca-certificates' * * Added new feature: puppet module version can now be included in the manifest. * modified manifest-schema to reflect proper module installation * Updated documentation. * Example manifest added to demonstrate changes * @andsens is right, keyrings are better added by injecting them into the image, removing the need to install package 'ca-certificates' * Fix several requests * Example manifest moved to a more suitable location, documentation changed as well. * A bit more efficient programming. * reverted file_copy to it's proper state --- CHANGELOG.rst | 12 +++ bootstrapvz/plugins/puppet/README.rst | 81 ++++++++++++-- bootstrapvz/plugins/puppet/__init__.py | 7 +- .../jessie/puppetlabs-pc1-keyring.gpg | Bin 0 -> 12283 bytes .../wheezy/puppetlabs-pc1-keyring.gpg | Bin 0 -> 12283 bytes .../plugins/puppet/manifest-schema.yml | 13 +++ bootstrapvz/plugins/puppet/tasks.py | 100 ++++++++++++++---- manifests/examples/kvm/jessie-puppet.yaml | 45 ++++++++ 8 files changed, 230 insertions(+), 28 deletions(-) create mode 100644 bootstrapvz/plugins/puppet/assets/gpg-keyrings-PC1/jessie/puppetlabs-pc1-keyring.gpg create mode 100644 bootstrapvz/plugins/puppet/assets/gpg-keyrings-PC1/wheezy/puppetlabs-pc1-keyring.gpg create mode 100644 manifests/examples/kvm/jessie-puppet.yaml diff --git a/CHANGELOG.rst b/CHANGELOG.rst index cb76a2b..fcb3277 100644 --- a/CHANGELOG.rst +++ b/CHANGELOG.rst @@ -1,6 +1,18 @@ Changelog ========= +2017-02-20 +---------- +Hugo Antoniio Sepulveda Manriquez: + * Updated puppet plugin module: + * Installs Puppetlabs 4 PC1 agent software from apt.puppetlabs.com + * Enables you to install modules from forge.puppetlabs.com in the image + + * Important limitations + * Only works for Wheezy and Jessie for now. + * If you need puppet 3, just add 'puppet' packages provider list. + * modules: When installing from forge, it assumes 'install --force' + * modules: When installing from forge, It assumes master version on forge 2016-06-04 ---------- diff --git a/bootstrapvz/plugins/puppet/README.rst b/bootstrapvz/plugins/puppet/README.rst index 530694f..86c3aa3 100644 --- a/bootstrapvz/plugins/puppet/README.rst +++ b/bootstrapvz/plugins/puppet/README.rst @@ -1,16 +1,25 @@ Puppet ------ -Installs `puppet `__ and optionally applies a +Installs `puppet version 4 ` PC1 From the site +repository `` and optionally applies a manifest inside the chroot. You can also have it copy your puppet configuration into the image so it is readily available once the image is booted. -Keep in mind that when applying a manifest, the system is in a chrooted -environment. This can prevent daemons from running properly (e.g. -listening to ports), they will also need to be shut down gracefully -(which bootstrap-vz cannot do) before unmounting the volume. It is -advisable to avoid starting any daemons inside the chroot at all. +Rationale and use case +~~~~~~~~~~~~~~~~~~~~~~ + +You want to use this plugin when you wish to create an image and to be able to +manage that image with Puppet. You have a Puppet 4 setup in mind and thus you +want the image to contain the puppet agent software from the puppetlabs repo. +You want it to almost contain everything you need to get it up and running +This plugin does just that! +While you're at it, throw in some modules from the forge as well! +Want to include your own modules? Include them as assets! + +For now this plugin is only compatible with Debian versions Wheezy and Jessie. +These are also the distributions supported by puppetlabs. Settings ~~~~~~~~ @@ -18,7 +27,61 @@ Settings - ``manifest``: Path to the puppet manifest that should be applied. ``optional`` - ``assets``: Path to puppet assets. The contents will be copied into - ``/etc/puppet`` on the image. Any existing files will be overwritten. - ``optional`` -- ``enable_agent``: Whether the puppet agent daemon should be enabled. + ``/etc/puppetlabs`` on the image. Any existing files will be overwritten. ``optional`` +- ``install_modules``: A list of modules you wish to install available from + `` inside the chroot. It will assume a FORCED + install of the modules. + This list is a list of tuples. Every tuple must at least contain the module + name. A version is optional, when no version is given, it will take the + latest version available from the forge. + Format: [module_name (required), version (optional)] +- ``enable_agent``: Whether the puppet agent daemon should be enabled. + ``optional - not recommended``. disabled by default. UNTESTED + +An example bootstrap-vz manifest is included in the ``KVM`` folder of the +manifests examples directory. + +Limitations +~~~~~~~~~~~ +(Help is always welcome, feel free to chip in!) +General: + +- This plugin only installs the PC1 package for now, needs to be extended to + be able to install the package of choice +- The puppetlabs agent is only available to i386 and amd64 architectures. ARM + is not available from repository at this time. If you need to have the agent + on ARM, you need to build the agent yourself, and install them through the + ``packages`` section of the bootstrap-vz manifest + +Manifests: + +- Running puppet manifests is not recommended and untested, see below + +Assets: + +- The assets path must be ABSOLUTE to your manifest file. + +install_modules: + +- It assumes installing the given list of tuples of modules with the following + command: + "... install --force $module_name (--version $version_number)" + The module name is mandatory, the version is optional. When no version is + given, it will pick the master version of the + module from `` +- It assumes the modules are installed into the "production" environment. + Installing into another environment e.g. develop, is currently not + implemented. +- You cannot include local modules this way, to include you homebrewn modules, + You need to inject them through the assets directive. + +UNTESTED: + +- Enabling the agent and applying the manifest inside the chrooted environment. + Keep in mind that when applying a manifest when enabling the agent option, + the system is in a chrooted environment. This can prevent daemons from + running properly (e.g. listening to ports), they will also need to be shut + down gracefully (which bootstrap-vz cannot do) before unmounting the + volume. It is advisable to avoid starting any daemons inside the chroot at + all. diff --git a/bootstrapvz/plugins/puppet/__init__.py b/bootstrapvz/plugins/puppet/__init__.py index a1f3765..55ac88f 100644 --- a/bootstrapvz/plugins/puppet/__init__.py +++ b/bootstrapvz/plugins/puppet/__init__.py @@ -7,12 +7,17 @@ def validate_manifest(data, validator, error): def resolve_tasks(taskset, manifest): - taskset.add(tasks.AddPackages) + taskset.add(tasks.CheckRequestedDebianRelease) + taskset.add(tasks.AddPuppetlabsPC1SourcesList) + taskset.add(tasks.InstallPuppetlabsPC1ReleaseKey) + taskset.add(tasks.InstallPuppetAgent) if 'assets' in manifest.plugins['puppet']: taskset.add(tasks.CheckAssetsPath) taskset.add(tasks.CopyPuppetAssets) if 'manifest' in manifest.plugins['puppet']: taskset.add(tasks.CheckManifestPath) taskset.add(tasks.ApplyPuppetManifest) + if 'install_modules' in manifest.plugins['puppet']: + taskset.add(tasks.InstallModules) if manifest.plugins['puppet'].get('enable_agent', False): taskset.add(tasks.EnableAgent) diff --git a/bootstrapvz/plugins/puppet/assets/gpg-keyrings-PC1/jessie/puppetlabs-pc1-keyring.gpg b/bootstrapvz/plugins/puppet/assets/gpg-keyrings-PC1/jessie/puppetlabs-pc1-keyring.gpg new file mode 100644 index 0000000000000000000000000000000000000000..33a7a49381d5c3e36694600df481229bcd22f9cc GIT binary patch literal 12283 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