Berichten met een Label ‘techniek’

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!

Betere versienummers bij Puppet runs

Written by Ger Apeldoorn. Posted in Sysadmin

Bij elke Puppetrun wordt er een configuratieversie getoont, dit is een nummer gebaseerd op datum/tijd.

Voorbeeld:

# puppet agent -t
info: Retrieving plugin
----%<----
info: Caching catalog for web99.puppetspecialist.nl
info: Applying configuration version '126374558'

Aangezien wij onze manifests en hiera-data met Git beheren (en die met tags uitrollen) kunnen we daar natuurlijk beter iets aan koppelen waar we wat aan hebben:

# puppet agent -t
info: Retrieving plugin
----%<----
info: Caching catalog for web99.puppetspecialist.nl
info: Applying configuration version '3.18.0/1.11.0/development'

Zoals je hierboven kunt zien is het versienummer uit 3 componenten opgebouwd:

  • Tag Manifests
  • Tag Hieradata
  • Environment

Daar heb je tenminste wat aan!

Om dit voorelkaar te krijgen, moeten we een paar handelingen verrichten:

  • Script plaatsen
  • Configuratie Puppet Master aanpassen
  • Puppet Master restarten

Script

Maak een scriptje aan (/etc/puppetlabs/puppet/version.sh) met de volgende inhoud:

#!/bin/bash
MANVER=$(git --git-dir=/etc/puppetlabs/puppet/environments/$1/.git describe --tags)
DATVER=$(git --git-dir=/etc/puppetlabs/puppet/environments/$1_data/.git describe --tags)

echo "$MANVER/$DATVER/$1"

Maak hem executable:

chmod +x /etc/puppetlabs/puppet/version.sh

Configuratie Puppet Master

Voeg aan /etc/puppetlabs/puppet/puppet.conf het volgende regeltje toe onder [main].

config_version = /etc/puppetlabs/puppet/version.sh $environment

Restart Puppet Master

Als laatste restarten we nog even de PUppet Master om de configuratiewijziging te activeren:

/etc/init.d/pe-httpd restart

Hiera in gebruik

Written by Ger Apeldoorn. Posted in Sysadmin

Voor dit artikel ga ik ervan uit dat je Hiera al hebt ingericht. Mocht dit nog niet zo zijn, lees dan eerst onderstaande artikelen voor meer achtergrondinformatie.

Een simpele waarde ophalen

Een waarde ophalen uit Hiera is bijzonder eenvoudig! Puppet kent de functie hiera(), deze doet al het werk voor je.

Laten we met een voorbeeldje werken, aanschouw dit YAML-bestand:

Module op Forge gepubliceerd

Written by Ger Apeldoorn. Posted in Nieuws

forge-logoVandaag heb ik mijn module om RedHat servers te registreren bij Satellite of RHN-classic geupdate op Puppetforge. Puppetforge is een verzamelplaats voor modules die zijn gebouwd door gebruikers van Puppet.

Met deze module kun je ook heel simpel je systemen migreren van (of naar) Satellite server. De benodigde gegevens (API-key) kun je via parameters doorgeven, maar parameters die zijn verkregen via Hiera hebben prioriteit.

Een klant wilde alle RH servers migreren vanuit Satellite Server naar de hosted RHN-Classic. Door deze module is dat zonder problemen en eenvoudig verlopen.

http://forge.puppetlabs.com/gerapeldoorn/rhn

Single command server deployment

Written by Ger Apeldoorn. Posted in Sysadmin

This article is in English because it was mentioned in a PuppetLabs newsletter.

Although Puppet Enterprise gives you the wonderful tools to automate your Linux administration, you still cannot deploy a server with a single command. With the following script, you can.

Why is this so cool?

When, for instance, a new Tomcat server is needed, I create a DNS entry for that server and give a single command and get some coffee. Before it has cooled down enough to drink, the developer has his Tomcat-app deployed and the server is operational. (It takes about 8 minutes to get from scratch to a fully operational server.)

Hiera inrichten

Written by Ger Apeldoorn. Posted in Sysadmin

De meeste Puppet inrichtingen hebben veel baat bij Hiera. Je manifests worden nodeloos complex of onoverzichtelijk omdat er data in komt. Met de tool Hiera kun je eenvoudig de data scheiden van je manifests. Hier vind je meer goede redenen om Hiera te gebruiken.

In dit artikel ga ik ervan uit dat je al Environments gebruikt voor je manifests, klik hier om te tonen hoe je dat kunt opzetten met Git.

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.