diff --git a/.fixtures.yml b/.fixtures.yml index de87dbd..5bb41ec 100644 --- a/.fixtures.yml +++ b/.fixtures.yml @@ -1,7 +1,6 @@ --- fixtures: - repositories: - stdlib: - repo: "https://github.com/puppetlabs/puppetlabs-stdlib.git" + forge_modules: + stdlib: puppetlabs/stdlib symlinks: r10k: "#{source_dir}" diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 0000000..37a7699 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,2 @@ +github: [cirrax] +custom: ["https://cirrax.com"] diff --git a/.github/workflows/pdk.yml b/.github/workflows/pdk.yml new file mode 100644 index 0000000..4012fa3 --- /dev/null +++ b/.github/workflows/pdk.yml @@ -0,0 +1,37 @@ +name: PDK + +on: + - 'push' + - 'pull_request' + +jobs: + validate: + runs-on: ubuntu-latest + container: puppet/pdk:latest + outputs: + puppet_unit_test_matrix: ${{ steps.get-outputs.outputs.puppet_unit_test_matrix }} + github_action_test_matrix: ${{ steps.get-outputs.outputs.github_action_test_matrix }} + steps: + - name: Install build-essential + run: | + export DEBIAN_FRONTEND=noninteractive; + apt-get --yes update + apt-get --yes install build-essential + - name: Check out repository code + uses: actions/checkout@v3 + - name: run pdk validate + run: pdk validate + + unit-test: + runs-on: ubuntu-latest + container: puppet/pdk:latest + steps: + - name: Install build-essential + run: | + export DEBIAN_FRONTEND=noninteractive; + apt-get --yes update + apt-get --yes install build-essential + - name: Check out repository code + uses: actions/checkout@v3 + - name: run pdk test unit + run: pdk test unit diff --git a/.gitignore b/.gitignore index 988dcbb..3f15512 100644 --- a/.gitignore +++ b/.gitignore @@ -16,7 +16,7 @@ /log/ /pkg/ /spec/fixtures/manifests/ -/spec/fixtures/modules/ +/spec/fixtures/modules/* /tmp/ /vendor/ /convert_report.txt diff --git a/.pdkignore b/.pdkignore index c538bea..862847a 100644 --- a/.pdkignore +++ b/.pdkignore @@ -16,7 +16,7 @@ /log/ /pkg/ /spec/fixtures/manifests/ -/spec/fixtures/modules/ +/spec/fixtures/modules/* /tmp/ /vendor/ /convert_report.txt @@ -26,20 +26,17 @@ .envrc /inventory.yaml /spec/fixtures/litmus_inventory.yaml -/appveyor.yml -/.editorconfig /.fixtures.yml /Gemfile /.gitattributes +/.github/ /.gitignore -/.gitlab-ci.yml /.pdkignore /.puppet-lint.rc /Rakefile /rakelib/ /.rspec -/.rubocop.yml -/.travis.yml +/..yml /.yardopts /spec/ /.vscode/ diff --git a/.rubocop.yml b/.rubocop.yml index 31e8248..5be1f9f 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -4,7 +4,7 @@ require: - rubocop-rspec AllCops: DisplayCopNames: true - TargetRubyVersion: '2.5' + TargetRubyVersion: '2.6' Include: - "**/*.rb" Exclude: @@ -111,8 +111,14 @@ Style/MethodCalledOnDoEndBlock: Enabled: true Style/StringMethods: Enabled: true +Bundler/GemFilename: + Enabled: false Bundler/InsecureProtocolSource: Enabled: false +Capybara/CurrentPathExpectation: + Enabled: false +Capybara/VisibilityMatcher: + Enabled: false Gemspec/DuplicatedAssignment: Enabled: false Gemspec/OrderedDependencies: @@ -287,11 +293,9 @@ Performance/UriDefaultParser: Enabled: false RSpec/Be: Enabled: false -RSpec/Capybara/CurrentPathExpectation: - Enabled: false RSpec/Capybara/FeatureMethods: Enabled: false -RSpec/Capybara/VisibilityMatcher: +RSpec/ContainExactly: Enabled: false RSpec/ContextMethod: Enabled: false @@ -331,6 +335,8 @@ RSpec/LeakyConstantDeclaration: Enabled: false RSpec/LetBeforeExamples: Enabled: false +RSpec/MatchArray: + Enabled: false RSpec/MissingExampleGroupArgument: Enabled: false RSpec/MultipleExpectations: @@ -373,8 +379,6 @@ Style/AccessModifierDeclarations: Enabled: false Style/AccessorGrouping: Enabled: false -Style/AsciiComments: - Enabled: false Style/BisectedAttrAccessor: Enabled: false Style/CaseLikeIf: @@ -485,35 +489,235 @@ Style/TrailingMethodEndStatement: Enabled: false Style/UnpackFirst: Enabled: false +Capybara/MatchStyle: + Enabled: false +Capybara/NegationMatcher: + Enabled: false +Capybara/SpecificActions: + Enabled: false +Capybara/SpecificFinders: + Enabled: false +Capybara/SpecificMatcher: + Enabled: false +Gemspec/DeprecatedAttributeAssignment: + Enabled: false +Gemspec/DevelopmentDependencies: + Enabled: false +Gemspec/RequireMFA: + Enabled: false +Layout/LineContinuationLeadingSpace: + Enabled: false +Layout/LineContinuationSpacing: + Enabled: false +Layout/LineEndStringConcatenationIndentation: + Enabled: false +Layout/SpaceBeforeBrackets: + Enabled: false +Lint/AmbiguousAssignment: + Enabled: false +Lint/AmbiguousOperatorPrecedence: + Enabled: false +Lint/AmbiguousRange: + Enabled: false +Lint/ConstantOverwrittenInRescue: + Enabled: false +Lint/DeprecatedConstants: + Enabled: false Lint/DuplicateBranch: Enabled: false +Lint/DuplicateMagicComment: + Enabled: false Lint/DuplicateRegexpCharacterClassElement: Enabled: false Lint/EmptyBlock: Enabled: false Lint/EmptyClass: Enabled: false +Lint/EmptyInPattern: + Enabled: false +Lint/IncompatibleIoSelectWithFiberScheduler: + Enabled: false +Lint/LambdaWithoutLiteralBlock: + Enabled: false Lint/NoReturnInBeginEndBlocks: Enabled: false +Lint/NonAtomicFileOperation: + Enabled: false +Lint/NumberedParameterAssignment: + Enabled: false +Lint/OrAssignmentToConstant: + Enabled: false +Lint/RedundantDirGlobSort: + Enabled: false +Lint/RefinementImportMethods: + Enabled: false +Lint/RequireRangeParentheses: + Enabled: false +Lint/RequireRelativeSelfPath: + Enabled: false +Lint/SymbolConversion: + Enabled: false Lint/ToEnumArguments: Enabled: false +Lint/TripleQuotes: + Enabled: false Lint/UnexpectedBlockArity: Enabled: false Lint/UnmodifiedReduceAccumulator: Enabled: false +Lint/UselessRescue: + Enabled: false +Lint/UselessRuby2Keywords: + Enabled: false +Metrics/CollectionLiteralLength: + Enabled: false +Naming/BlockForwarding: + Enabled: false Performance/CollectionLiteralInLoop: Enabled: false +Performance/ConcurrentMonotonicTime: + Enabled: false +Performance/MapCompact: + Enabled: false +Performance/RedundantEqualityComparisonBlock: + Enabled: false +Performance/RedundantSplitRegexpArgument: + Enabled: false +Performance/StringIdentifierArgument: + Enabled: false +RSpec/BeEq: + Enabled: false +RSpec/BeNil: + Enabled: false +RSpec/ChangeByZero: + Enabled: false +RSpec/ClassCheck: + Enabled: false +RSpec/DuplicatedMetadata: + Enabled: false +RSpec/ExcessiveDocstringSpacing: + Enabled: false +RSpec/FactoryBot/ConsistentParenthesesStyle: + Enabled: false +RSpec/FactoryBot/FactoryNameStyle: + Enabled: false +RSpec/FactoryBot/SyntaxMethods: + Enabled: false +RSpec/IdenticalEqualityAssertion: + Enabled: false +RSpec/NoExpectationExample: + Enabled: false +RSpec/PendingWithoutReason: + Enabled: false +RSpec/Rails/AvoidSetupHook: + Enabled: false +RSpec/Rails/HaveHttpStatus: + Enabled: false +RSpec/Rails/InferredSpecType: + Enabled: false +RSpec/Rails/MinitestAssertions: + Enabled: false +RSpec/Rails/TravelAround: + Enabled: false +RSpec/RedundantAround: + Enabled: false +RSpec/SkipBlockInsideExample: + Enabled: false +RSpec/SortMetadata: + Enabled: false +RSpec/SubjectDeclaration: + Enabled: false +RSpec/VerifiedDoubleReference: + Enabled: false +Security/CompoundHash: + Enabled: false +Security/IoMethods: + Enabled: false Style/ArgumentsForwarding: Enabled: false +Style/ArrayIntersect: + Enabled: false Style/CollectionCompact: Enabled: false +Style/ComparableClamp: + Enabled: false +Style/ConcatArrayLiterals: + Enabled: false +Style/DirEmpty: + Enabled: false Style/DocumentDynamicEvalDefinition: Enabled: false +Style/EmptyHeredoc: + Enabled: false +Style/EndlessMethod: + Enabled: false +Style/EnvHome: + Enabled: false +Style/FetchEnvVar: + Enabled: false +Style/FileEmpty: + Enabled: false +Style/FileRead: + Enabled: false +Style/FileWrite: + Enabled: false +Style/HashConversion: + Enabled: false +Style/HashExcept: + Enabled: false +Style/IfWithBooleanLiteralBranches: + Enabled: false +Style/InPatternThen: + Enabled: false +Style/MagicCommentFormat: + Enabled: false +Style/MapCompactWithConditionalBlock: + Enabled: false +Style/MapToHash: + Enabled: false +Style/MapToSet: + Enabled: false +Style/MinMaxComparison: + Enabled: false +Style/MultilineInPatternThen: + Enabled: false Style/NegatedIfElseCondition: Enabled: false +Style/NestedFileDirname: + Enabled: false Style/NilLambda: Enabled: false +Style/NumberedParameters: + Enabled: false +Style/NumberedParametersLimit: + Enabled: false +Style/ObjectThen: + Enabled: false +Style/OpenStructUse: + Enabled: false +Style/OperatorMethodCall: + Enabled: false +Style/QuotedSymbols: + Enabled: false Style/RedundantArgument: Enabled: false +Style/RedundantConstantBase: + Enabled: false +Style/RedundantDoubleSplatHashBraces: + Enabled: false +Style/RedundantEach: + Enabled: false +Style/RedundantHeredocDelimiterQuotes: + Enabled: false +Style/RedundantInitialize: + Enabled: false +Style/RedundantSelfAssignmentBranch: + Enabled: false +Style/RedundantStringEscape: + Enabled: false +Style/SelectByRegexp: + Enabled: false +Style/StringChars: + Enabled: false Style/SwapValues: Enabled: false diff --git a/Gemfile b/Gemfile index fc28658..ca0e773 100644 --- a/Gemfile +++ b/Gemfile @@ -13,22 +13,37 @@ def location_for(place_or_version, fake_version = nil) end end -ruby_version_segments = Gem::Version.new(RUBY_VERSION.dup).segments -minor_version = ruby_version_segments[0..1].join('.') - group :development do - gem "json", '= 2.0.4', require: false if Gem::Requirement.create('~> 2.4.2').satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) - gem "json", '= 2.1.0', require: false if Gem::Requirement.create(['>= 2.5.0', '< 2.7.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) - gem "json", '= 2.3.0', require: false if Gem::Requirement.create(['>= 2.7.0', '< 2.8.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) - gem "puppet-module-posix-default-r#{minor_version}", '~> 1.0', require: false, platforms: [:ruby] - gem "puppet-module-posix-dev-r#{minor_version}", '~> 1.0', require: false, platforms: [:ruby] - gem "puppet-module-win-default-r#{minor_version}", '~> 1.0', require: false, platforms: [:mswin, :mingw, :x64_mingw] - gem "puppet-module-win-dev-r#{minor_version}", '~> 1.0', require: false, platforms: [:mswin, :mingw, :x64_mingw] - gem "voxpupuli-puppet-lint-plugins", '>= 3.0', require: false + gem "json", '= 2.1.0', require: false if Gem::Requirement.create(['>= 2.5.0', '< 2.7.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) + gem "json", '= 2.3.0', require: false if Gem::Requirement.create(['>= 2.7.0', '< 3.0.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) + gem "json", '= 2.5.1', require: false if Gem::Requirement.create(['>= 3.0.0', '< 3.0.5']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) + gem "json", '= 2.6.1', require: false if Gem::Requirement.create(['>= 3.1.0', '< 3.1.3']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) + gem "json", '= 2.6.3', require: false if Gem::Requirement.create(['>= 3.2.0', '< 4.0.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) + gem "racc", '~> 1.4.0', require: false if Gem::Requirement.create(['>= 2.7.0', '< 3.0.0']).satisfied_by?(Gem::Version.new(RUBY_VERSION.dup)) + gem "voxpupuli-puppet-lint-plugins", '~> 5.0', require: false + gem "facterdb", '~> 1.18', require: false + gem "metadata-json-lint", '~> 3.0', require: false + gem "puppetlabs_spec_helper", '~> 6.0', require: false + gem "rspec-puppet-facts", '~> 2.0', require: false + gem "codecov", '~> 0.2', require: false + gem "dependency_checker", '~> 1.0.0', require: false + gem "parallel_tests", '= 3.12.1', require: false + gem "pry", '~> 0.10', require: false + gem "simplecov-console", '~> 0.5', require: false + gem "puppet-debugger", '~> 1.0', require: false + gem "rubocop", '= 1.48.1', require: false + gem "rubocop-performance", '= 1.16.0', require: false + gem "rubocop-rspec", '= 2.19.0', require: false + gem "puppet-strings", '~> 4.0', require: false + gem "rb-readline", '= 0.5.5', require: false, platforms: [:mswin, :mingw, :x64_mingw] end group :system_tests do - gem "puppet-module-posix-system-r#{minor_version}", '~> 1.0', require: false, platforms: [:ruby] - gem "puppet-module-win-system-r#{minor_version}", '~> 1.0', require: false, platforms: [:mswin, :mingw, :x64_mingw] + gem "puppet_litmus", '~> 1.0', require: false, platforms: [:ruby, :x64_mingw] + gem "serverspec", '~> 2.41', require: false +end +group :release_prep do + gem "puppet-strings", '~> 4.0', require: false + gem "puppetlabs_spec_helper", '~> 6.0', require: false end puppet_version = ENV['PUPPET_GEM_VERSION'] diff --git a/README.md b/README.md index 3d55992..42a8143 100644 --- a/README.md +++ b/README.md @@ -64,6 +64,9 @@ fetch git repositories. none +## Remarks +if you install r10k with the gem provider (default for RedHat family) +you need to ensure that you have ruby-devel (or ruby-dev) package installed. ## Contributing diff --git a/REFERENCE.md b/REFERENCE.md index a15ae0b..8b9116a 100644 --- a/REFERENCE.md +++ b/REFERENCE.md @@ -7,10 +7,10 @@ ### Classes * [`r10k`](#r10k): Main r10k class -* [`r10k::authorized_key`](#r10kauthorized_key): Define an authorized key on the server -* [`r10k::gitolite_hooks`](#r10kgitolite_hooks): this class installs hooks on a gitolite server to trigger r10k updates -* [`r10k::ssh_key`](#r10kssh_key): Generate an SSH authentication key Key generation for (passwordless) authentication to a remote system. -* [`r10k::user`](#r10kuser): this class creates an r10k user with ssh key etc. +* [`r10k::authorized_key`](#r10k--authorized_key): Define an authorized key on the server +* [`r10k::gitolite_hooks`](#r10k--gitolite_hooks): this class installs hooks on a gitolite server to trigger r10k updates +* [`r10k::ssh_key`](#r10k--ssh_key): Generate an SSH authentication key Key generation for (passwordless) authentication to a remote system. +* [`r10k::user`](#r10k--user): this class creates an r10k user with ssh key etc. ## Classes @@ -22,22 +22,25 @@ Main r10k class The following parameters are available in the `r10k` class: -* [`configdir`](#configdir) -* [`cachedir`](#cachedir) -* [`pool_size`](#pool_size) -* [`proxy`](#proxy) -* [`deploy`](#deploy) -* [`sources`](#sources) -* [`git`](#git) -* [`forge`](#forge) -* [`user`](#user) -* [`home`](#home) -* [`ensure_user`](#ensure_user) -* [`allowed_keys`](#allowed_keys) -* [`packages`](#packages) -* [`package_ensure`](#package_ensure) - -##### `configdir` +* [`configdir`](#-r10k--configdir) +* [`ensure_configdir`](#-r10k--ensure_configdir) +* [`cachedir`](#-r10k--cachedir) +* [`pool_size`](#-r10k--pool_size) +* [`proxy`](#-r10k--proxy) +* [`deploy`](#-r10k--deploy) +* [`sources`](#-r10k--sources) +* [`git`](#-r10k--git) +* [`forge`](#-r10k--forge) +* [`user`](#-r10k--user) +* [`home`](#-r10k--home) +* [`ensure_user`](#-r10k--ensure_user) +* [`allowed_keys`](#-r10k--allowed_keys) +* [`packages`](#-r10k--packages) +* [`package_ensure`](#-r10k--package_ensure) +* [`package_options`](#-r10k--package_options) +* [`r10k_command`](#-r10k--r10k_command) + +##### `configdir` Data type: `String` @@ -46,7 +49,15 @@ defaults to '/etc/puppet' Default value: `'/etc/puppet'` -##### `cachedir` +##### `ensure_configdir` + +Data type: `Boolean` + +set this to true to ensure the config direcory exists + +Default value: `false` + +##### `cachedir` Data type: `Optional[String[1]]` @@ -55,18 +66,18 @@ repositories, are stored on the local machine. This location should be persistent, as environments and modules may rely on these files in order to be updated. -Default value: ``undef`` +Default value: `undef` -##### `pool_size` +##### `pool_size` Data type: `Optional[Integer]` The pool_size setting is a number to determine how many threads should be spawn while updating modules. -Default value: ``undef`` +Default value: `undef` -##### `proxy` +##### `proxy` Data type: `Optional[String[1]]` @@ -75,9 +86,9 @@ operations performed by r10k. This includes requests to the Puppet Forge as well as any Git operations performed against an HTTP/HTTPS remote. @see https://github.com/puppetlabs/r10k/blob/main/doc/dynamic-environments/configuration.mkd#proxy -Default value: ``undef`` +Default value: `undef` -##### `deploy` +##### `deploy` Data type: `Optional[Hash]` @@ -87,9 +98,9 @@ Example (hiera, yaml): r10k::deploy: generate_types: true -Default value: ``undef`` +Default value: `undef` -##### `sources` +##### `sources` Data type: `Optional[Hash]` @@ -101,27 +112,27 @@ Example (hiera): remote: 'git@somewhere:main-puppet' basedir: '/etc/puppet/environments' -Default value: ``undef`` +Default value: `undef` -##### `git` +##### `git` Data type: `Optional[Hash]` Hash of git configurations, defaults to {} See r10k.yaml file for possible options (section git) -Default value: ``undef`` +Default value: `undef` -##### `forge` +##### `forge` Data type: `Optional[Hash]` Hash of forge configurations, defaults to {} See r10k.yaml file for possible options (section forge) -Default value: ``undef`` +Default value: `undef` -##### `user` +##### `user` Data type: `String` @@ -129,7 +140,7 @@ the r10k user, defaults to 'r10k' Default value: `'r10k'` -##### `home` +##### `home` Data type: `String` @@ -137,7 +148,7 @@ the home directory of $user Default value: `'/var/lib/r10k'` -##### `ensure_user` +##### `ensure_user` Data type: `Boolean` @@ -145,9 +156,9 @@ if we should ensure the r10k user (if true, includes r10k::user) defaults to true -Default value: ``true`` +Default value: `true` -##### `allowed_keys` +##### `allowed_keys` Data type: `Array` @@ -156,7 +167,7 @@ normaly this is the key used by git hooks. Default value: `[]` -##### `packages` +##### `packages` Data type: `Array` @@ -164,7 +175,7 @@ packages to install Default value: `['r10k']` -##### `package_ensure` +##### `package_ensure` Data type: `String[1]` @@ -172,7 +183,28 @@ what to ensure for packages Default value: `'installed'` -### `r10k::authorized_key` +##### `package_options` + +Data type: `Hash[String[1],String[1]]` + +options to set for the package option used to +install $packages. +eg. this lets you install r10k from gem by +setting this to: +{ 'provider' => 'gem' } + +Default value: `{}` + +##### `r10k_command` + +Data type: `String[1]` + +r10k command, if it is not saved in path, +you can specify the command with the path + +Default value: `'r10k'` + +### `r10k::authorized_key` Define an authorized key on the server @@ -180,29 +212,29 @@ Define an authorized key on the server The following parameters are available in the `r10k::authorized_key` class: -* [`username`](#username) -* [`home`](#home) -* [`keys`](#keys) -* [`destination`](#destination) -* [`owner`](#owner) -* [`group`](#group) -* [`mode`](#mode) -* [`command`](#command) -* [`options`](#options) +* [`username`](#-r10k--authorized_key--username) +* [`home`](#-r10k--authorized_key--home) +* [`keys`](#-r10k--authorized_key--keys) +* [`destination`](#-r10k--authorized_key--destination) +* [`owner`](#-r10k--authorized_key--owner) +* [`group`](#-r10k--authorized_key--group) +* [`mode`](#-r10k--authorized_key--mode) +* [`command`](#-r10k--authorized_key--command) +* [`options`](#-r10k--authorized_key--options) -##### `username` +##### `username` Data type: `String[1]` the username to put the file for -##### `home` +##### `home` Data type: `String[1]` the users homedirectory -##### `keys` +##### `keys` Data type: `Array` @@ -210,16 +242,16 @@ an array of keys to concat Default value: `[]` -##### `destination` +##### `destination` Data type: `Optional[String[1]]` use this if you want to set a different destination than '~/.ssh/authorized_keys' -Default value: ``undef`` +Default value: `undef` -##### `owner` +##### `owner` Data type: `String[1]` @@ -227,7 +259,7 @@ owner for the authorized_keys file Default value: `$username` -##### `group` +##### `group` Data type: `String[1]` @@ -235,7 +267,7 @@ group for the authorized_keys file Default value: `$username` -##### `mode` +##### `mode` Data type: `String[1]` @@ -243,7 +275,7 @@ mode for the authorized_keys file Default value: `'0644'` -##### `command` +##### `command` Data type: `String[1]` @@ -252,7 +284,7 @@ defaults to '/var/lib/r10k/update_environment.sh' Default value: `'/var/lib/r10k/update_environment.sh'` -##### `options` +##### `options` Data type: `Array` @@ -260,7 +292,7 @@ defaults to: [no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty] Default value: `['no-port-forwarding','no-X11-forwarding','no-agent-forwarding','no-pty']` -### `r10k::gitolite_hooks` +### `r10k::gitolite_hooks` this class installs hooks on a gitolite server to trigger r10k updates @@ -269,14 +301,14 @@ to trigger r10k updates The following parameters are available in the `r10k::gitolite_hooks` class: -* [`hook_path`](#hook_path) -* [`hook_name`](#hook_name) -* [`multihook_name`](#multihook_name) -* [`multihook_scripts`](#multihook_scripts) -* [`gitolite_user`](#gitolite_user) -* [`packages`](#packages) +* [`hook_path`](#-r10k--gitolite_hooks--hook_path) +* [`hook_name`](#-r10k--gitolite_hooks--hook_name) +* [`multihook_name`](#-r10k--gitolite_hooks--multihook_name) +* [`multihook_scripts`](#-r10k--gitolite_hooks--multihook_scripts) +* [`gitolite_user`](#-r10k--gitolite_hooks--gitolite_user) +* [`packages`](#-r10k--gitolite_hooks--packages) -##### `hook_path` +##### `hook_path` Data type: `String` @@ -285,7 +317,7 @@ defaults to: '/var/lib/gitolite/scripts' Default value: `'/var/lib/gitolite/scripts'` -##### `hook_name` +##### `hook_name` Data type: `String` @@ -293,7 +325,7 @@ filename of the update hook script Default value: `'update-r10k-branch'` -##### `multihook_name` +##### `multihook_name` Data type: `String` @@ -303,7 +335,7 @@ defaults to: '/var/lib/gitolite/scripts/multihook_r10k_email' Default value: `'multihook_r10k_email'` -##### `multihook_scripts` +##### `multihook_scripts` Data type: `Array` @@ -314,7 +346,7 @@ $hook_name is added by default. Default value: `[]` -##### `gitolite_user` +##### `gitolite_user` Data type: `String` @@ -323,7 +355,7 @@ defaults to 'gitolite' Default value: `'gitolite'` -##### `packages` +##### `packages` Data type: `Array` @@ -332,7 +364,7 @@ defaults to ['moreutils'] which contains pee needed for multihook Default value: `['moreutils']` -### `r10k::ssh_key` +### `r10k::ssh_key` Generate an SSH authentication key @@ -343,20 +375,20 @@ remote system. The following parameters are available in the `r10k::ssh_key` class: -* [`filename`](#filename) -* [`type`](#type) -* [`length`](#length) -* [`password`](#password) -* [`comment`](#comment) -* [`user`](#user) +* [`filename`](#-r10k--ssh_key--filename) +* [`type`](#-r10k--ssh_key--type) +* [`length`](#-r10k--ssh_key--length) +* [`password`](#-r10k--ssh_key--password) +* [`comment`](#-r10k--ssh_key--comment) +* [`user`](#-r10k--ssh_key--user) -##### `filename` +##### `filename` Data type: `String` Filename (full path) for the key. Required. -##### `type` +##### `type` Data type: `String` @@ -364,7 +396,7 @@ Type of key, either dsa, ecdsa or rsa. Defaults to rsa. Default value: `'rsa'` -##### `length` +##### `length` Data type: `Integer` @@ -373,7 +405,7 @@ regarding non RSA keys. Default value: `2048` -##### `password` +##### `password` Data type: `String` @@ -383,7 +415,7 @@ process parameters when creating the key. Default value: `''` -##### `comment` +##### `comment` Data type: `String` @@ -391,7 +423,7 @@ Comment describing the Key. Defaults to "Automatic authentication key for $user Default value: `'undef'` -##### `user` +##### `user` Data type: `String` @@ -400,7 +432,7 @@ containing the key. Defaults to "root" Default value: `'root'` -### `r10k::user` +### `r10k::user` this class creates an r10k user with ssh key etc. @@ -409,11 +441,11 @@ with ssh key etc. The following parameters are available in the `r10k::user` class: -* [`user`](#user) -* [`home`](#home) -* [`allowed_keys`](#allowed_keys) +* [`user`](#-r10k--user--user) +* [`home`](#-r10k--user--home) +* [`allowed_keys`](#-r10k--user--allowed_keys) -##### `user` +##### `user` Data type: `String` @@ -421,7 +453,7 @@ the r10k user, defaults to 'r10k' Default value: `'r10k'` -##### `home` +##### `home` Data type: `String` @@ -429,7 +461,7 @@ the home directory of $user Default value: `'/var/lib/r10k'` -##### `allowed_keys` +##### `allowed_keys` Data type: `Array` diff --git a/Rakefile b/Rakefile index 0f8754e..74415a9 100644 --- a/Rakefile +++ b/Rakefile @@ -1,12 +1,11 @@ # frozen_string_literal: true require 'bundler' -require 'puppet_litmus/rake_tasks' if Bundler.rubygems.find_name('puppet_litmus').any? +require 'puppet_litmus/rake_tasks' if Gem.loaded_specs.key? 'puppet_litmus' require 'puppetlabs_spec_helper/rake_tasks' require 'puppet-syntax/tasks/puppet-syntax' -require 'puppet_blacksmith/rake_tasks' if Bundler.rubygems.find_name('puppet-blacksmith').any? -require 'github_changelog_generator/task' if Bundler.rubygems.find_name('github_changelog_generator').any? -require 'puppet-strings/tasks' if Bundler.rubygems.find_name('puppet-strings').any? +require 'github_changelog_generator/task' if Gem.loaded_specs.key? 'github_changelog_generator' +require 'puppet-strings/tasks' if Gem.loaded_specs.key? 'puppet-strings' def changelog_user return unless Rake.application.top_level_tasks.include? "changelog" @@ -44,7 +43,7 @@ end PuppetLint.configuration.send('disable_relative') -if Bundler.rubygems.find_name('github_changelog_generator').any? +if Gem.loaded_specs.key? 'github_changelog_generator' GitHubChangelogGenerator::RakeTask.new :changelog do |config| raise "Set CHANGELOG_GITHUB_TOKEN environment variable eg 'export CHANGELOG_GITHUB_TOKEN=valid_token_here'" if Rake.application.top_level_tasks.include? "changelog" and ENV['CHANGELOG_GITHUB_TOKEN'].nil? config.user = "#{changelog_user}" diff --git a/data/RedHat-family.yaml b/data/RedHat-family.yaml new file mode 100644 index 0000000..60693d9 --- /dev/null +++ b/data/RedHat-family.yaml @@ -0,0 +1,13 @@ +--- +# r10k setting for RedHat os family + +# there are no packages available, so we install from gem + +r10k::package_options: + provider: 'gem' + +r10k::configdir: '/etc/puppetlabs/r10k' +r10k::home: '/etc/puppetlabs/r10k' + +# since /usr/local/bin is not in path +r10k::r10k_command: '/usr/local/bin/r10k' diff --git a/hiera.yaml b/hiera.yaml new file mode 100644 index 0000000..e608c51 --- /dev/null +++ b/hiera.yaml @@ -0,0 +1,13 @@ +--- +version: 5 + +defaults: + datadir: 'data' + data_hash: 'yaml_data' + +hierarchy: + - name: 'Operating System Family' + path: '%{facts.os.family}-family.yaml' + + - name: 'common' + path: 'common.yaml' diff --git a/manifests/init.pp b/manifests/init.pp index 6691098..2db7b9f 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -4,6 +4,8 @@ # @param configdir # where the configfile should be put # defaults to '/etc/puppet' +# @param ensure_configdir +# set this to true to ensure the config direcory exists # @param cachedir # The 'cachedir' setting controls where cached content, such as mirrored Git # repositories, are stored on the local machine. This location should be @@ -52,22 +54,34 @@ # packages to install # @param package_ensure # what to ensure for packages +# @param package_options +# options to set for the package option used to +# install $packages. +# eg. this lets you install r10k from gem by +# setting this to: +# { 'provider' => 'gem' } +# @param r10k_command +# r10k command, if it is not saved in path, +# you can specify the command with the path # class r10k ( - String $configdir = '/etc/puppet', - Optional[String[1]] $cachedir = undef, - Optional[Integer] $pool_size = undef, - Optional[String[1]] $proxy = undef, - Optional[Hash] $sources = undef, - Optional[Hash] $git = undef, - Optional[Hash] $forge = undef, - Optional[Hash] $deploy = undef, - String $user = 'r10k', - String $home = '/var/lib/r10k', - Boolean $ensure_user = true, - Array $allowed_keys = [], - Array $packages = ['r10k'], - String[1] $package_ensure = 'installed', + String $configdir = '/etc/puppet', + Boolean $ensure_configdir = false, + Optional[String[1]] $cachedir = undef, + Optional[Integer] $pool_size = undef, + Optional[String[1]] $proxy = undef, + Optional[Hash] $sources = undef, + Optional[Hash] $git = undef, + Optional[Hash] $forge = undef, + Optional[Hash] $deploy = undef, + String $user = 'r10k', + String $home = '/var/lib/r10k', + Boolean $ensure_user = true, + Array $allowed_keys = [], + Array $packages = ['r10k'], + String[1] $package_ensure = 'installed', + Hash[String[1],String[1]] $package_options = {}, + String[1] $r10k_command = 'r10k', ) { if $ensure_user { class { 'r10k::user': @@ -77,10 +91,14 @@ } } - package { $packages: - ensure => $package_ensure, + if $ensure_configdir { + file { $configdir: + ensure => 'directory', + } } + ensure_packages($packages, { 'ensure' => $package_ensure } + $package_options) + file { "${configdir}/r10k.yaml": owner => 'root', group => 'root', diff --git a/metadata.json b/metadata.json index 7851e06..bf806a3 100644 --- a/metadata.json +++ b/metadata.json @@ -10,34 +10,51 @@ "dependencies": [ { "name": "puppetlabs/stdlib", - "version_requirement": ">= 3.2.0 < 8.0.0" + "version_requirement": ">= 3.2.0 < 10.0.0" } ], "operatingsystem_support": [ { "operatingsystem": "Debian", "operatingsystemrelease": [ + "11", + "12" + ] + }, + { + "operatingsystem": "Ubuntu", + "operatingsystemrelease": [ + "20.04", + "22.04" + ] + }, + { + "operatingsystem": "RedHat", + "operatingsystemrelease": [ + "7", "8", - "9", - "10", - "11" + "9" ] }, { - "operatingsystem": "Ubuntu" + "operatingsystem": "AlmaLinux", + "operatingsystemrelease": [ + "8", + "9" + ] } ], "requirements": [ { "name": "puppet", - "version_requirement": ">=4.0.0 < 8.0.0" + "version_requirement": ">=4.0.0 < 9.0.0" } ], "tags": [ "r10k", "puppet" ], - "pdk-version": "2.5.0", - "template-url": "pdk-default#2.5.0", - "template-ref": "tags/2.5.0-0-g369d483" + "pdk-version": "3.0.1", + "template-url": "pdk-default#3.0.1", + "template-ref": "tags/3.0.1-0-gd13288a" } diff --git a/spec/classes/r10k_spec.rb b/spec/classes/r10k_spec.rb index e19c2a0..19fe09c 100644 --- a/spec/classes/r10k_spec.rb +++ b/spec/classes/r10k_spec.rb @@ -77,6 +77,20 @@ it_behaves_like 'r10k user' end + context 'with package_options' do + let :params do + default_params.merge( + package_options: { 'provider' => 'gem' }, + ) + end + + it_behaves_like 'r10k shared examples' + it { + is_expected.to contain_package('r10k') + .with_provider('gem') + } + end + context 'with non default user' do let :params do default_params.merge( diff --git a/spec/default_facts.yml b/spec/default_facts.yml index f777abf..3346c39 100644 --- a/spec/default_facts.yml +++ b/spec/default_facts.yml @@ -2,7 +2,8 @@ # # Facts specified here will override the values provided by rspec-puppet-facts. --- -ipaddress: "172.16.254.254" -ipaddress6: "FE80:0000:0000:0000:AAAA:AAAA:AAAA" +networking: + ip: "172.16.254.254" + ip6: "FE80:0000:0000:0000:AAAA:AAAA:AAAA" + mac: "AA:AA:AA:AA:AA:AA" is_pe: false -macaddress: "AA:AA:AA:AA:AA:AA" diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 07db734..6820ceb 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -25,8 +25,8 @@ next unless File.exist?(f) && File.readable?(f) && File.size?(f) begin - default_facts.merge!(YAML.safe_load(File.read(f), [], [], true)) - rescue => e + default_facts.merge!(YAML.safe_load(File.read(f), permitted_classes: [], permitted_symbols: [], aliases: true)) + rescue StandardError => e RSpec.configuration.reporter.message "WARNING: Unable to load #{f}: #{e}" end end diff --git a/templates/update_environment.sh.erb b/templates/update_environment.sh.erb index 46ef140..5ea48ac 100644 --- a/templates/update_environment.sh.erb +++ b/templates/update_environment.sh.erb @@ -19,7 +19,7 @@ if [[ "$ENV" == 'MODULE' ]]; then echo "$ENV2 not allowed, only [A-Za-z0-9_]+ allowed as module" exit 1 fi - (cd <%= @configdir %>; r10k --config=r10k.yaml deploy --verbose=debug module $ENV2 2>&1 |grep -E '(ERROR|INFO|Updating)') + (cd <%= @configdir %>; <%= @r10k_command %> --config=r10k.yaml deploy --verbose=debug module $ENV2 2>&1 |grep -E '(ERROR|INFO|Updating)') else if [[ ! ( "$ENV2" == '' || "$ENV2" == '--puppetfile' ) ]]; then echo "only --puppetfile allowed as second argument" @@ -28,5 +28,5 @@ else if [[ $ENV == 'all' ]]; then ENV='' fi - (cd <%= @configdir %>; r10k --config=r10k.yaml deploy --verbose=debug environment $ENV $ENV2 2>&1 |grep -E '(ERROR|INFO|Updating)') + (cd <%= @configdir %>; <%= @r10k_command %> --config=r10k.yaml deploy --verbose=debug environment $ENV $ENV2 2>&1 |grep -E '(ERROR|INFO|Updating)') fi diff --git a/templates/update_module.sh.erb b/templates/update_module.sh.erb index a08f6c8..5b4233b 100644 --- a/templates/update_module.sh.erb +++ b/templates/update_module.sh.erb @@ -7,4 +7,4 @@ if [[ ! "$MODULE" =~ ^[A-Za-z0-9_]+$ ]]; then exit 1 fi -(cd <%= @configdir %>; r10k --config=r10k.yaml deploy --verbose=debug module $MODULE 2>&1 |grep -E '(ERROR|INFO|Updating)') +(cd <%= @configdir %>; <%= @r10k_command %> --config=r10k.yaml deploy --verbose=debug module $MODULE 2>&1 |grep -E '(ERROR|INFO|Updating)')