r10k 3.5.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitattributes +1 -0
- data/.github/pull_request_template.md +1 -0
- data/.github/workflows/docker.yml +56 -0
- data/.github/workflows/release.yml +36 -0
- data/.gitignore +9 -0
- data/.travis.yml +45 -0
- data/CHANGELOG.mkd +1759 -0
- data/CODEOWNERS +2 -0
- data/CONTRIBUTING.mkd +105 -0
- data/Gemfile +15 -0
- data/LICENSE +14 -0
- data/README.mkd +118 -0
- data/Rakefile +3 -0
- data/azure-pipelines.yml +86 -0
- data/bin/r10k +17 -0
- data/doc/common-patterns.mkd +44 -0
- data/doc/dynamic-environments.mkd +31 -0
- data/doc/dynamic-environments/configuration.mkd +669 -0
- data/doc/dynamic-environments/git-environments.mkd +75 -0
- data/doc/dynamic-environments/introduction.mkd +69 -0
- data/doc/dynamic-environments/master-configuration.mkd +40 -0
- data/doc/dynamic-environments/quickstart.mkd +201 -0
- data/doc/dynamic-environments/svn-environments.mkd +45 -0
- data/doc/dynamic-environments/usage.mkd +132 -0
- data/doc/dynamic-environments/workflow-guide.mkd +247 -0
- data/doc/faq.mkd +164 -0
- data/doc/git/cloning-and-mirroring.mkd +60 -0
- data/doc/git/providers.mkd +111 -0
- data/doc/puppetfile.mkd +309 -0
- data/doc/updating-your-puppetfile.mkd +38 -0
- data/docker/.gitignore +1 -0
- data/docker/.rspec +4 -0
- data/docker/Gemfile +11 -0
- data/docker/Makefile +89 -0
- data/docker/README.md +28 -0
- data/docker/r10k/Dockerfile +67 -0
- data/docker/r10k/adduser.sh +13 -0
- data/docker/r10k/docker-entrypoint.d/10-analytics.sh +30 -0
- data/docker/r10k/docker-entrypoint.sh +11 -0
- data/docker/r10k/release.Dockerfile +54 -0
- data/docker/spec/dockerfile_spec.rb +43 -0
- data/docker/spec/fixtures/Puppetfile +2 -0
- data/integration/Gemfile +19 -0
- data/integration/README.mkd +29 -0
- data/integration/Rakefile +77 -0
- data/integration/component/pre-suite/05_install_dev_r10k.rb +12 -0
- data/integration/files/README.mkd +4 -0
- data/integration/files/hiera.yaml +8 -0
- data/integration/files/modules/helloworld/manifests/init.pp +3 -0
- data/integration/files/modules/hieratest/manifests/init.pp +3 -0
- data/integration/files/modules/unicode/files/pretend_unicode +1 -0
- data/integration/files/modules/unicode/manifests/init.pp +6 -0
- data/integration/files/pre-suite/git_config.pp.erb +19 -0
- data/integration/files/pre-suite/prod_env.config +3 -0
- data/integration/files/r10k_conf.yaml.erb +9 -0
- data/integration/lib/README.mkd +4 -0
- data/integration/lib/git_utils.rb +205 -0
- data/integration/lib/master_manipulator.rb +205 -0
- data/integration/lib/r10k_utils.rb +222 -0
- data/integration/manifests/README.mkd +4 -0
- data/integration/pre-suite/00_pe_install.rb +6 -0
- data/integration/pre-suite/10_git_config.rb +48 -0
- data/integration/pre-suite/20_pe_r10k.rb +55 -0
- data/integration/pre-suite/README.mkd +5 -0
- data/integration/tests/Puppetfile/HTTP_PROXY_affects_forge_source.rb +72 -0
- data/integration/tests/Puppetfile/HTTP_PROXY_affects_git_source.rb +70 -0
- data/integration/tests/README.mkd +4 -0
- data/integration/tests/basic_functionality/install_pe_only_module_with_puppetfile.rb +83 -0
- data/integration/tests/basic_functionality/negative/neg_deploy_with_invalid_r10k_yaml.rb +51 -0
- data/integration/tests/basic_functionality/negative/neg_deploy_with_missing_r10k_yaml.rb +28 -0
- data/integration/tests/basic_functionality/negative/neg_invalid_git_provider.rb +45 -0
- data/integration/tests/basic_functionality/negative/negative_bad_proxy.rb +34 -0
- data/integration/tests/basic_functionality/proxy_specified_in_configuration.rb +103 -0
- data/integration/tests/basic_functionality/proxy_with_pe_only_module.rb +128 -0
- data/integration/tests/basic_functionality/proxy_with_puppetfile.rb +61 -0
- data/integration/tests/basic_functionality/rugged_git_provider_with_ssh.rb +109 -0
- data/integration/tests/basic_functionality/rugged_git_provider_without_ssh.rb +108 -0
- data/integration/tests/command_line/deploy_env_without_mod_update.rb +76 -0
- data/integration/tests/command_line/negative/neg_deploy_env_with_module_update.rb +77 -0
- data/integration/tests/command_line/negative/neg_invalid_cmd_line_arg.rb +23 -0
- data/integration/tests/git_source/HTTP_proxy_and_git_source.rb +70 -0
- data/integration/tests/git_source/git_source_git.rb +128 -0
- data/integration/tests/git_source/git_source_ssh.rb +87 -0
- data/integration/tests/git_source/git_source_submodule.rb +70 -0
- data/integration/tests/git_source/negative/neg_git_broken_remote.rb +38 -0
- data/integration/tests/git_source/negative/neg_git_unauthorized_https.rb +46 -0
- data/integration/tests/git_source/negative/neg_git_unauthorized_ssh.rb +73 -0
- data/integration/tests/git_source/negative/neg_git_unicode_branch.rb +35 -0
- data/integration/tests/i18n/deploy_module_with_unicode_in_file_name.rb +64 -0
- data/integration/tests/purging/content_not_purged_at_root.rb +89 -0
- data/integration/tests/purging/default_purging.rb +125 -0
- data/integration/tests/purging/does_not_purge_files_on_white_list.rb +93 -0
- data/integration/tests/purging/invalid_whitelist_types.rb +63 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_1000_branches.rb +66 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module.rb +111 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_custom_forge_git_module_static.rb +117 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_hiera.rb +100 -0
- data/integration/tests/user_scenario/basic_workflow/multi_env_multi_source.rb +133 -0
- data/integration/tests/user_scenario/basic_workflow/multi_source_custom_forge_git_module.rb +161 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_basedir.rb +46 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_forge_module.rb +48 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module.rb +45 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_module_ref.rb +43 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_bad_git_remote.rb +45 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_branch_name_collision.rb +64 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_disk_full.rb +75 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_duplicate_module_names.rb +44 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_inaccessible_forge.rb +58 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_env_name.rb +34 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_invalid_puppet_file.rb +36 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_module_specified_at_deleted_release.rb +49 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_read_only.rb +58 -0
- data/integration/tests/user_scenario/basic_workflow/negative/neg_specify_deleted_forge_module.rb +51 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_10000_files.rb +75 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_git_module.rb +104 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_forge_module.rb +81 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_custom_module.rb +49 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_large_files.rb +75 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_module_already_installed.rb +82 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_module_last_release_deleted.rb +68 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_non-existent_base_dir.rb +94 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_purge_unmanaged_modules.rb +93 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_switch_forge_git_module.rb +117 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_unicode_paths.rb +60 -0
- data/integration/tests/user_scenario/basic_workflow/single_env_upgrade_forge_mod_revert_change.rb +166 -0
- data/integration/tests/user_scenario/complex_workflow/multi_env_add_change_remove.rb +163 -0
- data/integration/tests/user_scenario/complex_workflow/multi_env_remove_re-add.rb +111 -0
- data/integration/tests/user_scenario/complex_workflow/multi_env_unamanaged.rb +78 -0
- data/integration/tests/user_scenario/complex_workflow/single_env_git_module_update.rb +100 -0
- data/lib/r10k.rb +11 -0
- data/lib/r10k/action/base.rb +31 -0
- data/lib/r10k/action/cri_runner.rb +72 -0
- data/lib/r10k/action/deploy.rb +9 -0
- data/lib/r10k/action/deploy/deploy_helpers.rb +34 -0
- data/lib/r10k/action/deploy/display.rb +89 -0
- data/lib/r10k/action/deploy/environment.rb +196 -0
- data/lib/r10k/action/deploy/module.rb +84 -0
- data/lib/r10k/action/puppetfile.rb +10 -0
- data/lib/r10k/action/puppetfile/check.rb +31 -0
- data/lib/r10k/action/puppetfile/cri_runner.rb +26 -0
- data/lib/r10k/action/puppetfile/install.rb +45 -0
- data/lib/r10k/action/puppetfile/purge.rb +28 -0
- data/lib/r10k/action/runner.rb +96 -0
- data/lib/r10k/action/visitor.rb +31 -0
- data/lib/r10k/cli.rb +51 -0
- data/lib/r10k/cli/deploy.rb +114 -0
- data/lib/r10k/cli/ext/logging.rb +15 -0
- data/lib/r10k/cli/help.rb +7 -0
- data/lib/r10k/cli/puppetfile.rb +74 -0
- data/lib/r10k/cli/version.rb +31 -0
- data/lib/r10k/deployment.rb +132 -0
- data/lib/r10k/deployment/config.rb +56 -0
- data/lib/r10k/environment.rb +37 -0
- data/lib/r10k/environment/bare.rb +16 -0
- data/lib/r10k/environment/base.rb +150 -0
- data/lib/r10k/environment/git.rb +81 -0
- data/lib/r10k/environment/name.rb +86 -0
- data/lib/r10k/environment/svn.rb +91 -0
- data/lib/r10k/environment/with_modules.rb +139 -0
- data/lib/r10k/errors.rb +61 -0
- data/lib/r10k/errors/formatting.rb +28 -0
- data/lib/r10k/feature.rb +56 -0
- data/lib/r10k/feature/collection.rb +23 -0
- data/lib/r10k/features.rb +20 -0
- data/lib/r10k/forge/module_release.rb +228 -0
- data/lib/r10k/git.rb +196 -0
- data/lib/r10k/git/alternates.rb +63 -0
- data/lib/r10k/git/cache.rb +108 -0
- data/lib/r10k/git/errors.rb +34 -0
- data/lib/r10k/git/rugged.rb +17 -0
- data/lib/r10k/git/rugged/bare_repository.rb +85 -0
- data/lib/r10k/git/rugged/base_repository.rb +93 -0
- data/lib/r10k/git/rugged/cache.rb +11 -0
- data/lib/r10k/git/rugged/credentials.rb +91 -0
- data/lib/r10k/git/rugged/thin_repository.rb +89 -0
- data/lib/r10k/git/rugged/working_repository.rb +145 -0
- data/lib/r10k/git/shellgit.rb +9 -0
- data/lib/r10k/git/shellgit/bare_repository.rb +43 -0
- data/lib/r10k/git/shellgit/base_repository.rb +137 -0
- data/lib/r10k/git/shellgit/cache.rb +11 -0
- data/lib/r10k/git/shellgit/thin_repository.rb +69 -0
- data/lib/r10k/git/shellgit/working_repository.rb +111 -0
- data/lib/r10k/git/stateful_repository.rb +95 -0
- data/lib/r10k/initializers.rb +67 -0
- data/lib/r10k/instance_cache.rb +32 -0
- data/lib/r10k/keyed_factory.rb +39 -0
- data/lib/r10k/logging.rb +109 -0
- data/lib/r10k/logging/terminaloutputter.rb +36 -0
- data/lib/r10k/module.rb +38 -0
- data/lib/r10k/module/base.rb +113 -0
- data/lib/r10k/module/forge.rb +177 -0
- data/lib/r10k/module/git.rb +109 -0
- data/lib/r10k/module/local.rb +36 -0
- data/lib/r10k/module/metadata_file.rb +31 -0
- data/lib/r10k/module/svn.rb +112 -0
- data/lib/r10k/puppetfile.rb +286 -0
- data/lib/r10k/settings.rb +194 -0
- data/lib/r10k/settings/collection.rb +123 -0
- data/lib/r10k/settings/container.rb +97 -0
- data/lib/r10k/settings/definition.rb +124 -0
- data/lib/r10k/settings/enum_definition.rb +30 -0
- data/lib/r10k/settings/helpers.rb +38 -0
- data/lib/r10k/settings/list.rb +107 -0
- data/lib/r10k/settings/loader.rb +99 -0
- data/lib/r10k/settings/mixin.rb +54 -0
- data/lib/r10k/settings/uri_definition.rb +19 -0
- data/lib/r10k/source.rb +42 -0
- data/lib/r10k/source/base.rb +74 -0
- data/lib/r10k/source/exec.rb +51 -0
- data/lib/r10k/source/git.rb +142 -0
- data/lib/r10k/source/hash.rb +182 -0
- data/lib/r10k/source/svn.rb +136 -0
- data/lib/r10k/source/yaml.rb +20 -0
- data/lib/r10k/source/yamldir.rb +32 -0
- data/lib/r10k/svn.rb +6 -0
- data/lib/r10k/svn/remote.rb +68 -0
- data/lib/r10k/svn/working_dir.rb +125 -0
- data/lib/r10k/util/attempt.rb +84 -0
- data/lib/r10k/util/basedir.rb +65 -0
- data/lib/r10k/util/commands.rb +31 -0
- data/lib/r10k/util/exec_env.rb +36 -0
- data/lib/r10k/util/license.rb +24 -0
- data/lib/r10k/util/platform.rb +42 -0
- data/lib/r10k/util/purgeable.rb +88 -0
- data/lib/r10k/util/setopts.rb +55 -0
- data/lib/r10k/util/subprocess.rb +84 -0
- data/lib/r10k/util/subprocess/result.rb +56 -0
- data/lib/r10k/util/subprocess/runner.rb +26 -0
- data/lib/r10k/util/subprocess/runner/jruby.rb +23 -0
- data/lib/r10k/util/subprocess/runner/posix.rb +103 -0
- data/lib/r10k/util/subprocess/runner/pump.rb +59 -0
- data/lib/r10k/util/subprocess/runner/windows.rb +23 -0
- data/lib/r10k/util/subprocess/subprocess_error.rb +24 -0
- data/lib/r10k/util/symbolize_keys.rb +35 -0
- data/lib/r10k/version.rb +6 -0
- data/locales/config.yaml +21 -0
- data/locales/r10k.pot +545 -0
- data/r10k.gemspec +50 -0
- data/r10k.yaml.example +112 -0
- data/spec/fixtures/empty/.empty +0 -0
- data/spec/fixtures/integration/git/puppet-boolean-bare.tar +0 -0
- data/spec/fixtures/module/forge/bad_module/metadata.json +1 -0
- data/spec/fixtures/module/forge/eight_hundred/Modulefile +8 -0
- data/spec/fixtures/module/forge/eight_hundred/metadata.json +19 -0
- data/spec/fixtures/unit/action/r10k.yaml +5 -0
- data/spec/fixtures/unit/action/r10k_cachedir.yaml +2 -0
- data/spec/fixtures/unit/action/r10k_generate_types.yaml +3 -0
- data/spec/fixtures/unit/action/r10k_puppet_path.yaml +3 -0
- data/spec/fixtures/unit/puppetfile/argument-error/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/default-branch-override/Puppetfile +5 -0
- data/spec/fixtures/unit/puppetfile/duplicate-module-error/Puppetfile +10 -0
- data/spec/fixtures/unit/puppetfile/invalid-syntax/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/load-error/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/name-error/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/valid-forge-with-version/Puppetfile +1 -0
- data/spec/fixtures/unit/puppetfile/valid-forge-without-version/Puppetfile +1 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/expected_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_expected_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/managed_subdir_1/subdir_unmanaged_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_one/unmanaged_1 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_two/expected_2 +0 -0
- data/spec/fixtures/unit/util/purgeable/managed_two/unmanaged_2 +0 -0
- data/spec/fixtures/unit/util/subprocess/runner/no-execute.sh +3 -0
- data/spec/integration/git/rugged/bare_repository_spec.rb +13 -0
- data/spec/integration/git/rugged/thin_repository_spec.rb +14 -0
- data/spec/integration/git/rugged/working_repository_spec.rb +48 -0
- data/spec/integration/git/shellgit/bare_repository_spec.rb +13 -0
- data/spec/integration/git/shellgit/thin_repository_spec.rb +14 -0
- data/spec/integration/git/shellgit/working_repository_spec.rb +13 -0
- data/spec/integration/git/stateful_repository_spec.rb +159 -0
- data/spec/matchers/exit_with.rb +28 -0
- data/spec/matchers/match_realpath.rb +18 -0
- data/spec/r10k-mocks.rb +3 -0
- data/spec/r10k-mocks/mock_config.rb +33 -0
- data/spec/r10k-mocks/mock_env.rb +15 -0
- data/spec/r10k-mocks/mock_source.rb +13 -0
- data/spec/shared-contexts/git-fixtures.rb +55 -0
- data/spec/shared-examples/deploy-actions.rb +69 -0
- data/spec/shared-examples/git-repository.rb +38 -0
- data/spec/shared-examples/git/bare_repository.rb +132 -0
- data/spec/shared-examples/git/thin_repository.rb +26 -0
- data/spec/shared-examples/git/working_repository.rb +207 -0
- data/spec/shared-examples/puppetfile-action.rb +39 -0
- data/spec/shared-examples/settings/ancestry.rb +44 -0
- data/spec/shared-examples/subprocess-runner.rb +83 -0
- data/spec/spec_helper.rb +40 -0
- data/spec/unit/action/cri_runner_spec.rb +72 -0
- data/spec/unit/action/deploy/deploy_helpers_spec.rb +38 -0
- data/spec/unit/action/deploy/display_spec.rb +31 -0
- data/spec/unit/action/deploy/environment_spec.rb +395 -0
- data/spec/unit/action/deploy/module_spec.rb +139 -0
- data/spec/unit/action/puppetfile/check_spec.rb +41 -0
- data/spec/unit/action/puppetfile/cri_runner_spec.rb +47 -0
- data/spec/unit/action/puppetfile/install_spec.rb +84 -0
- data/spec/unit/action/puppetfile/purge_spec.rb +42 -0
- data/spec/unit/action/runner_spec.rb +213 -0
- data/spec/unit/action/visitor_spec.rb +39 -0
- data/spec/unit/cli_spec.rb +9 -0
- data/spec/unit/deployment/config_spec.rb +33 -0
- data/spec/unit/deployment_spec.rb +162 -0
- data/spec/unit/environment/base_spec.rb +109 -0
- data/spec/unit/environment/git_spec.rb +97 -0
- data/spec/unit/environment/name_spec.rb +135 -0
- data/spec/unit/environment/svn_spec.rb +133 -0
- data/spec/unit/errors/formatting_spec.rb +84 -0
- data/spec/unit/feature_spec.rb +50 -0
- data/spec/unit/forge/module_release_spec.rb +213 -0
- data/spec/unit/git/alternates_spec.rb +116 -0
- data/spec/unit/git/cache_spec.rb +55 -0
- data/spec/unit/git/rugged/cache_spec.rb +29 -0
- data/spec/unit/git/rugged/credentials_spec.rb +109 -0
- data/spec/unit/git/shellgit/cache_spec.rb +27 -0
- data/spec/unit/git/stateful_repository_spec.rb +40 -0
- data/spec/unit/git_spec.rb +102 -0
- data/spec/unit/initializers_spec.rb +68 -0
- data/spec/unit/instance_cache_spec.rb +78 -0
- data/spec/unit/keyed_factory_spec.rb +51 -0
- data/spec/unit/logging/terminaloutputter_spec.rb +53 -0
- data/spec/unit/logging_spec.rb +68 -0
- data/spec/unit/module/base_spec.rb +72 -0
- data/spec/unit/module/forge_spec.rb +207 -0
- data/spec/unit/module/git_spec.rb +274 -0
- data/spec/unit/module/metadata_file_spec.rb +68 -0
- data/spec/unit/module/svn_spec.rb +178 -0
- data/spec/unit/module_spec.rb +29 -0
- data/spec/unit/puppetfile_spec.rb +300 -0
- data/spec/unit/settings/collection_spec.rb +123 -0
- data/spec/unit/settings/container_spec.rb +92 -0
- data/spec/unit/settings/definition_spec.rb +79 -0
- data/spec/unit/settings/enum_definition_spec.rb +20 -0
- data/spec/unit/settings/inheritance_spec.rb +38 -0
- data/spec/unit/settings/list_spec.rb +88 -0
- data/spec/unit/settings/loader_spec.rb +110 -0
- data/spec/unit/settings/uri_definition_spec.rb +23 -0
- data/spec/unit/settings_spec.rb +246 -0
- data/spec/unit/source/base_spec.rb +31 -0
- data/spec/unit/source/exec_spec.rb +81 -0
- data/spec/unit/source/git_spec.rb +185 -0
- data/spec/unit/source/hash_spec.rb +54 -0
- data/spec/unit/source/svn_spec.rb +196 -0
- data/spec/unit/source/yaml_spec.rb +42 -0
- data/spec/unit/source_spec.rb +10 -0
- data/spec/unit/svn/remote_spec.rb +21 -0
- data/spec/unit/svn/working_dir_spec.rb +56 -0
- data/spec/unit/util/attempt_spec.rb +82 -0
- data/spec/unit/util/commands_spec.rb +61 -0
- data/spec/unit/util/exec_env_spec.rb +56 -0
- data/spec/unit/util/purgeable_spec.rb +230 -0
- data/spec/unit/util/setopts_spec.rb +59 -0
- data/spec/unit/util/subprocess/result_spec.rb +36 -0
- data/spec/unit/util/subprocess/runner/posix_spec.rb +7 -0
- data/spec/unit/util/subprocess/runner/pump_spec.rb +79 -0
- data/spec/unit/util/subprocess/runner/windows_spec.rb +7 -0
- data/spec/unit/util/subprocess/subprocess_error_spec.rb +26 -0
- data/spec/unit/util/subprocess_spec.rb +65 -0
- data/spec/unit/util/symbolize_keys_spec.rb +67 -0
- metadata +582 -0
data/CODEOWNERS
ADDED
data/CONTRIBUTING.mkd
ADDED
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
Contributing
|
|
2
|
+
============
|
|
3
|
+
|
|
4
|
+
## Bug reports and feature requests
|
|
5
|
+
|
|
6
|
+
Bug reports and feature requests may be filed on the [GitHub issue
|
|
7
|
+
tracker][github-issue-tracker]. When filing a bug report or feature request,
|
|
8
|
+
please spend a moment to look for existing issue reports and update those with
|
|
9
|
+
additional information if possible.
|
|
10
|
+
|
|
11
|
+
[github-issue-tracker]: https://github.com/puppetlabs/r10k/issues
|
|
12
|
+
|
|
13
|
+
### Bug reports
|
|
14
|
+
|
|
15
|
+
When filing a bug report, include as much relevant detailed information as
|
|
16
|
+
possible. Try to include the following:
|
|
17
|
+
|
|
18
|
+
* A descriptive summary of the bug
|
|
19
|
+
* When the bug first occurred
|
|
20
|
+
* What sort of events may have triggered the bug
|
|
21
|
+
* The expected behavior
|
|
22
|
+
* The actual behavior
|
|
23
|
+
* Steps to reproduce
|
|
24
|
+
|
|
25
|
+
If if you're seeing errors or crashes you can run R10K with the `-v debug2` to
|
|
26
|
+
greatly increase the log level and `--trace` to print any stack traces that may
|
|
27
|
+
be caught.
|
|
28
|
+
|
|
29
|
+
Including a reproduction environment with something like Vagrant is tremendously
|
|
30
|
+
helpful and can greatly speed up the time it takes to fix your issue!
|
|
31
|
+
|
|
32
|
+
### Feature requests
|
|
33
|
+
|
|
34
|
+
When filing a feature request, include information about how important the
|
|
35
|
+
feature is, how it would generally be used in your environment, and how often
|
|
36
|
+
this feature would be used by other users as well. Please keep in mind that
|
|
37
|
+
each added feature incurs additional maintenance costs, so feature requests
|
|
38
|
+
should strive to solve a frequent pain point for users or generally make r10k a
|
|
39
|
+
more effective tool for a large number of r10k users.
|
|
40
|
+
|
|
41
|
+
The policy towards feature requests in r10k has been greatly shaped by Brian
|
|
42
|
+
Granger's post on [features and scope in open source software][features-and-scope].
|
|
43
|
+
|
|
44
|
+
Try to include the following:
|
|
45
|
+
|
|
46
|
+
* A descriptive summary of the feature
|
|
47
|
+
* How you expect to use this feature
|
|
48
|
+
* How important this feature is for your environment
|
|
49
|
+
* How useful this feature would be for other users
|
|
50
|
+
* Any potential caveats this may have or any issues this feature may have
|
|
51
|
+
|
|
52
|
+
[features-and-scope]: http://brianegranger.com/?p=249 "Features and Scope in Open Source Software"
|
|
53
|
+
|
|
54
|
+
## Documentation
|
|
55
|
+
|
|
56
|
+
Contributing fixes and improvements to the core documentation is a great way to
|
|
57
|
+
help improve R10K. Improvements to the FAQ, example code, and so forth can go a
|
|
58
|
+
long way towards making R10K more approachable for new users and existing users
|
|
59
|
+
alike. For more information about the submission process please see the section
|
|
60
|
+
on [code contributions](#code-contributions).
|
|
61
|
+
|
|
62
|
+
## Code contributions
|
|
63
|
+
|
|
64
|
+
This documentation is based on the Project Hydra
|
|
65
|
+
[CONTRIBUTING](https://github.com/projecthydra/hydra-head/blob/master/CONTRIBUTING.md)
|
|
66
|
+
guide.
|
|
67
|
+
|
|
68
|
+
### Making changes
|
|
69
|
+
|
|
70
|
+
* Fork the repository on GitHub
|
|
71
|
+
* Create a topic branch from where you want to base your work.
|
|
72
|
+
* For new features, base your code off of 'master'.
|
|
73
|
+
* For critical bugfixes, base your code off of the appropriate maintenance
|
|
74
|
+
branch series, eg '1.2.x' or '1.3.x'
|
|
75
|
+
* To create a new topic branch; `git checkout -b fix/master/my_contribution master`
|
|
76
|
+
* Please avoid working directly on the 'master' branch.
|
|
77
|
+
* Make commits of logical units.
|
|
78
|
+
* Your commit message should include a high level description of your work.
|
|
79
|
+
* Check for unnecessary whitespace with `git diff --check` before committing.
|
|
80
|
+
|
|
81
|
+
```
|
|
82
|
+
[code/subsystem] (GH-#) Present tense short summary (80 characters or less)
|
|
83
|
+
|
|
84
|
+
More detailed description, if necessary. It should be wrapped to 80
|
|
85
|
+
characters. Try to be as descriptive as you can, even if you think that
|
|
86
|
+
the commit content is obvious, it may not be obvious to others. You
|
|
87
|
+
should add such description also if it's already present in bug tracker,
|
|
88
|
+
it should not be necessary to visit a webpage to check the history.
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
* Make sure you have added the necessary tests for your changes.
|
|
92
|
+
* Run _all_ the tests to assure nothing else was accidentally broken.
|
|
93
|
+
|
|
94
|
+
### Submitting changes
|
|
95
|
+
|
|
96
|
+
* Push your changes to a topic branch in your fork of the repository.
|
|
97
|
+
* Submit a pull request from your fork to the project.
|
|
98
|
+
* Expect to have some further discussion of your submission prior to it being merged.
|
|
99
|
+
|
|
100
|
+
Please note - code review is an essential part of the code review and submission
|
|
101
|
+
process. In order to keep the code base clean and maintainable questions may be
|
|
102
|
+
asked on implementation decisions and you may be asked to make additional
|
|
103
|
+
changes to the contribution. Remember - feedback is never personal and should be
|
|
104
|
+
given to benefit both the submitter as well as the project receiving the
|
|
105
|
+
contribution.
|
data/Gemfile
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
source ENV['GEM_SOURCE'] || 'https://rubygems.org'
|
|
2
|
+
gemspec
|
|
3
|
+
|
|
4
|
+
group :extra do
|
|
5
|
+
gem 'rugged', '~> 1.0', :platforms => :ruby
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
group :development do
|
|
9
|
+
gem 'simplecov', '~> 0.9.1'
|
|
10
|
+
gem 'ruby-prof', :platforms => :ruby
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
if File.exists? "#{__FILE__}.local"
|
|
14
|
+
eval(File.read("#{__FILE__}.local"), binding)
|
|
15
|
+
end
|
data/LICENSE
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
Copyright 2013, 2014 Adrien Thebo
|
|
2
|
+
|
|
3
|
+
Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
you may not use this file except in compliance with the License.
|
|
5
|
+
You may obtain a copy of the License at
|
|
6
|
+
|
|
7
|
+
http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
|
|
9
|
+
Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
See the License for the specific language governing permissions and
|
|
13
|
+
limitations under the License.
|
|
14
|
+
|
data/README.mkd
ADDED
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
r10k
|
|
2
|
+
====
|
|
3
|
+
|
|
4
|
+
Puppet environment and module deployment
|
|
5
|
+
|
|
6
|
+
[](https://travis-ci.org/puppetlabs/r10k)
|
|
7
|
+
|
|
8
|
+
Description
|
|
9
|
+
-----------
|
|
10
|
+
|
|
11
|
+
[workflow]: https://puppet.com/docs/puppet/latest/environments_about.html
|
|
12
|
+
|
|
13
|
+
R10k provides a general purpose toolset for deploying Puppet environments and
|
|
14
|
+
modules. It implements the [Puppetfile](doc/puppetfile.mkd) format and provides a native
|
|
15
|
+
implementation of Puppet [environments][workflow].
|
|
16
|
+
|
|
17
|
+
Requirements
|
|
18
|
+
------------
|
|
19
|
+
|
|
20
|
+
R10k supports the Ruby versions `>= 2.3.0`. It's tested on Ruby 2.3.0 up to
|
|
21
|
+
Ruby 2.6.0 + Jruby.
|
|
22
|
+
|
|
23
|
+
R10k requires additional components, depending on how you plan on managing
|
|
24
|
+
environments and modules.
|
|
25
|
+
|
|
26
|
+
- Installing modules from the Puppet Forge requires Puppet 5.0.0+ or later.
|
|
27
|
+
Puppet 3 or 4 may work, but is generally not recommended.
|
|
28
|
+
- Git is required for creating environments and modules from Git
|
|
29
|
+
- SVN is required for creating environments and modules from SVN
|
|
30
|
+
|
|
31
|
+
Installation
|
|
32
|
+
------------
|
|
33
|
+
|
|
34
|
+
### Rubygems
|
|
35
|
+
|
|
36
|
+
For general use, you should install r10k from Ruby gems:
|
|
37
|
+
|
|
38
|
+
gem install r10k
|
|
39
|
+
r10k help
|
|
40
|
+
|
|
41
|
+
### Puppet Enterprise 3.x
|
|
42
|
+
|
|
43
|
+
Puppet Enterprise bundles a copy of Ruby, so if you do not want to use the
|
|
44
|
+
system version of Ruby with r10k, you need to use the bundled PE gem command for
|
|
45
|
+
installation:
|
|
46
|
+
|
|
47
|
+
/opt/puppet/bin/gem install r10k
|
|
48
|
+
r10k help
|
|
49
|
+
|
|
50
|
+
### Puppet 4
|
|
51
|
+
|
|
52
|
+
Puppet 4 bundles a copy of Ruby, so if you do not want to use the
|
|
53
|
+
system version of Ruby with r10k, you need to use the bundled puppet gem command
|
|
54
|
+
for installation.
|
|
55
|
+
|
|
56
|
+
/opt/puppetlabs/puppet/bin/gem install r10k
|
|
57
|
+
/opt/puppetlabs/puppet/bin/r10k help
|
|
58
|
+
|
|
59
|
+
### Bundler
|
|
60
|
+
|
|
61
|
+
If you have more specific needs or plan on modifying r10k you can run it out of
|
|
62
|
+
a git repository using Bundler for dependencies:
|
|
63
|
+
|
|
64
|
+
git clone git://github.com/puppetlabs/r10k
|
|
65
|
+
cd r10k
|
|
66
|
+
bundle install
|
|
67
|
+
bundle exec r10k help
|
|
68
|
+
|
|
69
|
+
Usage
|
|
70
|
+
-----
|
|
71
|
+
|
|
72
|
+
R10k has two primary roles: installing Puppet modules using a standalone
|
|
73
|
+
Puppetfile, and managing Git and SVN based dynamic environments. For more
|
|
74
|
+
information see the topic specific documentation:
|
|
75
|
+
|
|
76
|
+
* [Puppetfile Documentation](doc/puppetfile.mkd)
|
|
77
|
+
* [Updating your Puppetfile](doc/updating-your-puppetfile.mkd)
|
|
78
|
+
* [Environment Deployment Documentation](doc/dynamic-environments.mkd)
|
|
79
|
+
* [Quickstart](doc/dynamic-environments/quickstart.mkd)
|
|
80
|
+
* [Common Patterns](doc/common-patterns.mkd)
|
|
81
|
+
* [Workflow Guide](doc/dynamic-environments/workflow-guide.mkd)
|
|
82
|
+
|
|
83
|
+
For more general questions, see the [FAQ](doc/faq.mkd).
|
|
84
|
+
|
|
85
|
+
Development
|
|
86
|
+
-----------
|
|
87
|
+
|
|
88
|
+
### i18n
|
|
89
|
+
|
|
90
|
+
R10k has now had all user-facing strings in error messages and log messages
|
|
91
|
+
externalized. When adding new error or log messages please follow the
|
|
92
|
+
instructions for [writing translatable code](https://github.com/puppetlabs/gettext-setup-gem#writing-translatable-code).
|
|
93
|
+
|
|
94
|
+
### l10n
|
|
95
|
+
|
|
96
|
+
When localizing the strings found in R10k, follow the prescribed
|
|
97
|
+
[translation workflow](https://github.com/puppetlabs/gettext-setup-gem#translation-workflow).
|
|
98
|
+
The workflow describes the rake tasks provided to generate the .po files for
|
|
99
|
+
each locale.
|
|
100
|
+
|
|
101
|
+
Getting help
|
|
102
|
+
------------
|
|
103
|
+
|
|
104
|
+
* IRC: r10k has a dedicated channel, `#r10k`, on Freenode where r10k questions
|
|
105
|
+
can be directed. Questions about r10k can frequently be asked in `#puppet` as well.
|
|
106
|
+
* Mailing lists: [puppet-users](https://groups.google.com/forum/#!forum/puppet-users)
|
|
107
|
+
* Q&A: [Puppet Ask](https://ask.puppetlabs.com/questions/)
|
|
108
|
+
|
|
109
|
+
Contributors
|
|
110
|
+
------------
|
|
111
|
+
|
|
112
|
+
Please see the CHANGELOG for a listing of the (very awesome) contributors.
|
|
113
|
+
|
|
114
|
+
## Maintenance
|
|
115
|
+
|
|
116
|
+
See [MAINTAINERS](MAINTAINERS) (json file)
|
|
117
|
+
|
|
118
|
+
Tickets: File at https://tickets.puppet.com/browse/RK
|
data/Rakefile
ADDED
data/azure-pipelines.yml
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
# Don't run Azure when a branch is updated, only when a PR is updated.
|
|
2
|
+
# Prevents double builds when a PR is made from the main repo and not a fork.
|
|
3
|
+
trigger: none
|
|
4
|
+
pr:
|
|
5
|
+
autoCancel: true
|
|
6
|
+
branches:
|
|
7
|
+
include:
|
|
8
|
+
- '*'
|
|
9
|
+
|
|
10
|
+
pool:
|
|
11
|
+
# self-hosted agent on Windows 10 1903 environment
|
|
12
|
+
# includes newer Docker engine with LCOW enabled, new build of LCOW image
|
|
13
|
+
# includes Ruby 2.5, Go 1.10, Node.js 10.10
|
|
14
|
+
name: Default
|
|
15
|
+
|
|
16
|
+
variables:
|
|
17
|
+
NAMESPACE: puppet
|
|
18
|
+
CONTAINER_NAME: r10k
|
|
19
|
+
CONTAINER_BUILD_PATH: .
|
|
20
|
+
LINT_IGNORES:
|
|
21
|
+
DOCKER_BUILDKIT: 1
|
|
22
|
+
|
|
23
|
+
workspace:
|
|
24
|
+
clean: resources
|
|
25
|
+
|
|
26
|
+
steps:
|
|
27
|
+
- checkout: self # self represents the repo where the initial Pipelines YAML file was found
|
|
28
|
+
clean: true # whether to fetch clean each time
|
|
29
|
+
|
|
30
|
+
- powershell: |
|
|
31
|
+
$gemfile = Join-Path -Path (Get-Location) -ChildPath 'docker/Gemfile'
|
|
32
|
+
$gempath = Join-Path -Path (Get-Location) -ChildPath 'docker/.bundle/gems'
|
|
33
|
+
bundle config --local gemfile $gemfile
|
|
34
|
+
bundle config --local path $gempath
|
|
35
|
+
bundle install --with test
|
|
36
|
+
displayName: Fetch Dependencies
|
|
37
|
+
timeoutInMinutes: 1
|
|
38
|
+
name: fetch_deps
|
|
39
|
+
|
|
40
|
+
- powershell: |
|
|
41
|
+
. "$(bundle show pupperware)/ci/build.ps1"
|
|
42
|
+
Write-HostDiagnostics
|
|
43
|
+
displayName: Diagnostic Host Information
|
|
44
|
+
timeoutInMinutes: 2
|
|
45
|
+
name: hostinfo
|
|
46
|
+
|
|
47
|
+
- powershell: |
|
|
48
|
+
. "$(bundle show pupperware)/ci/build.ps1"
|
|
49
|
+
Lint-Dockerfile -Name $ENV:CONTAINER_NAME -Ignore ($ENV:LINT_IGNORES -split ' ')
|
|
50
|
+
displayName: Lint $(CONTAINER_NAME) Dockerfile
|
|
51
|
+
timeoutInMinutes: 1
|
|
52
|
+
name: lint_dockerfile
|
|
53
|
+
|
|
54
|
+
- powershell: |
|
|
55
|
+
. "$(bundle show pupperware)/ci/build.ps1"
|
|
56
|
+
Build-Container -Name $ENV:CONTAINER_NAME -Namespace $ENV:NAMESPACE -PathOrUri $ENV:CONTAINER_BUILD_PATH
|
|
57
|
+
displayName: Build $(CONTAINER_NAME) Container
|
|
58
|
+
timeoutInMinutes: 5
|
|
59
|
+
name: build_container
|
|
60
|
+
|
|
61
|
+
- powershell: |
|
|
62
|
+
. "$(bundle show pupperware)/ci/build.ps1"
|
|
63
|
+
Initialize-TestEnv
|
|
64
|
+
displayName: Prepare Test Environment
|
|
65
|
+
name: test_prepare
|
|
66
|
+
|
|
67
|
+
- powershell: |
|
|
68
|
+
. "$(bundle show pupperware)/ci/build.ps1"
|
|
69
|
+
Invoke-ContainerTest -Name $ENV:CONTAINER_NAME -Namespace $ENV:NAMESPACE
|
|
70
|
+
displayName: Test $(CONTAINER_NAME)
|
|
71
|
+
timeoutInMinutes: 5
|
|
72
|
+
name: test_container
|
|
73
|
+
|
|
74
|
+
- task: PublishTestResults@2
|
|
75
|
+
displayName: Publish $(CONTAINER_NAME) test results
|
|
76
|
+
inputs:
|
|
77
|
+
testResultsFormat: 'JUnit'
|
|
78
|
+
testResultsFiles: 'docker/TEST-*.xml'
|
|
79
|
+
testRunTitle: $(CONTAINER_NAME) Test Results
|
|
80
|
+
|
|
81
|
+
- powershell: |
|
|
82
|
+
. "$(bundle show pupperware)/ci/build.ps1"
|
|
83
|
+
Clear-BuildState -Name $ENV:CONTAINER_NAME -Namespace $ENV:NAMESPACE
|
|
84
|
+
displayName: Container Cleanup
|
|
85
|
+
timeoutInMinutes: 4
|
|
86
|
+
condition: always()
|
data/bin/r10k
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
require 'r10k/cli'
|
|
4
|
+
require 'colored2'
|
|
5
|
+
|
|
6
|
+
begin
|
|
7
|
+
R10K::CLI.command.run(ARGV)
|
|
8
|
+
rescue Interrupt
|
|
9
|
+
$stderr.puts "r10k: Aborted!".red
|
|
10
|
+
exit(1)
|
|
11
|
+
rescue SystemExit => e
|
|
12
|
+
exit(e.status)
|
|
13
|
+
rescue Exception => e
|
|
14
|
+
$stderr.puts "\nr10k: Runtime error: #{e.inspect}".red
|
|
15
|
+
$stderr.puts e.backtrace.join("\n").red if ARGV.include? '--trace'
|
|
16
|
+
exit(1)
|
|
17
|
+
end
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
Common Patterns
|
|
2
|
+
===============
|
|
3
|
+
|
|
4
|
+
This guide provides common patterns seen in the r10k community. These patterns
|
|
5
|
+
are, of course, simply a guide. Understand why you are or are not using a
|
|
6
|
+
specific pattern before implementing it.
|
|
7
|
+
|
|
8
|
+
Repository Setup
|
|
9
|
+
----------------
|
|
10
|
+
|
|
11
|
+
Use a [Control Repo](https://docs.puppet.com/pe/latest/cmgmt_control_repo.html)
|
|
12
|
+
to store your `Puppetfile`.
|
|
13
|
+
|
|
14
|
+
Hiera data should be in the Control repo OR as a separate source in
|
|
15
|
+
`r10k.yaml`. Any `hiera.yaml` in the Control repo will be ignored on a per
|
|
16
|
+
environment basis, locating it at `/etc/puppetlabs/puppet/hiera.yaml` is prefered.
|
|
17
|
+
|
|
18
|
+
Each puppet module should be contained in its own independent forge module or
|
|
19
|
+
repository.
|
|
20
|
+
|
|
21
|
+
Editing modules
|
|
22
|
+
---------------
|
|
23
|
+
|
|
24
|
+
All environment content is checked out into `$environmentpath/modules` on the
|
|
25
|
+
node r10k is run on, either your puppet master or each masterless node. Edits
|
|
26
|
+
made directly to these files will be lost on the next deploy. It is best
|
|
27
|
+
practice not to edit code on the production system in the production paths.
|
|
28
|
+
|
|
29
|
+
You may clone upstream repositories in a regular user's directory, on the master
|
|
30
|
+
or on another machine. Create a new feature branch locally, make all required
|
|
31
|
+
edits, and push the new branch upstream when ready for testing. R10k will
|
|
32
|
+
deploy changes from the upstream repositories, eliminating the need for manual
|
|
33
|
+
updates of the `$environmentpath` contents.
|
|
34
|
+
|
|
35
|
+
Automated deploys
|
|
36
|
+
-----------------
|
|
37
|
+
|
|
38
|
+
To reduce manual intervention, use a post-receive hook on your control and
|
|
39
|
+
module repos to initiate an r10k deploy. You can develop your own or use a
|
|
40
|
+
publicly available hook. These include:
|
|
41
|
+
|
|
42
|
+
* [Reaktor](https://github.com/pzim/reaktor)
|
|
43
|
+
* [zack/r10k's Webhooks](https://forge.puppetlabs.com/zack/r10k#webhook-support)
|
|
44
|
+
(Puppet Enterprise only)
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
Dynamic Environments
|
|
2
|
+
====================
|
|
3
|
+
|
|
4
|
+
Dynamic environment deployment is the core functionality of r10k.
|
|
5
|
+
|
|
6
|
+
Table of contents
|
|
7
|
+
-----------------
|
|
8
|
+
|
|
9
|
+
* [Introduction](dynamic-environments/introduction.mkd): A brief description of
|
|
10
|
+
what dynamic environments are and how they work.
|
|
11
|
+
* [Quickstart](dynamic-environments/quickstart.mkd): Getting started with the
|
|
12
|
+
essentials of dynamic environments and r10k.
|
|
13
|
+
* [Configuration](dynamic-environments/configuration.mkd) A reference of dynamic
|
|
14
|
+
environment configuration options and how they're used
|
|
15
|
+
* [Git environments](dynamic-environments/git-environments.mkd) How r10k
|
|
16
|
+
implements dynamic environments using git
|
|
17
|
+
* [Master Configuration](dynamic-environments/master-configuration.mkd) How to
|
|
18
|
+
configure your Puppet masters to use dynamic environments
|
|
19
|
+
* [Workflow Guide](dynamic-environments/workflow-guide.mkd) A general-purpose
|
|
20
|
+
workflow guide for using r10k.
|
|
21
|
+
* [Usage](dynamic-environments/usage.mkd) A reference of r10k commands and how
|
|
22
|
+
they're used.
|
|
23
|
+
|
|
24
|
+
- - -
|
|
25
|
+
|
|
26
|
+
Community guides
|
|
27
|
+
----------------
|
|
28
|
+
|
|
29
|
+
* [Building a Functional Puppet Workflow Part 3: Dynamic Environments with R10k](http://garylarizza.com/blog/2014/02/18/puppet-workflow-part-3/)
|
|
30
|
+
* [Puppet Infrastructure with r10k](http://terrarum.net/blog/puppet-infrastructure-with-r10k.html)
|
|
31
|
+
* [Puppet for vSphere Admins](http://rnelson0.com/puppet-for-vsphere-admins/) Installing and using r10k in a vSphere environment
|