Version information
This version is compatible with:
- Puppet Enterprise 2023.2.x, 2023.1.x, 2023.0.x, 2021.7.x, 2021.6.x, 2021.5.x, 2021.4.x, 2021.3.x, 2021.2.x, 2021.1.x, 2021.0.x, 2019.8.x, 2019.7.x, 2019.5.x, 2019.4.x, 2019.3.x, 2019.2.x, 2019.1.x, 2019.0.x, 2018.1.x, 2017.3.x, 2017.2.x, 2016.4.x
- Puppet >= 4.10.0 < 8.0.0
- ,
Start using this module
Add this module to your Puppetfile:
mod 'cirrax-reprepro', '4.1.0'
Learn more about managing modules with a PuppetfileDocumentation
reprepro puppet module
Table of Contents
Overview
This module assists with creating a local apt repository using reprepro.
Usage
Supports the followin usecases:
- create a local repository for uploading packages with dput
- create a local mirror of a repository (or part of a repository) eg. mirror of puppet packages from Puppetlabs.
Example usage with hiera
This example creates a private repository and start apache to provide the apt repositories.
include reprepro
include apache::vhosts
reprepro::distributions_defaults:
architectures: 'amd64 source'
components: 'main'
deb_indices: 'Packages Release . .gz .bz2 .xz'
dsc_indices: 'Sources Release . .gz .bz2 .xz'
# sign_with: '000000KEYID00000' # see chapter PGP signing
install_cron: false
not_automatic: 'yes'
# create one or more repositories:
reprepro::repositories:
localpkgs:
options:
- 'basedir .'
distributions:
local:
origin: 'my-packages'
description: 'whatever the description should describe'
label: 'my-packages'
suite: 'local'
apache::vhosts::vhosts:
apt.example.com:
port: '80'
servername: apt.example.com
docroot: '/var/www/apt.example.com'
Example usage as puppet manifest
This example creates a private repository and start apache to provide the apt repositories.
# Main reprepro class
class { 'reprepro':
basedir => $basedir,
}
# Set up a repository
reprepro::repository { 'localpkgs':
options => ['basedir .'],
}
# Create a distribution within that repository
reprepro::distribution { 'precise':
repository => 'localpkgs',
origin => 'Foobar',
label => 'Foobar',
suite => 'precise',
architectures => 'amd64 i386',
components => 'main contrib non-free',
description => 'Package repository for local site maintenance',
# sign_with => '000000KEYID00000' # see chapter PGP signing
not_automatic => 'No',
install_cron => false,
}
# Set up apache
class { 'apache': }
# Make your repo publicly accessible
apache::vhost { 'localpkgs':
port => '80',
docroot => '/var/lib/apt/repo/localpkgs',
manage_docroot => false,
servername => 'apt.example.com',
}
PGP signing
If you like to use PGP (and you should do that !) to let reprepro sign the contents of your repositories you have to create and install the PGP key to use manually. The following shell commands show howto create a PGP key for reprepro:
# become the reprepro user:
$ su - reprepro
# Create a pgp key:
$ gpg --gen-key --pinentry-mode loopback
Note: if you protect your key with a passphrase, you have to manage packages manually in order to enter the passphrase.
Note2: --pinentry-mode loopback is needed since we used su to become the reprepro user.
By referencing the key ID with the parameter sign_with of the distribution resources, reprepro will use the key to sign.
Reference
All classes and reources are documented in theire respective code file. For information on classes, types and functions see the REFERENCE.md
Contributing
Please report bugs and feature request using GitHub issue tracker.
For pull requests, it is very much appreciated to check your Puppet manifest with puppet-lint and the available spec tests in order to follow the recommended Puppet style guidelines from the Puppet Labs style guide.
Authors and Credits
This module was based off of the existing work done by saz, camptocamp and desc.
See the list of contributors for a list of all contributors.
Reference
Table of Contents
Classes
reprepro
: Configures reprepro on a server
Defined types
reprepro::distribution
: Adds a "Distribution" to manage.reprepro::filterlist
: Adds a FilterList Packages list have the same syntax as the output of dpkg --get-selectionsreprepro::key
: Import a PGP key into the local keyring of the reprepro userreprepro::pull
: Add a repository pull rule.reprepro::repository
: Adds a packages repository.reprepro::update
: Adds a packages repository.
Classes
reprepro
Configures reprepro on a server
Parameters
The following parameters are available in the reprepro
class:
basedir
homedir
manage_user
user_name
group_name
keys
key_defaults
repositories
repositories_defaults
package_ensure
package_name
distributions_defaults
always_recurse
basedir
Data type: String
The base directory to house the repository.
Default value: '/var/packages'
homedir
Data type: String
The home directory of the reprepro user.
Default value: '/var/packages'
manage_user
Data type: Boolean
if true, creates the user $user_name
Default value: true
user_name
Data type: String
user_name who own reprepro
Default value: 'reprepro'
group_name
Data type: String
group of user who own reprepro
Default value: 'reprepro'
keys
Data type: Hash
hash to create reprepro::key resources.
Default value: {}
key_defaults
Data type: Hash
hash with defaults for keys creation.
Default value: {}
repositories
Data type: Hash
hash to create reprepro::repository resources.
Default value: {}
repositories_defaults
Data type: Hash
hash with defaults for reporitories creation.
Default value: {}
package_ensure
Data type: String
what to ensure for packages
Default value: 'present'
package_name
Data type: String
name of the package to install
Default value: 'reprepro'
distributions_defaults
Data type: Hash
defaults to use for all distributions. they may got overwritten from the repositories distribution_defaults
Default value: {}
always_recurse
Data type: Boolean
default value for always_recurse in the define reprepro::repository since recursing folders can be time consuming you can avoid in normal runs and only recurse for ensure => 'absent' repositories. Default is to recurse always
Default value: true
Defined types
reprepro::distribution
Adds a "Distribution" to manage.
Examples
reprepro::distribution {"lenny":
repository => "my-repository",
origin => "Camptocamp",
label => "Camptocamp",
suite => "stable",
architectures => "i386 amd64 source",
components => "main contrib non-free",
description => "A simple example of repository distribution",
sign_with => "packages@camptocamp.com",
}
Parameters
The following parameters are available in the reprepro::distribution
defined type:
repository
version
origin
label
suite
architectures
components
description
sign_with
codename
fakecomponentprefix
udebcomponents
deb_indices
dsc_indices
update
pull
uploaders
snapshots
install_cron
not_automatic
but_automatic_upgrades
log
create_pull
create_update
create_filterlist
repository
Data type: String
the name of the repository to attach this distribution to.
version
Data type: Optional[String]
distribution version
Default value: undef
origin
Data type: Optional[String]
package origin
Default value: undef
label
Data type: Optional[String]
package label
Default value: undef
suite
Data type: Optional[String]
package suite
Default value: undef
architectures
Data type: String
available architectures
components
Data type: String
available components
description
Data type: Optional[String]
a short description
Default value: undef
sign_with
Data type: String
email of the gpg key
Default value: ''
codename
Data type: String
codename (defaults to $title)
Default value: $title
fakecomponentprefix
Data type: Optional[String]
fakecomponentprefix
Default value: undef
udebcomponents
Data type: String
udebcomponents
Default value: $components
deb_indices
Data type: String
file name and compression
Default value: 'Packages Release .gz .bz2'
dsc_indices
Data type: String
file name and compression
Default value: 'Sources Release .gz .bz2'
update
Data type: String
update policy name
Default value: ''
pull
Data type: String
pull policy name
Default value: ''
uploaders
Data type: String
who is allowed to upload packages
Default value: ''
snapshots
Data type: Boolean
create a reprepro snapshot on each update
Default value: false
install_cron
Data type: Boolean
install cron job to automatically include new packages
Default value: true
not_automatic
Data type: String
automatic pined to 1 by using NotAutomatic, value are "yes" or "no"
Default value: ''
but_automatic_upgrades
Data type: String
set ButAutomaticUpgrades, value are "yes" or "no"
Default value: 'no'
log
Data type: String
log
Default value: ''
create_pull
Data type: Hash
hash to create reprepro::pull resource the name will be appended to $pull
Default value: {}
create_update
Data type: Hash
hash to create reprepro::update resource the name will be appended to $update
Default value: {}
create_filterlist
Data type: Hash
hash to create reprerpo::filterlist resource
Default value: {}
reprepro::filterlist
Adds a FilterList
Packages list have the same syntax as the output of dpkg --get-selections
Examples
reprepro::filterlist {"lenny-backports":
ensure => present,
repository => "dev",
packages => [
"git install",
"git-email install",
"gitk install",
],
}
Parameters
The following parameters are available in the reprepro::filterlist
defined type:
list_name
Data type: String
name of the filter list
Default value: $title
ensure
Data type: String
present/absent, defaults to present
Default value: 'present'
repository
Data type: String
the name of the repository
packages
Data type: Array
a list of packages, if the list is empty, the file content won't be managed by puppet
Default value: []
reprepro::key
Import a PGP key into the local keyring of the reprepro user
Parameters
The following parameters are available in the reprepro::key
defined type:
key_name
Data type: String
name of the key
Default value: $title
key_source
Data type: Optional[String]
Path to the key in gpg --export format. This is used as the source parameter in a puppet File resource.
Default value: undef
key_content
Data type: Optional[String]
define the key content instead of pointing to a source file
Default value: undef
reprepro::pull
Add a repository pull rule.
Examples
reprepro::pull {'lenny-backports':
repository => 'localpkgs',
from => 'dev',
filter_name => 'lenny-backports',
}
Parameters
The following parameters are available in the reprepro::pull
defined type:
name
repository
from
components
architectures
udebcomponents
filter_action
filter_name
filter_src_name
filter_formula
name
the name of the pull rule to use in the Pull field in conf/distributions
repository
Data type: String
the local repository to pull to
from
Data type: String
The codename of the distribution to pull packages from.
components
Data type: String
The components of the distribution to get from.
Default value: ''
architectures
Data type: String
The architectures to update.
Default value: ''
udebcomponents
Data type: String
Like Components but for the udebs.
Default value: ''
filter_action
Data type: String
default action when something is not found in the list
Default value: ''
filter_name
Data type: String
a list of filenames in the format of dpkg --get-selections
Default value: ''
filter_src_name
Data type: String
FilterSrcList parameter
Default value: ''
filter_formula
Data type: String
FilterFormula
Default value: ''
reprepro::repository
Adds a packages repository.
Examples
reprepro::repository { 'localpkgs':
ensure => present,
options => ['verbose', 'basedir .'],
}
Parameters
The following parameters are available in the reprepro::repository
defined type:
repo_name
ensure
incoming_name
incoming_dir
incoming_tmpdir
incoming_allow
options
createsymlinks
documentroot
max_files
always_recurse
distributions
distributions_defaults
repo_name
Data type: String
the name of the repository
Default value: $title
ensure
Data type: String
present/absent, defaults to present
Default value: 'present'
incoming_name
Data type: String
the name of the rule-set, used as argument
Default value: 'incoming'
incoming_dir
Data type: String
the name of the directory to scan for .changes files
Default value: 'incoming'
incoming_tmpdir
Data type: String
directory where the files are copied into before they are read
Default value: 'tmp'
incoming_allow
Data type: Optional[Variant[String, Array]]
allowed distributions
Default value: undef
options
Data type: Array
reprepro options
Default value: ['verbose', 'ask-passphrase', 'basedir .']
createsymlinks
Data type: Boolean
create suite symlinks
Default value: false
documentroot
Data type: Optional[String]
documentroot of the webserver (default undef) if set, softlinks to the reprepro directories are made the directory $documentroot must already exist
Default value: undef
max_files
Data type: Optional[Integer]
maximum number of file resources created for recursion see puppet file resource, available only on puppet > 7
Default value: undef
always_recurse
Data type: Optional[Boolean]
since recursing folders can be time consuming you can avoid in normal runs and only recurse for ensure => 'absent' repositories. Default is taken from reprepro::always_recurse
Default value: undef
distributions
Data type: Hash
hash to define distributions in this repository
Default value: {}
distributions_defaults
Data type: Hash
defaults for all distributions in this repository
Default value: {}
reprepro::update
Adds a packages repository.
Examples
reprepro::update {"lenny-backports":
suite => 'lenny',
repository => "dev",
url => 'http://backports.debian.org/debian-backports',
filter_name => "lenny-backports",
}
Parameters
The following parameters are available in the reprepro::update
defined type:
update_name
suite
repository
url
architectures
components
udebcomponents
flat
verify_release
ignore_release
filter_action
filter_name
filter_src_name
download_lists_as
getinrelease
update_name
Data type: String
the name of the update-upstream use in the Update field in conf/distributions
Default value: $title
suite
Data type: String
package suite
repository
Data type: String
the name of the repository
url
Data type: String
a valid repository URL
architectures
Data type: Optional[String]
architectures
Default value: undef
components
Data type: Optional[String]
components
Default value: undef
udebcomponents
Data type: Optional[String]
udebcomponents
Default value: undef
flat
Data type: Optional[String]
flat
Default value: undef
verify_release
Data type: String
check the GPG signature Releasefile
Default value: 'blindtrust'
ignore_release
Data type: String
ignore_release
Default value: 'No'
filter_action
Data type: String
default action when something is not found in the list
Default value: ''
filter_name
Data type: String
Name of a filter list created with reprepro::filterlist, matching binary packages
Default value: ''
filter_src_name
Data type: String
Name of a filter list created with reprepro::filterlist, matching source packages
Default value: ''
download_lists_as
Data type: String
specify in which order reprepro will look for a usable variant of needed index files ( .gz, .bz2, .lzma, .xz and .diff)
Default value: ''
getinrelease
Data type: Optional[String]
if this is set to 'no', no InRelease file is downloaded but only Release (and Release.gpg ) are tried.
Default value: undef
Dependencies
- puppetlabs/stdlib (>=3.0.0 < 9.0.0)
- puppetlabs/concat (>= 1.0.0 < 8.0.0)
Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.