Wenn ich mit Puppet arbeite passiert dieses leider viel zu häufig direkt auf dem Livesystem. Das ist natürlich Mist und darf so nicht sein. Eine Lösung ist Vagrant. Damit können sehr einfach „Wegwerf-VMs“ erzeugt werden um die Puppetkonfiguration zu testen. Wie das geht möchte ich in diesem Blogeintrag kurz festhalten.
Als Vorbereitung ist auf meinem PC das Paket virtualbox aus den Standardrepositories und Vagrant von deren Webseite installiert.
Um nun eine VirtualBox mit Ubuntu 12.04 LTS 64bit über Vagrant zu starten sind nur wenige Schritte notwendig:
mkdir ~/vagrant
cd ~/vagrant
touch HELLO_I_WAS_HERE
vagrant init puppetlabs/debian-7.4-64-puppet
vagrant up |
mkdir ~/vagrant
cd ~/vagrant
touch HELLO_I_WAS_HERE
vagrant init puppetlabs/debian-7.4-64-puppet
vagrant up
Die Ausgabe sollte ungefähr so aussehen:
user@host:~/vagrant$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'hashicorp/precise64' could not be found. Attempting to find and install...
default: Box Provider: virtualbox
default: Box Version: >= 0
==> default: Loading metadata for box 'hashicorp/precise64'
default: URL: https://vagrantcloud.com/hashicorp/precise64
==> default: Adding box 'hashicorp/precise64' (v1.1.0) for provider: virtualbox
default: Downloading: https://vagrantcloud.com/hashicorp/precise64/version/2/provider/virtualbox.box
==> default: Successfully added box 'hashicorp/precise64' (v1.1.0) for 'virtualbox'!
==> default: Importing base box 'hashicorp/precise64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'hashicorp/precise64' is up to date...
==> default: Setting the name of the VM: vagrant_default_1408706120277_30417
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
default: The guest additions on this VM do not match the installed version of
default: VirtualBox! In most cases this is fine, but in rare cases it can
default: prevent things such as shared folders from working properly. If you see
default: shared folder errors, please make sure the guest additions within the
default: virtual machine match the version of VirtualBox you have installed on
default: your host and reload your VM.
default:
default: Guest Additions Version: 4.2.0
default: VirtualBox Version: 4.1
==> default: Mounting shared folders...
default: /vagrant => /home/user/vagrant
user@host:~/vagrant$ |
user@host:~/vagrant$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Box 'hashicorp/precise64' could not be found. Attempting to find and install...
default: Box Provider: virtualbox
default: Box Version: >= 0
==> default: Loading metadata for box 'hashicorp/precise64'
default: URL: https://vagrantcloud.com/hashicorp/precise64
==> default: Adding box 'hashicorp/precise64' (v1.1.0) for provider: virtualbox
default: Downloading: https://vagrantcloud.com/hashicorp/precise64/version/2/provider/virtualbox.box
==> default: Successfully added box 'hashicorp/precise64' (v1.1.0) for 'virtualbox'!
==> default: Importing base box 'hashicorp/precise64'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'hashicorp/precise64' is up to date...
==> default: Setting the name of the VM: vagrant_default_1408706120277_30417
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
default: Adapter 1: nat
==> default: Forwarding ports...
default: 22 => 2222 (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
default: SSH address: 127.0.0.1:2222
default: SSH username: vagrant
default: SSH auth method: private key
==> default: Machine booted and ready!
==> default: Checking for guest additions in VM...
default: The guest additions on this VM do not match the installed version of
default: VirtualBox! In most cases this is fine, but in rare cases it can
default: prevent things such as shared folders from working properly. If you see
default: shared folder errors, please make sure the guest additions within the
default: virtual machine match the version of VirtualBox you have installed on
default: your host and reload your VM.
default:
default: Guest Additions Version: 4.2.0
default: VirtualBox Version: 4.1
==> default: Mounting shared folders...
default: /vagrant => /home/user/vagrant
user@host:~/vagrant$
Mit dem Befehl vagrant ssh kann nun eine SSH-Verbindung zu der VM hergestellt werden. Der Ordner ~/vagrant in dem wir uns befinden ist in der VM unter /vagrant/ verfügbar:
user@host:~/vagrant$ vagrant ssh
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)
* Documentation: https://help.ubuntu.com/
New release '14.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
Welcome to your Vagrant-built virtual machine.
Last login: Fri Sep 14 06:23:18 2012 from 10.0.2.2
vagrant@precise64:~$ ls -l /vagrant
total 20
-rw-r--r-- 1 vagrant vagrant 0 Aug 22 11:30 HELLO_I_WAS_HERE
-rw-r--r-- 1 vagrant vagrant 4826 Aug 22 11:11 Vagrantfile
vagrant@precise64:~$ |
user@host:~/vagrant$ vagrant ssh
Welcome to Ubuntu 12.04 LTS (GNU/Linux 3.2.0-23-generic x86_64)
* Documentation: https://help.ubuntu.com/
New release '14.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
Welcome to your Vagrant-built virtual machine.
Last login: Fri Sep 14 06:23:18 2012 from 10.0.2.2
vagrant@precise64:~$ ls -l /vagrant
total 20
-rw-r--r-- 1 vagrant vagrant 0 Aug 22 11:30 HELLO_I_WAS_HERE
-rw-r--r-- 1 vagrant vagrant 4826 Aug 22 11:11 Vagrantfile
vagrant@precise64:~$
Die VM kann mit vagrant destroy wieder gelöscht werden.
In der Datei Vagrantfile wird die VM konfiguriert. Das praktische ist, dass dort Puppet eingebunden werden kann, so dass beim Hochfahren der VM dieses gleich ausgeführt wird. Um nun meine Konfiguration zu testen kopiere ich das puppet Verzeichnis in den Ordner vagrant. Kopieren ist wichtig, ich habe zuerst einen symbolischen Link erzeugt, aber die VM kann dem ja nicht folgen 8-)
scp -r puppetmaster:/etc/puppet ~/vagrant/ |
scp -r puppetmaster:/etc/puppet ~/vagrant/
Anschließend sind in der Vagrantfile zwei Optionen zu konfigurieren. Erstens den Hostnamen der VM, damit wenn Puppet ausgeführt wird dieser korrekt ist und die richtigen Einstellungen übernommen werden. Zweitens den Pfad zu dem von puppet benötigten Manifest und den Modulen:
config.vm.hostname = "mynode.example.org"
config.vm.provision "puppet" do |puppet|
puppet.manifests_path = "puppet/manifests"
puppet.manifest_file = "site.pp"
puppet.module_path = "puppet/modules"
#puppet.options = "--verbose --debug"
end |
config.vm.hostname = "mynode.example.org"
config.vm.provision "puppet" do |puppet|
puppet.manifests_path = "puppet/manifests"
puppet.manifest_file = "site.pp"
puppet.module_path = "puppet/modules"
#puppet.options = "--verbose --debug"
end
Beim Starten der VM wird Puppet dann automatisch ausgeführt. Läuft die VM bereits kann das mit dem Befehl vagrant provision erneut angestoßen werden.
Auf diese Art- und Weise kann die Puppetkonfiguration in einer VM getestet werden bis alles so ist wie ich es haben möchte.
Zum Schluss: