In a previous handbook about Cfengine 3 under FreeBSD we have seen how to install, configure and do configuration management of our FreBSD systems using Cfengine 3.
In the above mentioned handbook there were also a few examples included, and one in particular was about package management using the legacy pkg_* tools under FreeBSD for managing our packages.
Now, in this handbook we will see how we can use FreeBSD's pkgng together with Cfengine 3 for package management on our FreeBSD systems.
For more information on pkgng and how to set it up if you haven't done so already, please refer to the below links:
For setting up Cfengine 3, please refer to the Cfengine 3 handbook for FreeBSD users.
The setup explained in this handbook has been tested and verified on:
You can get all the configuration files used in this and the previous handbook from the Git repository.
To get all the configurations, just clone the Git repository:
$ git clone git://github.com/dnaeon/cfengine3-handbook.git
In order to get packages managed by pkgng first we need to have a new package_method defined in Cfengine.
To do that we are going to update a bit our library.cf file and add the following content to it:
body package_method freebsd_pkgng
{
package_changes => "bulk";
package_list_command => "/usr/local/sbin/pkg info";
package_list_name_regex => "([^\s]+)-.*";
package_list_version_regex => "[^\s]+-([^\s]+).*";
package_name_regex => "([^\s]+)-.*";
package_version_regex => "[^\s]+-([^\s]+).*";
package_installed_regex => ".*";
package_name_convention => "$(name)-$(version)";
package_update_command => "/usr/local/sbin/pkg update";
package_add_command => "/usr/local/sbin/pkg install -L -y";
package_delete_command => "/usr/local/sbin/pkg delete -y";
}
It is important to note here that we are now doing bulk package changes, so for example if we had to install a few packages they will all be installed using a single call to pkgng and not multiple times like we did before with the old pkg_* tools.
Everything else in the above configuration should be self-explanatory, if not please ask.
First we will start with a simple Cfengine 3 promise that will take care of deploying pkgng's pkg.conf file and updating the remote repositories.
Below you will find a sample pkg.conf that I've used on my FreeBSD machines with pkgng:
# System-wide configuration file for pkg(1) # For more information on the file format and # options please refer to the pkg.conf(5) man page # Configuration options PACKAGESITE : http://pkgbeta.freebsd.org/freebsd-9-amd64/latest PKG_DBDIR : /var/db/pkg PKG_CACHEDIR : /var/cache/pkg PORTSDIR : /usr/ports PUBKEY : /etc/ssl/pkg.conf HANDLE_RC_SCRIPTS : NO PKG_MULTIREPOS : NO ASSUME_ALWAYS_YES : NO SYSLOG : YES SHLIBS : NO AUTODEPS : NO PORTAUDIT_SITE : http://portaudit.FreeBSD.org/auditfile.tbz # Repository definitions #repos: # default : http://example.org/pkgng/ # repo1 : http://somewhere.org/pkgng/repo1/ # repo2 : http://somewhere.org/pkgng/repo2/
For now on we will use packages.cf file for creating the Cfengine 3 pkgng promises.
And here's the how my first version of packages.cf file looks like.
#####################################################
# #
# packages.cf - Promises for package installations #
# #
#####################################################
bundle agent packages {
files:
freebsd::
"/usr/local/etc/pkg.conf"
comment => "Copy pkgng configuration file for $(sys.fqhost)",
perms => mog("0644", "root", "wheel"),
copy_from => remote_copy("$(g.masterfiles)/pkgng/pkg.conf", "$(g.policyhost)"),
classes => if_repaired("update_pkgng_repo");
commands:
freebsd.update_pkgng_repo::
"/usr/local/sbin/pkg update -f";
}
What the above configuration simply does is this:
What we would want to have is updating our repositories each time pkg.conf changes and that's what the above configuration does.
Now, let's start installing packages using pkgng and Cfengine 3.
Below is an updated version of packages.cf file, which now is capable of doing package installations using pkgng:
#####################################################
# #
# packages.cf - Promises for package installations #
# #
#####################################################
bundle agent packages {
vars:
"freebsd_package_set" slist => {
"git-1.7.10.3",
"emacs-23.4_1,2",
"tmux-1.6",
"sudo-1.8.5.p2",
"zsh-4.3.17_3",
"cfengine-3.3.3",
"apg-2.3.0b_2",
"ssmtp-2.64",
"rsync-3.0.9"
};
files:
freebsd::
"/usr/local/etc/pkg.conf"
comment => "Copy pkgng configuration file for $(sys.fqhost)",
perms => mog("0644", "root", "wheel"),
copy_from => remote_copy("$(g.masterfiles)/pkgng/pkg.conf", "$(g.policyhost)"),
classes => if_repaired("update_pkgng_repo");
commands:
freebsd.update_pkgng_repo::
"/usr/local/sbin/pkg update -f";
packages:
freebsd::
"$(freebsd_package_set)"
package_policy => "add",
package_method => freebsd_pkgng;
}
Now using the above configuration we are actually able to start installing packages on our FreeBSD systems using pkgng.
As you can see, when we execute cf-agent(8) on a FreeBSD node we will have the following packages installed:
Below is just a sample snippet on one of my test FreeBSD systems where you can see Cfengine 3 and pkgng working together:
cf3>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> cf3>> Offering these package-promise suggestions to the managers cf3>> >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> cf3>> -> Deletion schedule... cf3>> -> Addition schedule... cf3>> Execute scheduled package addition cf3>> Command prefix: /usr/local/sbin/pkg install -L -y cf3>> Executing /usr/local/sbin/pkg install -L -y rsync-3.0.9 apg-2.3.0b_2 e... cf3>> Q:pkg install -L -y rs ...:The following packages will be installed: cf3>> Q:pkg install -L -y rs ...: cf3>> Q:pkg install -L -y rs ...: Installing rsync: 3.0.9 cf3>> Q:pkg install -L -y rs ...: Installing apg: 2.3.0b_2 cf3>> Q:pkg install -L -y rs ...: Installing emacs: 23.4_1,2 cf3>> Q:pkg install -L -y rs ...: Installing git: 1.7.10.3 cf3>> Q:pkg install -L -y rs ...: cf3>> Q:pkg install -L -y rs ...:The installation will require 118 MB more space cf3>> Q:pkg install -L -y rs ...: cf3>> Q:pkg install -L -y rs ...:0 B to be downloaded cf3>> Q:pkg install -L -y rs ...:Checking integrity... done cf3>> Q:pkg install -L -y rs ...:Installing rsync-3.0.9... done cf3>> Q:pkg install -L -y rs ...:Installing apg-2.3.0b_2... done cf3>> Q:pkg install -L -y rs ...:Installing emacs-23.4_1,2... done cf3>> Q:pkg install -L -y rs ...:Installing git-1.7.10.3...Updating /etc/shells cf3>> Q:pkg install -L -y rs ...: done cf3>> Q:pkg install -L -y rs ...: cf3>> Q:pkg install -L -y rs ...:------------------------------------------------------------------------ cf3>> Q:pkg install -L -y rs ...:*************************** GITWEB ************************************* cf3>> Q:pkg install -L -y rs ...:If you installed the GITWEB option please follow these instructions: cf3>> Q:pkg install -L -y rs ...: cf3>> Q:pkg install -L -y rs ...:In the directory /usr/local/share/examples/git/gitweb you can find all files to cf3>> Q:pkg install -L -y rs ...:make gitweb work as a public repository on the web. cf3>> Q:pkg install -L -y rs ...: cf3>> Q:pkg install -L -y rs ...:All you have to do to make gitweb work is: cf3>> Q:pkg install -L -y rs ...:1) Copy the files /usr/local/share/examples/git/gitweb/* to a directory on cf3>> Q:pkg install -L -y rs ...: your web server (e.g. Apache2) in which you are able to execute cf3>> Q:pkg install -L -y rs ...: CGI-scripts. cf3>> Q:pkg install -L -y rs ...:2) In gitweb.cgi, adjust the variable $projectroot to point to cf3>> Q:pkg install -L -y rs ...: your git repository (that is where you have your *.git project cf3>> Q:pkg install -L -y rs ...: directories). cf3>> Q:pkg install -L -y rs ...:*************************** GITWEB ************************************* cf3>> Q:pkg install -L -y rs ...: cf3>> Q:pkg install -L -y rs ...:*************************** CONTRIB ************************************ cf3>> Q:pkg install -L -y rs ...:If you installed the CONTRIB option please note that the scripts are cf3>> Q:pkg install -L -y rs ...:installed in /usr/local/share/git-core/contrib. Some of them require cf3>> Q:pkg install -L -y rs ...:other ports to be installed (perl, python, etc), which you may need to cf3>> Q:pkg install -L -y rs ...:install manually. cf3>> Q:pkg install -L -y rs ...:*************************** CONTRIB ************************************ cf3>> Q:pkg install -L -y rs ...:------------------------------------------------------------------------ cf3>> Q:pkg install -L -y rs ...: cf3>> -> Finished command related to promiser "rsync-3.0.9" -- succeeded cf3>> Bulk package schedule execution ok for rsync-3.0.9 (outcome cannot be promised by cf-agent) cf3>> Bulk package schedule execution ok for apg-2.3.0b_2 (outcome cannot be promised by cf-agent) cf3>> Bulk package schedule execution ok for emacs-23.4_1,2 (outcome cannot be promised by cf-agent) cf3>> Bulk package schedule execution ok for git-1.7.10.3 (outcome cannot be promised by cf-agent) cf3>> -> Update schedule... cf3>> -> Patch schedule... cf3>> -> Verify schedule... cf3>> cf3>> ========================================================= cf3>> vars in bundle packages (2) cf3>> ========================================================= cf3>> cf3>> cf3>> + Private classes augmented: cf3>> cf3>> - Private classes diminished: cf3>> cf3>> cf3>> cf3>> =========================================================
And this should give you just a start with package management with Cfengine 3 and pkgng under FreeBSD.
For more information on Cfengine 3 and FreeBSD, please check the links below:
Recent comments