I finally hacked together a Puppet recipe to update password hashes on FreeBSD!
Let me first say that I want to get native support for this to work like it should. According to this page: https://projects.puppetlabs.com/projects/puppet/wiki/Puppet_Free_Bsd. FreeBSD is missing something in the shadow libraries. I have added a note to that comment requesting someone add more info, so that we can tackle that problem.
On to the solution..
I have a custom function called `setupuser’ to manage users/groups/homedirs. I inherited this function from a coworker, so I am not sure if it is the best or right way. It did happen to make tackling the problem easy. Here is the custom function:
define setupuser($realname, $username, $password, $uid, $gid, $groups = false, $shell, $homedir) {
group { "$username":
ensure => present,
gid => $gid
}
user { "$username":
require => Group[$username],
ensure => present,
password => $password,
uid => $uid,
gid => $gid,
comment => "$realname",
groups => $groups,
home => "$homedir",
shell => "$shell"
}
file { "$homedir":
require => User[$username],
ensure => directory,
owner => $username,
group => $username,
mode => 0700
}
case $operatingsystem {
freebsd: {
exec { "$username hash":
command => "echo '$password' | pw user mod $username -H 0",
unless => "grep -q '$username:$password:' /etc/master.passwd",
path => "/bin:/usr/sbin:/usr/bin",
require => User[$username],
}
}
}
}
For reference here is what a call to that function looks like:
(the hash has been modified of course)..
setupuser { "brd":
realname => "Brad Davis",
username => brd,
password => '$1$fffffffffffffffffffffffffffffffffffff,
uid => 2012,
gid => 2012,
groups => $admingroup,
shell => $defaultshell,
homedir => "/home/brd"
}