Berichten met een Label ‘overig’

Puppet 3 cookbook review

Written by Ger Apeldoorn. Posted in Nieuws

Onlangs is er een nieuwe versie uitgekomen van het Puppet Cookbook door John Arundel. De uitgever is zo vriendelijk geweest om mij een kopie toe te sturen voor review.

Het boek is eigenlijk een verzameling van tips en brengt nuttige ideeën die je kunt gebruiken. Het varieert van de basics tot redelijk geavanceerd en het betrekt ook enkele externe hulpmiddelen (zoals git, hiera, vagrant) hierbij. Door de vaste structuur waarmee elke tip is opgebouwd lees het boek makkelijk weg.

Wat ik jammer vind is dat bij alle voorbeelden zelfgemaakte modules wordt gebruikt, terwijl het vaak handiger is om om goede module van de Forge te downloaden. Daarnaast komende behandelde onderwerpen redelijk willekeurig over.

Alles bij elkaar vind ik dit boek toch een aanrader. Hoewel de informatie ook wel te vinden is op het internet, kun je bij het doorbladeren van dit boek nuttige ideeën opdoen. Door de vaste structuur is elke tip makkelijk toe te passen.

Webshop uitgever

Script to generate certificates & Puppet-code

Written by Ger Apeldoorn. Posted in Sysadmin

My laziness knows no bounds, I use the script below to automate writing automation puppet code for creating new users (and generating, converting and mailing their certificates too)…

This ruby script will read information from a CSV-file and:

  • generate certificate with a random passphrase
  • create a Putty version
  • email the (encrypted) certificates to the user
  • prints the Puppet-resource definition to STDOUT
  • store the passphrase in a textfile

It will check if the certificates have already been generated (check if directory exists), so you can just add to the CSV-file.

Installing

Prerequisites:

  • Ruby of course
  • some rubygems: mail, csv
  • pwgen
  • ssh-keygen
  • puttygen

Just put the files below in the same directory.

Usage

Edit the userlist.txt to add users; the format is:

userid,username,name,email,groups (groups ; seperated)

Example:

"1001","gertest","Ger Apeldoorn","g.apeldoorn@example.nl","admin;dev;prutsor"
"1002","gertest2","Ger Apeldoorn","g.apeldoorn@example.nl","admin;dev;prutsor"

After that’s done, just run the script:

./gencerts.rb

Example output:

@pe_accounts::user { 'gertest':
	locked  => false,
	comment => 'Ger Apeldoorn',
	uid     => '999',
	gid     => '999',
	groups  => ["admin", "dev", "prutsor"],
	sshkeys => ['ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCnCWb6yiDpOdtzJ3w0Hf/MOIvXswpqu3XnotDtgAkJaH/ZtC/wNrwAsm+ugyGtTmWTX22LdJ1M4mr0KYk7cj1m6QlKp78R4485uERFn0/q6LAJSqKYzEFY53SGECCn/BVZWYDJQ6UcoslouSiIsDivC+rwrG4UGAwdyDSED4PrT0U2kTkPeadbxqvT3FcHcO1HuQF8nMZ g.apeldoorn@example.nl'],
}

After running this, the user receives an email with mailtext.txt as contents and three attachments:

  • id_rsa
  • id_rsa.pub
  • putty_private.ppk

Note that the private keys are protected with the passphrase… 🙂

Files

gencerts.rb:

#!/usr/bin/env ruby
CSVFILE = 'userlist.txt'
EMAILCONTENT = 'mailtext.txt'
CURDIR = Dir.pwd

require 'csv'
require 'rubygems'
gem 'mail'
require 'mail'

def which(cmd)
  exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : ['']
  ENV['PATH'].split(File::PATH_SEPARATOR).each do |path|
    exts.each { |ext|
      exe = "#{path}/#{cmd}#{ext}"
      return exe if File.executable? exe
    }
  end
  return nil
end

def preflight_checks
        #see if apps are installed and in path
        puts "pwgen is not installed"      if not which('pwgen')
        puts "ssh-keygen is not installed" if not which('ssh-keygen')
        puts "puttygen is not installed"   if not which('puttygen')
end

def send_email(username, email)
        mail = Mail.new do
                from    'linuxbeheer@fundeon.nl'
                to              email
                subject 'Your SSH keys'
                body    File.read(File.join(CURDIR, EMAILCONTENT))
        end
        mail.add_file(File.join(CURDIR, username, "id_rsa"))
        mail.add_file(File.join(CURDIR, username, "id_rsa.pub"))
        mail.add_file(File.join(CURDIR, username, "putty_private.ppk"))
        mail.delivery_method :sendmail
        mail.deliver
end
def print_puppetconfig(userid,username,name,email,groups)
        puts "@pe_accounts::user { '#{username}':"
        puts "  locked  => false,"
        puts "  comment => '#{name}',"
        puts "  uid     => '#{userid}',"
        puts "  gid     => '#{userid}',"
        puts "  groups  => #{groups.split(";").inspect},"
        pubkey = File.read(File.join(CURDIR, username, "id_rsa.pub")).chomp
        puts "  sshkeys => ['#{pubkey}'],"
        puts "}"

end

preflight_checks

CSV.foreach(CSVFILE) do |row|
        userid,username,name,email,groups = row
        if File.exists?(File.join(CURDIR, username))
                puts "Directory for user #{username} already exists"
                next
        end
        Dir.mkdir(File.join(CURDIR, username))
        Dir.chdir(File.join(CURDIR, username))
        passphrase=`pwgen -c -n -1 10`
        passphrase.chomp!
        #Create SSH keypair
        `ssh-keygen -C #{email} -P #{passphrase} -f id_rsa`
        #Convert SSH keypair to Putty
        `echo #{passphrase} | puttygen id_rsa -O private -o putty_private.ppk`
        #Save the passphrase
        File.open("passphrase", 'w') {|f| f.write(passphrase) }
        send_email(username, email)
        print_puppetconfig(userid,username,name,email,groups)
end

mailtext.txt:

Hi,

You will find your OpenSSH and Putty keys attached. You can use these keys to login to any Linux server for which you are authorized.

You can get the passphrase from -----.

Kind regards.
Le Pinguin

Have fun!

De ideale werkomgeving (voor mij dan)

Written by Ger Apeldoorn. Posted in Sysadmin

Een goede editor is onmisbaar bij het schrijven van welke code dan ook. Ik een hekel aan opgeblazen IDE’s waarmee ik veel tijd kwijt ben aan het browsen/zoeken door het menu, of de muis moet grijpen om dingen gedaan te krijgen.

Sublime Text 2

Sublime Text is een cross-platform editor die met kop en schouders boven alle andere uitsteekt. Er zijn erg goede plugins voor te vinden die echt helpen bij het schrijven van je Puppet code.