diff --git a/.github/workflows/labeller.yml b/.github/workflows/labeller.yml index ee149bf525..0d4870d70b 100644 --- a/.github/workflows/labeller.yml +++ b/.github/workflows/labeller.yml @@ -6,7 +6,7 @@ on: - opened - labeled - unlabeled - pull_request_target: + pull_request: types: - opened - labeled diff --git a/.github/workflows/mend.yml b/.github/workflows/mend.yml index 8b5b401847..b4100a5af0 100644 --- a/.github/workflows/mend.yml +++ b/.github/workflows/mend.yml @@ -1,10 +1,9 @@ name: "mend" on: - pull_request_target: - types: - - opened - - synchronize + pull_request: + branches: + - "main" schedule: - cron: "0 0 * * *" workflow_dispatch: diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 0b7b8a05dd..4b3b80fc80 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -2,7 +2,7 @@ name: "Publish module" on: workflow_dispatch: - + jobs: release: uses: "puppetlabs/cat-github-actions/.github/workflows/module_release.yml@main" diff --git a/.rubocop.yml b/.rubocop.yml index 7a66e08331..439ea84ee8 100644 --- a/.rubocop.yml +++ b/.rubocop.yml @@ -5,7 +5,7 @@ require: AllCops: NewCops: enable DisplayCopNames: true - TargetRubyVersion: '2.7' + TargetRubyVersion: '2.6' Include: - "**/*.rb" Exclude: @@ -529,6 +529,8 @@ Lint/DuplicateBranch: Enabled: false Lint/DuplicateMagicComment: Enabled: false +Lint/DuplicateMatchPattern: + Enabled: false Lint/DuplicateRegexpCharacterClassElement: Enabled: false Lint/EmptyBlock: @@ -645,6 +647,8 @@ Style/ComparableClamp: Enabled: false Style/ConcatArrayLiterals: Enabled: false +Style/DataInheritance: + Enabled: false Style/DirEmpty: Enabled: false Style/DocumentDynamicEvalDefinition: @@ -713,6 +717,8 @@ Style/RedundantHeredocDelimiterQuotes: Enabled: false Style/RedundantInitialize: Enabled: false +Style/RedundantLineContinuation: + Enabled: false Style/RedundantSelfAssignmentBranch: Enabled: false Style/RedundantStringEscape: diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 2f1e4f73a5..6da8d472f8 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,6 @@ { "recommendations": [ "puppet.puppet-vscode", - "rebornix.Ruby" + "Shopify.ruby-lsp" ] } diff --git a/Gemfile b/Gemfile index 49f29d3ebe..ca783ebb83 100644 --- a/Gemfile +++ b/Gemfile @@ -20,31 +20,30 @@ group :development do 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 "deep_merge", '~> 1.0', require: false 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", '~> 7.0', require: false - gem "rspec-puppet-facts", '~> 2.0', require: false - gem "codecov", '~> 0.2', require: false + gem "facterdb", '~> 1.26', require: false + gem "metadata-json-lint", '~> 4.0', require: false + gem "rspec-puppet-facts", '~> 3.0', 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 "simplecov-console", '~> 0.9', require: false gem "puppet-debugger", '~> 1.0', require: false - gem "rubocop", '= 1.48.1', require: false + gem "rubocop", '~> 1.50.0', 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_litmus", '~> 1.0', require: false, platforms: [:ruby, :x64_mingw] - gem "serverspec", '~> 2.41', require: false -end -group :release_prep do +group :development, :release_prep do gem "puppet-strings", '~> 4.0', require: false gem "puppetlabs_spec_helper", '~> 7.0', require: false end +group :system_tests do + gem "puppet_litmus", '~> 1.0', require: false, platforms: [:ruby, :x64_mingw] + gem "CFPropertyList", '< 3.0.7', require: false, platforms: [:mswin, :mingw, :x64_mingw] + gem "serverspec", '~> 2.41', require: false +end puppet_version = ENV['PUPPET_GEM_VERSION'] facter_version = ENV['FACTER_GEM_VERSION'] diff --git a/README.md b/README.md index 1e93e35918..d9983b50e8 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ * [Add GPG keys](#add-gpg-keys) * [Prioritize backports](#prioritize-backports) * [Update the list of packages](#update-the-list-of-packages) - * [Pin a specific release](#pin-a-specific-release) + * [Pin a specific release](#pin-a-specific-release) * [Add a Personal Package Archive repository](#add-a-personal-package-archive-repository) * [Configure Apt from Hiera](#configure-apt-from-hiera) * [Replace the default sources.list file](#replace-the-default-sourceslist-file) diff --git a/REFERENCE.md b/REFERENCE.md index 4c97d0d543..b3597d71a5 100644 --- a/REFERENCE.md +++ b/REFERENCE.md @@ -13,7 +13,6 @@ #### Private Classes -* `apt::params`: Provides defaults for the Apt module parameters. * `apt::update`: Updates the list of available packages using apt-get update. ### Defined types @@ -99,7 +98,7 @@ Data type: `String` Specifies the provider that should be used by apt::update. -Default value: `$apt::params::provider` +Default value: `'/usr/bin/apt-get'` ##### `keyserver` @@ -108,7 +107,7 @@ Data type: `String` Specifies a keyserver to provide the GPG key. Valid options: a string containing a domain name or a full URL (http://, https://, or hkp://). -Default value: `$apt::params::keyserver` +Default value: `'keyserver.ubuntu.com'` ##### `key_options` @@ -116,7 +115,7 @@ Data type: `Optional[String]` Specifies the default options for apt::key resources. -Default value: `$apt::params::key_options` +Default value: `undef` ##### `ppa_options` @@ -124,7 +123,7 @@ Data type: `Optional[Array[String]]` Supplies options to be passed to the `add-apt-repository` command. -Default value: `$apt::params::ppa_options` +Default value: `undef` ##### `ppa_package` @@ -132,7 +131,7 @@ Data type: `Optional[String]` Names the package that provides the `apt-add-repository` command. -Default value: `$apt::params::ppa_package` +Default value: `undef` ##### `backports` @@ -146,15 +145,15 @@ Options: * **:repos** `String`: See apt::backports for documentation. * **:key** `String`: See apt::backports for documentation. -Default value: `$apt::params::backports` +Default value: `undef` ##### `confs` Data type: `Hash` -Creates new `apt::conf` resources. Valid options: a hash to be passed to the create_resources function linked above. +Hash of `apt::conf` resources. -Default value: `$apt::params::confs` +Default value: `{}` ##### `update` @@ -178,7 +177,7 @@ Default: 'reluctantly'. * **:timeout** `Integer`: Specifies how long to wait for the update to complete before canceling it. Valid options: an integer, in seconds. Default: undef. * **:tries** `Integer`: Specifies how many times to retry the update after receiving a DNS or HTTP error. Default: undef. -Default value: `$apt::params::update` +Default value: `{}` ##### `update_defaults` @@ -186,7 +185,16 @@ Data type: `Hash` The default update settings that are combined and merged with the passed `update` value -Default value: `$apt::params::update_defaults` +Default value: + +```puppet +{ + 'frequency' => 'reluctantly', + 'loglevel' => undef, + 'timeout' => undef, + 'tries' => undef, + } +``` ##### `purge` @@ -201,7 +209,7 @@ Options: * **:preferences** `Boolean`: Specifies whether to purge any unmanaged entries from preferences. Default false. * **:preferences.d.** `Boolean`: Specifies whether to purge any unmanaged entries from preferences.d. Default false. -Default value: `$apt::params::purge` +Default value: `{}` ##### `purge_defaults` @@ -209,7 +217,17 @@ Data type: `Hash` The default purge settings that are combined and merged with the passed `purge` value -Default value: `$apt::params::purge_defaults` +Default value: + +```puppet +{ + 'sources.list' => false, + 'sources.list.d' => false, + 'preferences' => false, + 'preferences.d' => false, + 'apt.conf.d' => false, + } +``` ##### `proxy` @@ -217,7 +235,7 @@ Data type: `Apt::Proxy` Configures Apt to connect to a proxy server. Valid options: a hash matching the locally defined type apt::proxy. -Default value: `$apt::params::proxy` +Default value: `{}` ##### `proxy_defaults` @@ -225,23 +243,34 @@ Data type: `Hash` The default proxy settings that are combined and merged with the passed `proxy` value -Default value: `$apt::params::proxy_defaults` +Default value: + +```puppet +{ + 'ensure' => undef, + 'host' => undef, + 'port' => 8080, + 'https' => false, + 'https_acng' => false, + 'direct' => false, + } +``` ##### `sources` Data type: `Hash` -Creates new `apt::source` resources. Valid options: a hash to be passed to the create_resources function linked above. +Hash of `apt::source` resources. -Default value: `$apt::params::sources` +Default value: `{}` ##### `keys` Data type: `Hash` -Creates new `apt::key` resources. Valid options: a hash to be passed to the create_resources function linked above. +Hash of `apt::key` resources. -Default value: `$apt::params::keys` +Default value: `{}` ##### `keyrings` @@ -255,25 +284,25 @@ Default value: `{}` Data type: `Hash` -Creates new `apt::ppa` resources. Valid options: a hash to be passed to the create_resources function linked above. +Hash of `apt::ppa` resources. -Default value: `$apt::params::ppas` +Default value: `{}` ##### `pins` Data type: `Hash` -Creates new `apt::pin` resources. Valid options: a hash to be passed to the create_resources function linked above. +Hash of `apt::pin` resources. -Default value: `$apt::params::pins` +Default value: `{}` ##### `settings` Data type: `Hash` -Creates new `apt::setting` resources. Valid options: a hash to be passed to the create_resources function linked above. +Hash of `apt::setting` resources. -Default value: `$apt::params::settings` +Default value: `{}` ##### `manage_auth_conf` @@ -282,7 +311,7 @@ Data type: `Boolean` Specifies whether to manage the /etc/apt/auth.conf file. When true, the file will be overwritten with the entries specified in the auth_conf_entries parameter. When false, the file will be ignored (note that this does not set the file to absent. -Default value: `$apt::params::manage_auth_conf` +Default value: `true` ##### `auth_conf_entries` @@ -293,15 +322,15 @@ format (similar to what curl uses) and contains the login configuration for APT https://manpages.debian.org/testing/apt/apt_auth.conf.5.en.html for details. If specified each hash must contain the keys machine, login and password and no others. Specifying manage_auth_conf and not specifying this parameter will set /etc/apt/auth.conf to absent. -Default value: `$apt::params::auth_conf_entries` +Default value: `[]` ##### `auth_conf_owner` Data type: `String` -The owner of the file /etc/apt/auth.conf. Default: '_apt' or 'root' on old releases. +The owner of the file /etc/apt/auth.conf. -Default value: `$apt::params::auth_conf_owner` +Default value: `'_apt'` ##### `root` @@ -309,7 +338,7 @@ Data type: `String` Specifies root directory of Apt executable. -Default value: `$apt::params::root` +Default value: `'/etc/apt'` ##### `sources_list` @@ -317,7 +346,7 @@ Data type: `String` Specifies the path of the sources_list file to use. -Default value: `$apt::params::sources_list` +Default value: `"${root}/sources.list"` ##### `sources_list_d` @@ -325,7 +354,7 @@ Data type: `String` Specifies the path of the sources_list.d file to use. -Default value: `$apt::params::sources_list_d` +Default value: `"${root}/sources.list.d"` ##### `conf_d` @@ -333,7 +362,7 @@ Data type: `String` Specifies the path of the conf.d file to use. -Default value: `$apt::params::conf_d` +Default value: `"${root}/apt.conf.d"` ##### `preferences` @@ -341,7 +370,7 @@ Data type: `String` Specifies the path of the preferences file to use. -Default value: `$apt::params::preferences` +Default value: `"${root}/preferences"` ##### `preferences_d` @@ -349,7 +378,7 @@ Data type: `String` Specifies the path of the preferences.d file to use. -Default value: `$apt::params::preferences_d` +Default value: `"${root}/preferences.d"` ##### `config_files` @@ -357,23 +386,47 @@ Data type: `Hash` A hash made up of the various configuration files used by Apt. -Default value: `$apt::params::config_files` +Default value: + +```puppet +{ + 'conf' => { + 'path' => $conf_d, + 'ext' => '', + }, + 'pref' => { + 'path' => $preferences_d, + 'ext' => '.pref', + }, + 'list' => { + 'path' => $sources_list_d, + 'ext' => '.list', + }, + } +``` ##### `sources_list_force` Data type: `Boolean` -Specifies whether to perform force purge or delete. Default false. +Specifies whether to perform force purge or delete. -Default value: `$apt::params::sources_list_force` +Default value: `false` ##### `include_defaults` Data type: `Hash` +The package types to include by default. +Default value: -Default value: `$apt::params::include_defaults` +```puppet +{ + 'deb' => true, + 'src' => false, + } +``` ##### `apt_conf_d` @@ -381,7 +434,7 @@ Data type: `String` The path to the file `apt.conf.d` -Default value: `$apt::params::apt_conf_d` +Default value: `"${root}/apt.conf.d"` ##### `source_key_defaults` @@ -1074,7 +1127,7 @@ Default value: `$name` Data type: `String` -Specifies whether the Apt source file should exist. Valid options: 'present' and 'absent'. +Specifies whether the Apt source file should exist. Default value: `present` @@ -1102,8 +1155,8 @@ Configures include options. Valid options: a hash of available keys. Options: -* **:deb** `Boolean`: Specifies whether to request the distribution's compiled binaries. Default true. -* **:src** `Boolean`: Specifies whether to request the distribution's uncompiled source code. Default false. +* **:deb** `Boolean`: Specifies whether to request the distribution's compiled binaries. +* **:src** `Boolean`: Specifies whether to request the distribution's uncompiled source code. Default value: `{}` @@ -1177,7 +1230,7 @@ Default value: `true` Data type: `Boolean` -Specifies whether to check if the package release date is valid. Defaults to `True`. +Specifies whether to check if the package release date is valid. Default value: `true` diff --git a/data/os/Debian.yaml b/data/os/Debian.yaml new file mode 100644 index 0000000000..e7cc38af75 --- /dev/null +++ b/data/os/Debian.yaml @@ -0,0 +1,3 @@ +apt::backports: + location: http://deb.debian.org/debian + repos: main contrib non-free diff --git a/data/os/Ubuntu.yaml b/data/os/Ubuntu.yaml new file mode 100644 index 0000000000..20bf4318ba --- /dev/null +++ b/data/os/Ubuntu.yaml @@ -0,0 +1,7 @@ +apt::backports: + location: http://archive.ubuntu.com/ubuntu + repos: main universe multiverse restricted + +apt::ppa_options: + - -y +apt::ppa_package: software-properties-common diff --git a/manifests/init.pp b/manifests/init.pp index 78882733df..5ad48433f5 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -31,7 +31,7 @@ # See apt::backports for documentation. # # @param confs -# Creates new `apt::conf` resources. Valid options: a hash to be passed to the create_resources function linked above. +# Hash of `apt::conf` resources. # # @param update # Configures various update settings. Valid options: a hash made up from the following keys: @@ -40,7 +40,7 @@ # Specifies how often to run `apt-get update`. If the exec resource `apt_update` is notified, # `apt-get update` runs regardless of this value. # Valid options: -# 'always' (at every Puppet run); +# 'always' (at every Puppet run); # 'hourly' (if the value of `apt_update_last_success` is less than current epoch time minus 3600); # 'daily' (if the value of `apt_update_last_success` is less than current epoch time minus 86400); # 'weekly' (if the value of `apt_update_last_success` is less than current epoch time minus 604800); @@ -85,22 +85,22 @@ # The default proxy settings that are combined and merged with the passed `proxy` value # # @param sources -# Creates new `apt::source` resources. Valid options: a hash to be passed to the create_resources function linked above. +# Hash of `apt::source` resources. # # @param keys -# Creates new `apt::key` resources. Valid options: a hash to be passed to the create_resources function linked above. +# Hash of `apt::key` resources. # # @param keyrings # Hash of `apt::keyring` resources. # # @param ppas -# Creates new `apt::ppa` resources. Valid options: a hash to be passed to the create_resources function linked above. +# Hash of `apt::ppa` resources. # # @param pins -# Creates new `apt::pin` resources. Valid options: a hash to be passed to the create_resources function linked above. +# Hash of `apt::pin` resources. # # @param settings -# Creates new `apt::setting` resources. Valid options: a hash to be passed to the create_resources function linked above. +# Hash of `apt::setting` resources. # # @param manage_auth_conf # Specifies whether to manage the /etc/apt/auth.conf file. When true, the file will be overwritten with the entries specified in @@ -113,7 +113,7 @@ # password and no others. Specifying manage_auth_conf and not specifying this parameter will set /etc/apt/auth.conf to absent. # # @param auth_conf_owner -# The owner of the file /etc/apt/auth.conf. Default: '_apt' or 'root' on old releases. +# The owner of the file /etc/apt/auth.conf. # # @param root # Specifies root directory of Apt executable. @@ -137,9 +137,10 @@ # A hash made up of the various configuration files used by Apt. # # @param sources_list_force -# Specifies whether to perform force purge or delete. Default false. +# Specifies whether to perform force purge or delete. # # @param include_defaults +# The package types to include by default. # # @param apt_conf_d # The path to the file `apt.conf.d` @@ -148,47 +149,79 @@ # The fault `source_key` settings # class apt ( - Hash $update_defaults = $apt::params::update_defaults, - Hash $purge_defaults = $apt::params::purge_defaults, - Hash $proxy_defaults = $apt::params::proxy_defaults, - Hash $include_defaults = $apt::params::include_defaults, - String $provider = $apt::params::provider, - String $keyserver = $apt::params::keyserver, - Optional[String] $key_options = $apt::params::key_options, - Optional[Array[String]] $ppa_options = $apt::params::ppa_options, - Optional[String] $ppa_package = $apt::params::ppa_package, - Optional[Hash] $backports = $apt::params::backports, - Hash $confs = $apt::params::confs, - Hash $update = $apt::params::update, - Hash $purge = $apt::params::purge, - Apt::Proxy $proxy = $apt::params::proxy, - Hash $sources = $apt::params::sources, - Hash $keys = $apt::params::keys, - Hash $keyrings = {}, - Hash $ppas = $apt::params::ppas, - Hash $pins = $apt::params::pins, - Hash $settings = $apt::params::settings, - Boolean $manage_auth_conf = $apt::params::manage_auth_conf, - Array[Apt::Auth_conf_entry] $auth_conf_entries = $apt::params::auth_conf_entries, - String $auth_conf_owner = $apt::params::auth_conf_owner, - String $root = $apt::params::root, - String $sources_list = $apt::params::sources_list, - String $sources_list_d = $apt::params::sources_list_d, - String $conf_d = $apt::params::conf_d, - String $preferences = $apt::params::preferences, - String $preferences_d = $apt::params::preferences_d, - String $apt_conf_d = $apt::params::apt_conf_d, - Hash $config_files = $apt::params::config_files, - Boolean $sources_list_force = $apt::params::sources_list_force, - + Hash $update_defaults = { + 'frequency' => 'reluctantly', + 'loglevel' => undef, + 'timeout' => undef, + 'tries' => undef, + }, + Hash $purge_defaults = { + 'sources.list' => false, + 'sources.list.d' => false, + 'preferences' => false, + 'preferences.d' => false, + 'apt.conf.d' => false, + }, + Hash $proxy_defaults = { + 'ensure' => undef, + 'host' => undef, + 'port' => 8080, + 'https' => false, + 'https_acng' => false, + 'direct' => false, + }, + Hash $include_defaults = { + 'deb' => true, + 'src' => false, + }, + String $provider = '/usr/bin/apt-get', + String $keyserver = 'keyserver.ubuntu.com', + Optional[String] $key_options = undef, + Optional[Array[String]] $ppa_options = undef, + Optional[String] $ppa_package = undef, + Optional[Hash] $backports = undef, + Hash $confs = {}, + Hash $update = {}, + Hash $purge = {}, + Apt::Proxy $proxy = {}, + Hash $sources = {}, + Hash $keys = {}, + Hash $keyrings = {}, + Hash $ppas = {}, + Hash $pins = {}, + Hash $settings = {}, + Boolean $manage_auth_conf = true, + Array[Apt::Auth_conf_entry] $auth_conf_entries = [], + String $auth_conf_owner = '_apt', + String $root = '/etc/apt', + String $sources_list = "${root}/sources.list", + String $sources_list_d = "${root}/sources.list.d", + String $conf_d = "${root}/apt.conf.d", + String $preferences = "${root}/preferences", + String $preferences_d = "${root}/preferences.d", + String $apt_conf_d = "${root}/apt.conf.d", + Hash $config_files = { + 'conf' => { + 'path' => $conf_d, + 'ext' => '', + }, + 'pref' => { + 'path' => $preferences_d, + 'ext' => '.pref', + }, + 'list' => { + 'path' => $sources_list_d, + 'ext' => '.list', + }, + }, + Boolean $sources_list_force = false, Hash $source_key_defaults = { 'server' => $keyserver, 'options' => undef, 'content' => undef, 'source' => undef, - } - -) inherits apt::params { + }, +) { if $facts['os']['family'] != 'Debian' { fail('This module only works on Debian or derivatives like Ubuntu') } @@ -342,30 +375,40 @@ notify => Class['apt::update'], } - if $confs { - create_resources('apt::conf', $confs) + $confs.each |$key, $value| { + apt::conf { $key: + * => $value, + } } - # manage sources if present - if $sources { - create_resources('apt::source', $sources) + + $sources.each |$key, $value| { + apt::source { $key: + * => $value, + } } - # manage keys if present - if $keys { - create_resources('apt::key', $keys) + + $keys.each |$key, $value| { + apt::key { $key: + * => $value, + } } - # manage keyrings if present + $keyrings.each |$key, $data| { apt::keyring { $key: * => $data, } } - # manage ppas if present - if $ppas { - create_resources('apt::ppa', $ppas) + + $ppas.each |$key, $value| { + apt::ppa { $key: + * => $value, + } } - # manage settings if present - if $settings { - create_resources('apt::setting', $settings) + + $settings.each |$key, $value| { + apt::setting { $key: + * => $value, + } } if $manage_auth_conf { @@ -374,7 +417,11 @@ default => 'present', } - $auth_conf_tmp = stdlib::deferrable_epp('apt/auth_conf.epp', { 'auth_conf_entries' => $auth_conf_entries }) + $auth_conf_tmp = stdlib::deferrable_epp('apt/auth_conf.epp', + { + 'auth_conf_entries' => $auth_conf_entries, + }, + ) file { '/etc/apt/auth.conf': ensure => $auth_conf_ensure, @@ -386,9 +433,10 @@ } } - # manage pins if present - if $pins { - create_resources('apt::pin', $pins) + $pins.each |$key, $value| { + apt::pin { $key: + * => $value, + } } case $facts['os']['name'] { diff --git a/manifests/params.pp b/manifests/params.pp deleted file mode 100644 index c2fe0b48b1..0000000000 --- a/manifests/params.pp +++ /dev/null @@ -1,107 +0,0 @@ -# @summary Provides defaults for the Apt module parameters. -# -# @api private -# -class apt::params { - if $facts['os']['family'] != 'Debian' { - fail('This module only works on Debian or derivatives like Ubuntu') - } - - $root = '/etc/apt' - $provider = '/usr/bin/apt-get' - $sources_list = "${root}/sources.list" - $sources_list_force = false - $sources_list_d = "${root}/sources.list.d" - $trusted_gpg_d = "${root}/trusted.gpg.d" - $conf_d = "${root}/apt.conf.d" - $preferences = "${root}/preferences" - $preferences_d = "${root}/preferences.d" - $apt_conf_d = "${root}/apt.conf.d" - $keyserver = 'keyserver.ubuntu.com' - $key_options = undef - $confs = {} - $update = {} - $purge = {} - $proxy = {} - $sources = {} - $keys = {} - $ppas = {} - $pins = {} - $settings = {} - $manage_auth_conf = true - $auth_conf_entries = [] - - $config_files = { - 'conf' => { - 'path' => $conf_d, - 'ext' => '', - }, - 'pref' => { - 'path' => $preferences_d, - 'ext' => '.pref', - }, - 'list' => { - 'path' => $sources_list_d, - 'ext' => '.list', - }, - } - - $update_defaults = { - 'frequency' => 'reluctantly', - 'loglevel' => undef, - 'timeout' => undef, - 'tries' => undef, - } - - $proxy_defaults = { - 'ensure' => undef, - 'host' => undef, - 'port' => 8080, - 'https' => false, - 'https_acng' => false, - 'direct' => false, - } - - $purge_defaults = { - 'sources.list' => false, - 'sources.list.d' => false, - 'preferences' => false, - 'preferences.d' => false, - 'apt.conf.d' => false, - } - - $include_defaults = { - 'deb' => true, - 'src' => false, - } - - case $facts['os']['name'] { - 'Debian': { - $backports = { - 'location' => 'http://deb.debian.org/debian', - 'repos' => 'main contrib non-free', - } - $ppa_options = undef - $ppa_package = undef - $auth_conf_owner = '_apt' - } - 'Ubuntu': { - $backports = { - 'location' => 'http://archive.ubuntu.com/ubuntu', - 'repos' => 'main universe multiverse restricted', - } - $ppa_options = ['-y'] - $ppa_package = 'software-properties-common' - $auth_conf_owner = '_apt' - } - undef: { - fail('Unable to determine value for fact os[\"name\"]') - } - default: { - $ppa_options = undef - $ppa_package = undef - $backports = undef - $auth_conf_owner = 'root' - } - } -} diff --git a/manifests/source.pp b/manifests/source.pp index 5c64dd1ed2..776c5f7a43 100644 --- a/manifests/source.pp +++ b/manifests/source.pp @@ -28,7 +28,7 @@ # Supplies a comment for adding to the Apt source file. # # @param ensure -# Specifies whether the Apt source file should exist. Valid options: 'present' and 'absent'. +# Specifies whether the Apt source file should exist. # # @param release # Specifies a distribution of the Apt repository. @@ -40,10 +40,10 @@ # Configures include options. Valid options: a hash of available keys. # # @option include [Boolean] :deb -# Specifies whether to request the distribution's compiled binaries. Default true. +# Specifies whether to request the distribution's compiled binaries. # # @option include [Boolean] :src -# Specifies whether to request the distribution's uncompiled source code. Default false. +# Specifies whether to request the distribution's uncompiled source code. # # @param key # Creates an `apt::keyring` in `/etc/apt/keyrings` (or anywhere on disk given `filename`) Valid options: @@ -77,7 +77,7 @@ # Specifies whether to trigger an `apt-get update` run. # # @param check_valid_until -# Specifies whether to check if the package release date is valid. Defaults to `True`. +# Specifies whether to check if the package release date is valid. # define apt::source ( Optional[String] $location = undef, @@ -209,10 +209,12 @@ $_architecture = undef } - $sourcelist = epp('apt/source.list.epp', { + $sourcelist = epp('apt/source.list.epp', + { 'comment' => $comment, 'includes' => $includes, - 'options' => delete_undef_values({ + 'options' => delete_undef_values( + { 'arch' => $_architecture, 'trusted' => $allow_unsigned ? { true => 'yes', false => undef }, 'allow-insecure' => $allow_insecure ? { true => 'yes', false => undef }, @@ -222,7 +224,7 @@ ), 'location' => $_location, 'components' => $_components, - } + }, ) apt::setting { "list-${name}": @@ -246,6 +248,9 @@ } else { fail('Received invalid value for pin parameter') } - create_resources('apt::pin', { "${name}" => $_pin }) + + apt::pin { $name: + * => $_pin, + } } } diff --git a/metadata.json b/metadata.json index 0f509b1126..12280e25ff 100644 --- a/metadata.json +++ b/metadata.json @@ -17,8 +17,8 @@ { "operatingsystem": "Debian", "operatingsystemrelease": [ - "10", - "11" + "11", + "12" ] }, { @@ -37,6 +37,6 @@ } ], "template-url": "https://github.com/puppetlabs/pdk-templates.git#main", - "template-ref": "heads/main-0-g79a2f93", - "pdk-version": "3.0.0" + "template-ref": "heads/main-0-gdd25cb0", + "pdk-version": "3.2.0" } diff --git a/readmes/README_ja_JP.md b/readmes/README_ja_JP.md deleted file mode 100644 index be8ac75f52..0000000000 --- a/readmes/README_ja_JP.md +++ /dev/null @@ -1,292 +0,0 @@ -# apt - -#### 目次 - -1. [説明 - モジュールの機能とその有益性](#module-description) -1. [セットアップ - apt導入の基本](#setup) - * [aptが影響を与えるもの](#what-apt-affects) - * [aptの使用を開始する](#beginning-with-apt) -1. [使用 - 設定オプションと追加機能](#usage) - * [GPGキーの追加](#add-gpg-keys) - * [バックポートの優先度を上げる](#prioritize-backports) - * [パッケージリストの更新](#update-the-list-of-packages) - * [特定のリリースのピン止め](#pin-a-specific-release) - * [PPA (Personal Package Archive)レポジトリの追加](#add-a-personal-package-archive-repository) - * [HieraからのAptの構成](#configure-apt-from-hiera) - * [デフォルトのsources.listファイルの置き換え](#replace-the-default-sourceslist-file) -1. [参考 - モジュールの機能と動作について](#reference) -1. [制約 - OS互換性など](#limitations) -1. [開発 - モジュール貢献についてのガイド](#development) - -## モジュールの概要 - -aptモジュールを導入すると、Puppetを使用してAPT (Advanced Package Tool)のソース、キー、その他の構成オプションを管理できます。 - -APTとは、Debian、Ubuntu、およびその他いくつかのオペレーティングシステムで利用可能なパッケージマネージャです。aptモジュールは、APTのパッケージ管理を自動化するのに役立つ一連のクラス、定義型、およびfactsを提供します。 - -**注**:Puppet 7 より前は、このモジュールがどのバージョンのを正しく自動検出するか -実行している Debian / Ubuntu(または派生物)、 `lsb-release`パッケージが -インストールされています。 Puppet 7 では、 `lsb-release`パッケージは必要ありません。 - -## セットアップ - -### aptが影響を与えるもの - -* システムの`preferences`ファイルと`preferences.d`ディレクトリ -* システムの `sources.list`ファイルと`sources.list.d`ディレクトリ -* システムレポジトリ -* 認証キー - -**注意:** このモジュールには`purge`パラメータがあります。このパラメータを`true`に設定すると、 ノードの `sources.list(.d)`および`preferences(.d)`の構成のうち、Puppetを通して宣言されていないものがすべて**破棄**されます。このパラメータのデフォルトは`false`です。 - -### aptの使用を開始する - -デフォルトのパラメータでaptモジュールを使用するには、`apt`クラスを宣言します。 - -```puppet -include apt -``` - -**注意:** メインの`apt`クラスは、このモジュールに含まれるその他すべてのクラス、型、定義型によって要求されます。このモジュールを使用する際は、このクラスを必ず宣言する必要があります。 - -## 使用 - -### GPGキーの追加 - -**警告:** 短いキーIDを使用すると、衝突攻撃が有効になる可能性があり、セキュリティに深刻な問題が生じます。常に、完全なフィンガープリントを使用してGPGキーを識別することを推奨します。このモジュールでは短いキーの使用が許可されていますが、それを使用した場合、セキュリティ警告が発行されます。 - -`apt::key`の定義型を宣言するには、次のように記述します。 - -```puppet -apt::key { 'puppetlabs': - id => '6F6B15509CF8E59E6E469F327F438280EF8D349F', - server => 'pgp.mit.edu', - options => 'http-proxy="http://proxyuser:proxypass@example.org:3128"', -} -``` - -### バックポートの優先度を上げる - -```puppet -class { 'apt::backports': - pin => 500, -} -``` - -デフォルトでは、`apt::backports`クラスはバックポート用のピンファイルをドロップし、優先度200にピン止めします。これは、通常のデフォルト値である500よりも低いため、`ensure => latest`に設定されているパッケージは、明示的な許可がない限り、バックポートからアップグレードされることはありません。 - -`pin`パラメータを使用して優先度を500に上げると、通常のポリシーが有効になり、Aptは最新のバージョンをインストールするか、最新のバージョンにアップグレードします。これはつまり、`package`リソースの`ensure`属性を明示的に`installed`/`present`もしくは特定のバージョンに設定していない限り、あるパッケージがバックポートから利用できる場合は、そのパッケージと依存関係がバックポートから取得されるということです。 - -### パッケージリストの更新 - -デフォルトでは、`apt`クラスをインクルードした後の最初のPuppet実行時と、`notify => Exec['apt_update']`が発生するたびに(別の言い方をすれば、構成ファイルが更新されるか、関連するその他の変更が行われるたびに)、Puppetは`apt-get update`を実行します。`update['frequency']`を'always'に設定すると、Puppet実行時に毎回更新が行われます。`update['frequency']`は'daily'や'weekly'に設定することも可能です。 - -```puppet -class { 'apt': - update => { - frequency => 'daily', - }, -} -``` -`Exec['apt_update']`がトリガされると、`Notice`メッセージが生成されます。デフォルトの[agentロギングレベル](https://docs.puppet.com/puppet/latest/configuration.html#loglevel)は`notice`であるため、このレポジトリの更新は、ログおよびagentレポートに記録されます。[Foreman](https://www.theforeman.org)など、一部のツールでは、このような更新通知が重要な変更としてレポートされます。これらの更新がレポートに記録されないようにするには、`Exec['apt_update']`の[loglevel](https://docs.puppet.com/puppet/latest/metaparameter.html#loglevel)メタパラメータをagentロギングレベルよりも高い値に設定します。 - -```puppet -class { 'apt': - update => { - frequency => 'daily', - loglevel => 'debug', - }, -} -``` - -### 特定のリリースのピン止め - -```puppet -apt::pin { 'karmic': priority => 700 } -apt::pin { 'karmic-updates': priority => 700 } -apt::pin { 'karmic-security': priority => 700 } -``` - -ディストリビューションのプロパティを使用して、より複雑なピンを指定することもできます。 - -```puppet -apt::pin { 'stable': - priority => -10, - originator => 'Debian', - release_version => '3.0', - component => 'main', - label => 'Debian' -} -``` - -複数のパッケージをピン止めするには、配列またはスペース区切りの文字列としてその情報を`packages`パラメータに渡します。 - -### PPA (Personal Package Archive)レポジトリの追加 - -```puppet -apt::ppa { 'ppa:drizzle-developers/ppa': } -``` - -### `/etc/apt/sources.list.d/`へのAptソースの追加 - -```puppet -apt::source { 'debian_unstable': - comment => 'This is the iWeb Debian unstable mirror', - location => 'http://debian.mirror.iweb.ca/debian/', - release => 'unstable', - repos => 'main contrib non-free', - pin => '-10', - key => { - 'id' => 'A1BD8E9D78F7FE5C3E65D8AF8B48AD6246925553', - 'server' => 'subkeys.pgp.net', - }, - include => { - 'src' => true, - 'deb' => true, - }, -} -``` - -Puppet Aptレポジトリをソースとして使用するには、次のように記述します。 - -```puppet -apt::source { 'puppetlabs': - location => 'http://apt.puppetlabs.com', - repos => 'main', - key => { - 'id' => '6F6B15509CF8E59E6E469F327F438280EF8D349F', - 'server' => 'pgp.mit.edu', - }, -} -``` - -### HieraからのAptの構成 - -ソースをリソースとして直接指定するかわりに、単純に`apt`クラスをインクルードして、値をHieraから自動的に取得するように構成できます。 - -```yaml -apt::sources: - 'debian_unstable': - comment: 'This is the iWeb Debian unstable mirror' - location: 'http://debian.mirror.iweb.ca/debian/' - release: 'unstable' - repos: 'main contrib non-free' - pin: '-10' - key: - id: 'A1BD8E9D78F7FE5C3E65D8AF8B48AD6246925553' - server: 'subkeys.pgp.net' - include: - src: true - deb: true - - 'puppetlabs': - location: 'http://apt.puppetlabs.com' - repos: 'main' - key: - id: '6F6B15509CF8E59E6E469F327F438280EF8D349F' - server: 'pgp.mit.edu' -``` - -### デフォルトの`sources.list`ファイルの置き換え - -デフォルトの`/etc/apt/sources.list`を置き換える例を以下に示します。以下のコードと合わせて、`purge`パラメータを必ず使用してください。使用しない場合、Apt実行時にソース重複の警告が出ます。 - -```puppet -apt::source { "archive.ubuntu.com-${facts['os']['distro']['codename']}": - location => 'http://archive.ubuntu.com/ubuntu', - key => '630239CC130E1A7FD81A27B140976EAF437D05B5', - repos => 'main universe multiverse restricted', -} - -apt::source { "archive.ubuntu.com-${facts['os']['distro']['codename']}-security": - location => 'http://archive.ubuntu.com/ubuntu', - key => '630239CC130E1A7FD81A27B140976EAF437D05B5', - repos => 'main universe multiverse restricted', - release => "${facts['os']['distro']['codename']}-security" -} - -apt::source { "archive.ubuntu.com-${facts['os']['distro']['codename']}-updates": - location => 'http://archive.ubuntu.com/ubuntu', - key => '630239CC130E1A7FD81A27B140976EAF437D05B5', - repos => 'main universe multiverse restricted', - release => "${facts['os']['distro']['codename']}-updates" -} - -apt::source { "archive.ubuntu.com-${facts['os']['distro']['codename']}-backports": - location => 'http://archive.ubuntu.com/ubuntu', - key => '630239CC130E1A7FD81A27B140976EAF437D05B5', - repos => 'main universe multiverse restricted', - release => "${facts['os']['distro']['codename']}-backports" -} -``` - -### APTソースやプロキシのログイン設定を`/etc/apt/auth.conf`で管理する - -APTバージョン1.5以降、認証が必要なAPTソースやプロキシについて、ユーザ名やパスワードなどのログイン設定を`/etc/apt/auth.conf`ファイルに定義できるようになりました。この方法は、`source.list`内にログイン情報を直接記述するよりも推奨されます。直接記述した場合、通常、あらゆるユーザから読み取り可能になるためです。 - -`/etc/apt/auth.confファイルのフォーマットは、(ftpやcurlによって使用される) netrcに従い、ファイルパーミッションが制限されています。詳しくは、[こちら](https://manpages.debian.org/testing/apt/apt_auth.conf.5.en.html)を参照してください。 - -オプションの`apt::auth_conf_entries`パラメータを使用して、ログイン設定を含むハッシュの配列を指定します。このハッシュに含めることができるのは、`machine`、`login`、および`password`キーのみです。 - -```puppet -class { 'apt': - auth_conf_entries => [ - { - 'machine' => 'apt-proxy.example.net', - 'login' => 'proxylogin', - 'password' => 'proxypassword', - }, - { - 'machine' => 'apt.example.com/ubuntu', - 'login' => 'reader', - 'password' => 'supersecret', - }, - ], -} -``` - -## リファレンス - -### Facts - -* `apt_updates`: `upgrade`で入手可能な更新がある、インストール済みパッケージの数。 - -* `apt_dist_updates`: `dist-upgrade`で入手可能な更新がある、インストール済みパッケージの数。 - -* `apt_security_updates`: `upgrade`で入手可能なセキュリティ更新がある、インストール済みパッケージの数。 - -* `apt_security_dist_updates`: `dist-upgrade`で入手可能なセキュリティ更新がある、インストール済みパッケージの数。 - -* `apt_package_updates`: `upgrade`で入手可能な更新がある、すべてのインストール済みパッケージの名前。Facter 2.0以降では、このデータのフォーマットは配列で、それ以前のバージョンでは、コンマ区切りの文字列です。 - -* `apt_package_dist_updates`: `dist-upgrade`で入手可能な更新がある、すべてのインストール済みパッケージの名前。Facter 2.0以降では、このデータのフォーマットは配列で、それ以前のバージョンでは、コンマ区切りの文字列です。 - -* `apt_update_last_success`: 直近で成功した`apt-get update`実行のエポックタイムによる日付(/var/lib/apt/periodic/update-success-stampのmtimeに基づく)。 - -* `apt_reboot_required`: 更新がインストールされた後に再起動が必要かどうかを決定します。 - -### 詳細情報 - -その他すべてのリファレンスマニュアルについては、[REFERENCE.md](https://github.com/puppetlabs/puppetlabs-apt/blob/main/REFERENCE.md)を参照してください。 - -## 制約 - -このモジュールは、[実行ステージ](https://docs.puppetlabs.com/puppet/latest/reference/lang_run_stages.html)に分割するようには設計されていません。 - -サポート対象のオペレーティングシステムの全リストについては、[metadata.json](https://github.com/puppetlabs/puppetlabs-apt/blob/main/metadata.json)を参照してください。 - -### 新しいソースまたはPPAの追加 - -新しいソースまたはPPAを追加し、同一のPuppet実行において、その新しいソースまたはPPAからパッケージをインストールするには、`package`リソースが`Apt::Source`または`Apt::Ppa`に従属し、かつ`Class['apt::update']に従属する必要があります。[コレクタ](https://docs.puppetlabs.com/puppet/latest/reference/lang_collectors.html)を追加することによって、すべてのパッケージが`apt::update`の後に来るように制御することもできますが、その場合、循環依存が発生したり、[仮想リソース](https://docs.puppetlabs.com/puppet/latest/reference/lang_collectors.html#behavior)と関係したりすることがあります。以下のコマンドを実行する前に、すべてのパッケージのプロバイダがaptに設定されていることを確認してください。 - -```puppet -Class['apt::update'] -> Package <| provider == 'apt' |> -``` - -## 開発 - -Puppet ForgeのPuppet Labsモジュールはオープンプロジェクトで、良い状態に保つためには、コミュニティの貢献が必要不可欠です。Puppetが役に立つはずでありながら、私たちがアクセスできないプラットフォームやハードウェア、ソフトウェア、デプロイ構成は無数にあります。私たちの目標は、できる限り簡単に変更に貢献し、みなさまの環境で私たちのモジュールが機能できるようにすることにあります。最高の状態を維持できるようにするために、コントリビュータが従う必要のあるいくつかのガイドラインが存在します。 - -詳細については、[モジュール貢献ガイド](https://docs.puppetlabs.com/forge/contributing.html)を参照してください。 - -すでにご協力いただいている方のリストについては、[コントリビュータのリスト](https://github.com/puppetlabs/puppetlabs-apt/graphs/contributors)をご覧ください。 diff --git a/spec/spec_helper.rb b/spec/spec_helper.rb index 6820cebee7..ae7c1f6818 100644 --- a/spec/spec_helper.rb +++ b/spec/spec_helper.rb @@ -25,7 +25,8 @@ next unless File.exist?(f) && File.readable?(f) && File.size?(f) begin - default_facts.merge!(YAML.safe_load(File.read(f), permitted_classes: [], permitted_symbols: [], aliases: true)) + require 'deep_merge' + default_facts.deep_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 @@ -33,7 +34,7 @@ # read default_facts and merge them over what is provided by facterdb default_facts.each do |fact, value| - add_custom_fact fact, value + add_custom_fact fact, value, merge_facts: true end RSpec.configure do |c|