Puppet: Set the User's Password

A few months ago, I published a post about using Puppet to manage infrastructure. As my company grows, I'm finding it more important to ensure that all of my servers are managed in a sane manner. To me, this includes ensuring that if one of my servers ever goes down, or the data center it's in gets smashed by a meteor, I could theoretically be back up and running just by migrating to another data center.

At the end of that first post, I had created a couple of Linodes and installed Puppet on them. I had also created a user and group on the slave node. But...I couldn't login to the slave node as the user I'd created, because it didn't have a password!

Since I'm going to be updating my user today, I'll include my original user definition below.

user { "mike":
    ensure     => present,
    gid        => 'mike',
    groups     => [ 'sudo', 'users' ],
    shell      => '/usr/bin/fish',
    home       => '/home/mike',
    managehome => true,
}

Set the Password

It turns out that setting the password for a Puppet user isn't that hard.

First, use openssl to create the hashed/salted password on a commandline:

[root@puppetslave ~]$ openssl passwd -1
Password: <enter password here>
Verifying - Password: <enter the same password here>
$1$qH8newGR$4nApEG7NQHqLHYNLIEZlx0

Then take the output (the last line) and stick it in the site.pp file on the master node. Thus, my user definition on my puppetmaster now looks like this:

user { "mike":
    ensure     => present,
    gid        => 'mike',
    groups     => [ 'sudo', 'users' ],
    shell      => '/usr/bin/fish',
    home       => '/home/mike',
    managehome => true,
    password   => '$1$qH8newGR$4nApEG7NQHqLHYNLIEZlx0',
}

Note: since the hashed and salted password value contains $ symbols, it's important to enclose the value in single quotes, not double quotes. If you use double quotes, the Ruby system underlying Puppet will attempt to interpolate the things following the dollar signs as variables...And your user's password won't work.

In order to update the user definition on the slave, run the puppet agent manually (because I turned off auto-updating last time):

[root@puppetslave ~]$ puppet agent --test
Info: Retrieving plugin
Info: Caching catalog for puppetslave.mavelo.us
Info: Applying configuration version '1433418208'
Notice: /Stage[main]/Main/Node[default]/User[mike]/password: changed password
Notice: Finished catalog run in 0.23 seconds

I can now login to my puppetslave's mike user using the password I entered on the openssl commandline above:

mvitale@mavelous ~/W/M/P/blog (master)> ssh mike@puppetslave.mavelo.us
mike@puppetslave.mavelo.us's password: 
Welcome to Ubuntu 14.04.2 LTS (GNU/Linux 4.0.4-x86_64-linode57 x86_64)

 * Documentation:  https://help.ubuntu.com/

63 packages can be updated.
24 updates are security updates.


The programs included with the Ubuntu system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Ubuntu comes with ABSOLUTELY NO WARRANTY, to the extent permitted by
applicable law.

Welcome to fish, the friendly interactive shell
Type help for instructions on how to use fish
mike@puppetslave ~> 

(Note: for those of you following along at home, last time I installed tcsh as my shell. In the interim, I've changed that so that I'm now using fish as my shell, which matches what I use on my Mac laptop. However, as you can see, it's not configured very well yet.)

Darn It

I had wanted to include setting up SSH keys in this post, but I'm out of time for this morning. Gotta run to work. I'll follow up soon (sooner than last time, I promise!) with how I accomplished that feat.