Setup puppetDB with HSQLDB

PuppetDB adalah generasi terbaru dari puppetlabs untuk menyimpan dan mengambil catalogs, facts, dan exported resources. Bagi siapapun yang telah banyak menggunakan puppet storeconfigs pasti akan merasa, bahwa storeconfigs lambat dalam mengambil data, ya hal ini wajar menurut penulis karena data yang telah di generate oleh puppet di simpan oleh storeconfigs kedalam sebuah database seperti MySQL, SQLite atau PostgreSQL. Jadi salah satu faktor lambatnya bergantung pula pada performa database yang digunakan, nah untuk menyelesaikan problema tersebut developer puppet membuat puppetDB, menurut penulis lebih cepat, lebih mudah dalam konfigurasi, dan lebih mudah juga dalam maintenance-nya. PuppetDB base Java jadi membutuhkan JVM untuk menjalankannya. Sebenarnya puppetdb di tempatkan pada relational database. Ada dua database yang di support yaitu HSQLDB dan  PostgreSQL. Tetapi bila di config maka secara default akan menggunakan HSQLDB. Nah kali ini penulis akan menggunakan defaultnya dulu, karena pointnya kali ini adalah bagaimana setup PuppetDB. Silahkan baca artikel seletah ini sebagai kelanjutannya, yaitu PuppetDB dengan PostgreSQL. Ohya jangan harap PuppetDB akan mendukung MySQL karena tidak memiliki dukungan untuk query rekursif. Mari kita sama-sama pelajari bagaimana setup puppetDB. Berikut step yang akan kita lakukan:

1. Instalasi puppetDB
2. Firewalling
3. Setup puppetDB
4. Testing



Informasi melalui situs puppetlabs untuk versi terbaru adalah 1.0 memiliki fitur yang sungguh menggiurkan:

* It’s a drop-in, 100% compatible replacement for storeconfigs
* It’s a drop-in, 100% compatible replacement for inventory service
* It's already in production at many sites, handling thousands of nodes and
   millions of resources
* It hooks into your Puppet infrastructure using Puppet’s pre-existing
   extension points (catalog/facts/resource/node terminuses)
* It’s much faster, much more space-efficient, and much more scalable
   than current storeconfigs and the current inventory service.
   * We can handle a few thousand nodes, with several hundred
      resources each, with a 30m runinterval on our laptops during
      development.
* It stores the entire catalog, including all dependency and
   containment information
* It exposes well-defined, HTTP-based methods for accessing stored information
* Documented at http://docs.puppetlabs.com/puppetdb
* It presents a superset of the storeconfigs and inventory service
   APIs for use in scripts or by other tools
   * In particular, we support arbitrarily nested boolean operators
* It decouples catalog and fact storage from the compilation process
   * PuppetDB obsoletes previous puppetq functionality
* It works Very Hard to store everything you send it; we auto-retry
   all storage requests, persist storage requests across restarts,
   and preserve full traces of all failed requests for post-mortem analysis
* It’s secured using Puppet’s built-in SSL infrastructure
* It’s heavily instrumented and easy to integrate its performance info into
   your monitoring frameworks

Versi 1.0 inilah yang akan kita mainkan, sebenarnya penulis sudah ingin mencoba dari versi 0.9 tapi menunggu versi ini agar lebih stabil.

1. Instalasi puppetDB

Sebelum menginstal berikut hal yang perlu kita perhatikan:
1. Versi puppet pada konfigurasi ini adalah 3.0.0.1 open source
2. Sudah memiliki puppetmaster dan puppet agent yang berjalan
3. Sistem operasi yang penulis pakai adalah CentOS, compatible with Redhat.
4. Telah setup puppetlabs repository
5. puppetDB dan puppetmaster dalam satu host

untuk melakukan semua hal diatas, setupnya kita bisa lihat di unixhat.blogspot.com/2012/10/konfigurasi-puppet-dan-puppetmaster.html

