freebsd_packages
freebsd_packages
Ansible role. FreeBSD. Configure repositories. Install, update, and upgrade packages.
Feel free to share your feedback and report issues.
Requirements
Collections
- community.general >= 9.3.0
Variables
See the defaults and examples in vars.
Workflow
- Change shell on the remote host to /bin/sh if necessary
shell> ansible host -e 'ansible_shell_type=csh ansible_shell_executable=/bin/csh' -a 'sudo pw usermod user -s /bin/sh'
- Install the role and collection
shell> ansible-galaxy role install vbotka.freebsd_packages
Install the collection if necessary
shell> ansible-galaxy collection install community.general
- Change variables to your needs.
Optionally, get the dictionaries of packages' lists. See:
Put them, for example, into the group_vars/all
shell> ls -1 group_vars/all/
pkgdict_amd64.yml
pkgdict_arm64.yml
pkgdict_arm.yml
pkgdict_i386.yml
pkgdict_versions.yml
- Create playbook
shell> cat freebsd-packages.yml
- hosts: srv.example.com
roles:
- vbotka.freebsd_packages
- Manage the packages
Check syntax
shell> ansible-playbook freebsd-packages.yml --syntax-check
Display variables
shell> ansible-playbook freebsd-packages.yml -e pkg_debug=true -t pkg_debug
Dry-run the playbook and display changes
shell> ansible-playbook freebsd-packages.yml --check --diff
Optionally, configure repositories in a separate step. This will enable to display the actual installation dry-run
shell> ansible-playbook freebsd-packages.yml -t pkg_conf
Dry-run the packages installation
shell> ansible-playbook freebsd-packages.yml -e pkg_dryrun=true
If all seems to be right manage the packages
shell> ansible-playbook freebsd-packages.yml
Hint. There are lot of skipped tasks. To make the output of the playbook easier to read:
Use callback plugin community.general.yaml
Disable skipped hosts and display debug
shell> ANSIBLE_DISPLAY_SKIPPED_HOSTS=false ansible-playbook freebsd-packages.yml -e pkg_debug=true
Upgrade packages
Since community.general 9.3.0 it is possible to upgrate (state=latest) packages in the form “category/port” aka “pkg-origin”. You haved to disable globs (use_globs=false). See the parameter use_globs
shell> ansible-playbook freebsd-packages.yml -e pkg_state=latest -e pkg_use_globs=false
Repositories
The parameter pkgsite of the module community.general.pkgng says:
specify a the name of a repository configured in /usr/local/etc/pkg/repos
Default repository
The module community.general.pkgng will use the default repository FreeBSD declared in /etc/pkg/FreeBSD.conf if no repositories are configured in /usr/local/etc/pkg/repos
shell> cat /etc/pkg/FreeBSD.conf
# $FreeBSD$
#
# To disable this repository, instead of modifying or removing this file,
# create a /usr/local/etc/pkg/repos/FreeBSD.conf file:
#
# mkdir -p /usr/local/etc/pkg/repos
# echo "FreeBSD: { enabled: no }" > /usr/local/etc/pkg/repos/FreeBSD.conf
#
FreeBSD: {
url: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly",
mirror_type: "srv",
signature_type: "fingerprints",
fingerprints: "/usr/share/keys/pkg",
enabled: yes
}
Display the configured repository
# pkg -vv
...
Repositories:
FreeBSD: {
url : "pkg+http://pkg.FreeBSD.org/FreeBSD:13:amd64/quarterly",
enabled : yes,
priority : 0,
mirror_type : "SRV",
signature_type : "FINGERPRINTS",
fingerprints : "/usr/share/keys/pkg"
}
Custom repositories
You can disable the default repository and declare other repositories. For example, create the dictionary
pkg_repos_conf:
- name: FreeBSD
conf:
- {key: enabled, value: 'no'}
- name: FreeBSD_quarterly
conf:
- {key: url, value: '"pkg+http://pkg.FreeBSD.org/${ABI}/quarterly"'}
- {key: mirror_type, value: '"srv"'}
- {key: signature_type, value: '"fingerprints"'}
- {key: fingerprints, value: '"/usr/share/keys/pkg"'}
- {key: enabled, value: 'yes'}
- name: FreeBSD_latest
conf:
- {key: url, value: '"pkg+http://pkg.FreeBSD.org/${ABI}/latest"'}
- {key: mirror_type, value: '"srv"'}
- {key: signature_type, value: '"fingerprints"'}
- {key: fingerprints, value: '"/usr/share/keys/pkg"'}
- {key: enabled, value: 'yes'}
and create the configuration files
shell> ansible-playbook -t pkg_conf freebsd-packages.yml
Take a look at the files
shell> cat /usr/local/etc/pkg/repos/FreeBSD.conf
# Ansible managed
FreeBSD: {
enabled: no
}
# EOF
shell> cat /usr/local/etc/pkg/repos/FreeBSD_quarterly.conf
# Ansible managed
FreeBSD_quarterly: {
url: "pkg+http://pkg.FreeBSD.org/${ABI}/quarterly",
mirror_type: "srv",
signature_type: "fingerprints",
fingerprints: "/usr/share/keys/pkg",
enabled: yes
}
# EOF
shell> cat /usr/local/etc/pkg/repos/FreeBSD_latest.conf
# Ansible managed
FreeBSD_latest: {
url: "pkg+http://pkg.FreeBSD.org/${ABI}/latest",
mirror_type: "srv",
signature_type: "fingerprints",
fingerprints: "/usr/share/keys/pkg",
enabled: yes
}
# EOF
and display the configured repositories
shell> pkg -vv
...
Repositories:
FreeBSD_latest: {
url : "pkg+http://pkg.FreeBSD.org/FreeBSD:13:amd64/latest",
enabled : yes,
priority : 0,
mirror_type : "SRV",
signature_type : "FINGERPRINTS",
fingerprints : "/usr/share/keys/pkg"
}
FreeBSD_quarterly: {
url : "pkg+http://pkg.FreeBSD.org/FreeBSD:13:amd64/quarterly",
enabled : yes,
priority : 0,
mirror_type : "SRV",
signature_type : "FINGERPRINTS",
fingerprints : "/usr/share/keys/pkg"
}
Examples
Given the list
pkg_list: [bash]
- Install bash from the default repository
shell> ansible-playbook -t pkg_packages_install_list -e pkg_debug=true freebsd-packages.yml
...
ok: [srv.exmple.org] =>
result:
attempts: 1
changed: false
failed: false
msg: package(s) already present
stderr: ''
stderr_lines: []
stdout: |-
Updating FreeBSD_latest repository catalogue...
FreeBSD_latest repository is up to date.
Updating FreeBSD_quarterly repository catalogue...
FreeBSD_quarterly repository is up to date.
All repositories are up to date.
...
- Install bash from the repository FreeBSD_latest
shell> ansible-playbook -t pkg_packages_install_list -e pkg_debug=true -e pkg_pkgsite=FreeBSD_latest freebsd-packages.yml
...
ok: [srv.example.org] =>
result:
attempts: 1
changed: false
failed: false
msg: package(s) already present
stderr: ''
stderr_lines: []
stdout: |-
Updating FreeBSD_latest repository catalogue...
FreeBSD_latest repository is up to date.
All repositories are up to date.
...
- Install latest package bash from the repository FreeBSD_latest
shell> ansible-playbook -t pkg_packages_install_list -e pkg_debug=true -e pkg_pkgsite=FreeBSD_latest -e pkg_state=latest freebsd-packages.yml
...
ok: [srv.example.org] =>
result:
attempts: 1
changed: false
failed: false
msg: package(s) already latest
stderr: ''
stderr_lines: []
stdout: |-
Updating FreeBSD_latest repository catalogue...
FreeBSD_latest repository is up to date.
All repositories are up to date.
...
- Install latest packages in the minimal list from the repository FreeBSD_latest
Get the dictionaries pkgdict_* from Github ansible-freebsd-postinstall/defaults/main and declare the list
pkg_dict_select: [minimal]
Install the packages
shell> ansible-playbook -t pkg_packages_install_selected -e pkg_debug=true -e pkg_pkgsite=FreeBSD_latest -e pkg_state=latest freebsd-packages.yml
...
ok: [srv.example.org] =>
result:
changed: true
msg: All items completed
results:
- ansible_loop_var: item
attempts: 1
changed: true
failed: false
invocation:
module_args:
annotation: null
autoremove: false
cached: false
chroot: null
ignore_osver: false
jail: null
name:
- shells/bash
- devel/git
- archivers/gtar
- ports-mgmt/pkg
- ports-mgmt/portmaster
- ports-mgmt/portupgrade
- net/rsync
- ftp/wget
pkgsite: FreeBSD_latest
rootdir: null
state: latest
item:
packages:
- shells/bash
- devel/git
- archivers/gtar
- ports-mgmt/pkg
- ports-mgmt/portmaster
- ports-mgmt/portupgrade
- net/rsync
- ftp/wget
pkglist: minimal
msg: upgraded 4 packages
stderr: ''
stderr_lines: []
stdout: |-
Updating FreeBSD_latest repository catalogue...
FreeBSD_latest repository is up to date.
All repositories are up to date.
The following 4 package(s) will be affected (of 0 checked):
Installed packages to be UPGRADED:
git-tiny: 2.41.0 -> 2.42.0 [FreeBSD_latest]
gtar: 1.34_1 -> 1.35 [FreeBSD_latest]
portmaster: 3.26 -> 3.27 [FreeBSD_latest]
portupgrade: 2.4.16,2 -> 2.4.16_1,2 [FreeBSD_latest]
Number of packages to be upgraded: 4
5 MiB to be downloaded.
[1/4] Fetching git-tiny-2.42.0.pkg: .......... done
[2/4] Fetching portupgrade-2.4.16_1,2.pkg: ......... done
[3/4] Fetching gtar-1.35.pkg: ........ done
[4/4] Fetching portmaster-3.27.pkg: .... done
Checking integrity... done (0 conflicting)
[1/4] Upgrading git-tiny from 2.41.0 to 2.42.0...
===> Creating groups.
Using existing group 'git_daemon'.
===> Creating users
Using existing user 'git_daemon'.
[1/4] Extracting git-tiny-2.42.0: .......... done
[2/4] Upgrading portupgrade from 2.4.16,2 to 2.4.16_1,2...
[2/4] Extracting portupgrade-2.4.16_1,2: .......... done
[3/4] Upgrading gtar from 1.34_1 to 1.35...
[3/4] Extracting gtar-1.35: .......... done
[4/4] Upgrading portmaster from 3.26 to 3.27...
[4/4] Extracting portmaster-3.27: ........ done
...
- Install the minimal list of packages at the hosts in the group test
- hosts: test
gather_facts: true
become: true
vars:
pkg_dict_select:
- minimal
roles:
- vbotka.freebsd_packages
Ansible lint
Use the configuration file .ansible-lint.local when running ansible-lint. Some rules might be disabled and some warnings might be ignored. See the notes in the configuration file.
shell> ansible-lint -c .ansible-lint.local
References
- FreeBSD handbook: Using pkg for Binary Package Management
- FreeBSD handbook: Building Packages with poudriere
- man pkg.conf
- pkg - a binary package manager for FreeBSD
License
Author Information
FreeBSD. Configure repositories. Install, update, and upgrade packages.
ansible-galaxy install vbotka/ansible-freebsd-packages