Instalasi puppetDB menggunakan puppet
Kita bisa melakukan instalasi puppetDB dengan menggunakan puppet atau dengan yum, tapi agar terlihat fitur puppet yang keren ini maka penulis menggunakannya :).
[root@LAB01-01 ~]# puppet resource package puppetdb ensure=latest
/Package[puppetdb]/ensure: created
package { 'puppetdb':
  ensure => '1.0.1-1.el5',
}

Output diatas berarti puppetDB sudah terinstall beserta depencies yang dibutuhkannya, seperti openjdk, jpackage dkk, memang tidak terlihat, apa saja yang sedang di lakukan, tapi kalau kita buka terminal baru dan ketikkan ps ax maka akan terlihat apa yang puppet perbuat, sama dengan kita menginstall dengan yum.
[root@LAB01-01 ~]# ps ax
1666 pts/0    S+     0:01 /usr/bin/ruby /usr/bin/puppet resource package puppetdb ensure=latest
 1722 ?        Ss     0:02 /usr/bin/python /usr/bin/yum -d 0 -e 0 -y install puppetdb
Kalau ingin melihat paket apa saja yang dibutuhkan atau telah di install kita bisa lihat pada log-nya  yum:
[root@LAB01-01 ~]# tail /var/log/yum.log
Oct 12 02:23:55 Installed: alsa-lib-1.0.17-1.el5.x86_64
Oct 12 02:23:56 Installed: libXtst-1.0.1-3.1.x86_64
Oct 12 02:23:57 Installed: jpackage-utils-1.7.3-1jpp.2.el5.noarch
Oct 12 02:24:01 Installed: tzdata-java-2012f-1.el5.x86_64
Oct 12 02:24:18 Installed: 1:java-1.6.0-openjdk-1.6.0.0-1.28.1.10.9.el5_8.x86_64
Oct 12 02:24:40 Installed: puppetdb-1.0.1-1.el5.noarch
Terlihat disana JVM dibalik layar puppetDB :). Selesai sudah tahap instalasi puppetDB, berikutnya adalah setup firewall pada puppetDB host agar bisa di akses.

2. Firewalling

PuppetDB menggunakan port 8081 untuk default lalu-lalang datanya. Silahkan bukalah port 8081 pada filewall pembaca, entah itu di cisco, solaris, linux, shorewall dll. Berikut contohnya pada linux:
[root@LAB01-01 ~]# iptables -A INPUT -p tcp -m state --state NEW --dport 8081 -j ACCEPT 
Perintah ipbtables diatas tidak di rekomendasikan pada production server. Karena membuka port 8081 untuk semua IP.

3. Setup puppetDB
Setelah install puppetDB dan setup firewall, saatnya untuk konfigurasi puppetDB, yaitu agar bisa berkomunikasi dengan puppetmaster. berikut yang akan kita lakukan:

a. Install plugin untuk puppetmaster
b. Setup puppetDB

a. puppetmaster membutuhkan plugin Ruby agar bisa menggunakan puppetDB, yaitu paket pe-puppetdb-terminus, penulis akan menggunakan puppet, mari kita install paket tersebut:
[root@LAB01-01 ~]# puppet resource package puppetdb-terminus ensure=latest
/Package[puppetdb-terminus]/ensure: created
package { 'puppetdb-terminus':
  ensure => '1.0.1-1.el5',
}
Cek keberadaan paket
[root@LAB01-01 ~]# rpm -qa|grep terminus
puppetdb-terminus-1.0.1-1.el5

b. Setup puppetDB
Cek dimana posisi konfigurasi puppetmaster:
[root@LAB01-01 ~]# puppet config print confdir
/etc/puppet
[root@LAB01-01 ~]# ls -la /etc/puppet
total 72
drwxr-xr-x  4 root root 4096 Oct 14 23:21 .
drwxr-xr-x 82 root root 4096 Oct 15 00:02 ..
-rw-r--r--  1 root root 2979 Sep 28 13:34 auth.conf
-rw-r--r--  1 root root  381 Sep 21 15:06 fileserver.conf
drwxr-xr-x  2 root root 4096 Oct 12 05:25 manifests
drwxr-xr-x  2 root root 4096 Sep 28 13:34 modules
-rw-r--r--  1 root root 1056 Oct 14 23:15 puppet.conf
Selanjutnya buat file konfigurasi untuk puppetdb, yaitu puppetdb.conf pada folder /etc/puppet, dengan isi:
[main]
server = LAB01-01.cloud.net
port = 8081

berikut adalah contoh dari file yang sudah penulis buat:
[root@LAB01-01 puppet]# cat /etc/puppet/puppetdb.conf
[main]
server = LAB01-01.cloud.net
port = 8081
Kemudian tambahkan isi dari block config master, atau buat [master] jika belum ada:
[master]
storeconfigs = true
storeconfigs_backend = puppetdb

berikut contoh dari lengkapnya dari file penulis:
[root@LAB01-01 ~]# cat /etc/puppet/puppet.conf
[main]
    # The Puppet log directory.
    # The default value is '$vardir/log'.
    logdir = /var/log/puppet

    # Where Puppet PID files are kept.
    # The default value is '$vardir/run'.
    rundir = /var/run/puppet

    # Where SSL certificates are kept.
    # The default value is '$confdir/ssl'.
    ssldir = $vardir/ssl

[agent]
    # The file in which puppetd stores a list of the classes
    # associated with the retrieved configuratiion.  Can be loaded in
    # the separate ``puppet`` executable using the ``--loadclasses``
    # option.
    # The default value is '$confdir/classes.txt'.
    classfile = $vardir/classes.txt

    # Where puppetd caches the local configuration.  An
    # extension indicating the cache format is added automatically.
    # The default value is '$confdir/localconfig'.
    localconfig = $vardir/localconfig

[master]
storeconfigs = true
storeconfigs_backend = puppetdb

Perlu di perhatikan, jika sebelumnya telah menggunakan storeconfigs, silahkan hapus atau komen settingannya, agar puppet hanya menggunakan puppetDB.

berikutnya adalah membuat file routes.yaml, file ini berguna pada saat kita ingin membuat layanan inventaris pada host-host yang kita miliki sebagai puppet agent. Berikut file yang telah penulis buat:
[root@LAB01-01 puppet]# cat /etc/puppet/routes.yaml
---
master:
  facts:
    terminus: puppetdb
    cache: yaml

Alhamdulillah selesai sudah tahap setup puppetDB, tahap akhir adalah dengan mengaplikasi file-file yang telah kita buat dan modifikasi tadi, dengan merestart puppetmaster:
[root@LAB01-01 puppet]# /etc/init.d/puppetmaster restart
Stopping puppetmaster:                                     [  OK  ]
Starting puppetmaster:                                     [  OK  ]

3. Testing

Saatnya melakukan percobaan untuk melakukan permintaan cataolog pada puppetmaster, dari puppet agent:
[root@LAB01-02 ~]# puppet agent --test
Info: Retrieving plugin
Info: Caching catalog for lab01-02.cloud.net
Info: Applying configuration version '1350271290'
Finished catalog run in 0.16 seconds

Sekarang kita menuju puppetmaster, lihat log dari puppetDb apakah puppetDB bisa menangkap data yang telah di generate oleh puppetmaster?
[root@LAB01-01 puppet]# tail /var/log/puppetdb/puppetdb.log
2012-10-14 23:21:30,147 INFO  [command-proc-75] [puppetdb.command] [4c52c562-c705-4c53-ab05-bafa03419424] [replace facts] lab01-02.cloud.net
2012-10-14 23:21:31,503 INFO  [command-proc-75] [puppetdb.command] [10757243-a180-4563-8db3-d591d3d626ae] [replace catalog] lab01-02.cloud.net
Ya, Alhamdullilah ada output yang mengindikasikan bahwa catalog puppet agent untuk lab01-02.cloud.net sudah di simpan. Demikian mengenai puppetDB semoga bermanfaat dan sebagai tanggung jawab penulis atas ilmu yang telah Alloh berikan, amiiinn.