Hi readers,

Just want to let you know that i have created a docker container for puppet syntax checker. You can found the container at here, and if you interest to use this container please follow below instructions:

  1. Assumed if you have own puppet module (or you can for popular modules, let say puppetlabs-apt)

  2. Your own module located in ~/puppet/module and you are now in there

To check your module just type below in your terminal

$ docker run -v $(pwd):/code udienz/puppet-lint

You may see te output like below:

Don't run Bundler as root. Bundler can ask for sudo if it is needed, and
installing your bundle as root will break this application for all non-root
users on this machine.
Fetching gem metadata from https://rubygems.org/
Fetching version metadata from https://rubygems.org/
Installing rake 11.2.2
Installing CFPropertyList 2.2.8
Installing ast 2.3.0
Installing diff-lcs 1.2.5
Installing facter 2.4.6
Installing json_pure 2.0.1
Installing json 2.0.1 with native extensions
Installing metaclass 0.0.4
Installing spdx-licenses 1.1.0
Installing powerpack 0.1.1
Installing puppet-lint 1.1.0
Installing rspec-support 3.5.0
Installing rainbow 2.1.0
Installing ruby-progressbar 1.8.1
Installing unicode-display_width 1.1.0
Using bundler 1.12.5
Installing puppet-syntax 2.1.0
Installing parser 2.3.1.2
Installing hiera 3.2.0
Installing mocha 1.1.0
Installing metadata-json-lint 0.0.11
Installing puppet-lint-absolute_template_path 1.0.0
Installing puppet-lint-strict_indent-check 2.0.2
Installing puppet-lint-trailing_newline-check 1.0.0
Installing puppet-lint-unquoted_string-check 0.3.0
Installing puppet-lint-variable_contains_upcase 1.0.0
Installing rspec-core 3.5.0
Installing rspec-expectations 3.5.0
Installing rspec-mocks 3.5.0
Installing rubocop 0.41.1
Installing puppet 4.5.2
Installing rspec 3.5.0
Installing rspec-puppet 2.4.0
Installing puppetlabs_spec_helper 1.1.1
Bundle complete! 12 Gemfile dependencies, 34 gems now installed.
Use `bundle show [gemname]` to see where a bundled gem is installed.
---> syntax:manifests
---> syntax:templates
---> syntax:hiera:yaml
puppet-lint manifests/account.pp
WARNING: line has more than 80 characters on line 33
WARNING: line has more than 80 characters on line 39
WARNING: line has more than 80 characters on line 45
WARNING: line has more than 80 characters on line 51
WARNING: line has more than 80 characters on line 57
WARNING: line has more than 80 characters on line 63
puppet-lint manifests/debian/sourceslist/ubuntu.pp
puppet-lint manifests/debian/sourceslist/debian.pp
puppet-lint manifests/fqdn/vpswow1.pp
puppet-lint manifests/fqdn/vpswow2.pp
puppet-lint manifests/fqdn/vpswow3.pp
puppet-lint manifests/fqdn/sealabs.pp
puppet-lint manifests/fqdn/vpswow4.pp
puppet-lint manifests/fqdn.pp
puppet-lint manifests/package.pp
puppet-lint manifests/init.pp
puppet-lint manifests/package/nginx.pp
puppet-lint manifests/package/common.pp
puppet-lint manifests/package/ssh.pp
WARNING: line has more than 80 characters on line 41
WARNING: line has more than 80 characters on line 47
WARNING: line has more than 80 characters on line 53
puppet-lint manifests/redhat.pp
puppet-lint manifests/debian.pp
puppet-lint manifests/centos.pp
puppet-lint manifests/osfamily.pp
puppet-lint manifests/docker.pp
ruby -c spec/spec_helper.rb
Syntax OK
ruby -c spec/classes/init_spec.rb
Syntax OK

You might fix ERROR/WARNING messages :) Happy hacking


Saya akan membahas posting Om JP tentang integrasi Nginx, Uwsgi dan PHP dengan cara puppet. Sebelumnya mohon dengan sangat membaca dulu blog di Om JP.

Kemudian silakan install puppet yang sudah saya jabarkan di blog ini, kemudian install module nginx dengan cara

[email protected]: ~# puppet module install jfryman-nginx

Dengan asumsi hanya menggunakan satu server (tidak menggunakan node definition ataupun class dan module) maka silakan sunting berkas /etc/puppet/manifests/site.pp. Dan isikan seperti berikut:

    package { [
        'uwsgi',
        'uwsgi-plugin-php',
        ]:
        ensure => installed,
        }
    
    service { 'uwsgi':
        ensure => running,
        enable => true,
    }
    file { '/etc/uwsgi/apps-enabled/':
        ensure => present,
        owner => 'root',
        source => 'puppet:///uwsgi/',
        recurse => true,
        require => Package['uwsgi-plugin-php'],
        notify => Service['uwsgi'],
        }
    nginx::resource::vhost { "$::fqdn":
      ensure => 'present',
      www_root => '/srv/www',
      autoindex => 'on',
      try_files => [ '$uri', '$uri/', '/index.php?args' ],
     }
    
    nginx::resource::location { 'location1_fqdn':
     ensure => present,
     vhost => "$::fqdn",
     location => '~.php$',
     www_root => '/srv/www/',
     location_cfg_append => {
        include => 'uwsgi_params',
        uwsgi_modifier1 => '14',
        uwsgi_pass => 'unix:/tmp/uwsgi_webphp.sock',
     },
    }
    
    include nginx

Selanjutnya silakan buat foler di /etc/puppet/files/ dan buat berkas init.ini di dalamnya yang berisikan seperti dibawah:

[uwsgi]
socket=/tmp/uwsgi_webphp.sock
pidfile2=/tmp/uwsgi_webphp.pid
daemonize=/var/log/uwsgi/webphp.log
plugins=php

chdir=/var/www
cheaper=4
close-on-exec=1
harakiri=360
max-requests=128
processes=8
master=1
uid=www-data
gid=www-data
chmod=666
log-5xx=1
vacuum=1
post-buffering=8192M

Simpan dan jalankan puppet agent

sudo puppet agent --test

dan silakan akses http://localhost/index.php maka hasilnya kurang lebih sama dengan punya Om JP.


Sepertin yang telah saya singgung pada tulisan sebelumnya tentang menghapus user di 100 node server, dengan puppet menghapus user di 100 node menjadi sangat mudah. Anda tidak perlu login ke semua node server, yang anda kerjakan hanya menuliskan beberapa baris code di puppet.

Pada tulisan kali ini saya akan membahas tentang manajemen user dengan puppet.

Membuang user yang ada.

Untuk menambahkan user atau sekedar memastikan properti dari user, puppet sangat mendukung. Contohnya dalam code berikut user ani akan dibuang di semua server:

user { 'ani':
    ensure => absent,
    home => '/home/ani',
    managehome => true,
 }

Penjelasan: User ani dipastikan absen karena terdapat ‘ensure=>absent’, managehome dibutuhkan untuk memastikan bahwa $HOME direktori ani juga dibuang.

Membuat User

Untuk menambahkan user cukup ubah absent menjadi present, contohnya untuk user budi

 user { 'budi':
    ensure => present,
    home => '/home/budi',
    managehome => true,
        shell => '/bin/bash',
 }

Dari code diatas, ada tambahan shell, yaitu mendefinisikan shell yang akan digunakan oleh pengguna. Jika anda tidak mengatur shell, maka akan dibuatakan shell /bin/sh

Password

Untuk melakukan penentuan password pada user, dapat menggunakan kolom password, seperti pada kode dibawah.

user { 'cika' :
 ensure => present,
 shell => '/bin/bash',
 managehome => yes,
 comment => 'Cika Juga',
 password => '$1$RQVI1gQL$V8DCkOeyBo.49dCE4DyCE0'
}

Untuk password user cika, saya menggunakan password ‘cikajuga’, password tersebut dalam format hash. Untuk meghasilkan password dalam format hash dapat gi buat dengan perintah sebegai berikut:

[email protected]:~# openssl passwd -1
Password:
Verifying - Password:
$1$RQVI1gQL$V8DCkOeyBo.49dCE4DyCE0

SSH keys

Dalam puppet kita juga dapat mengatur kunci ssh yang digunakan, contoh penggunaan ssh key dapat dilihat dalam kode dibawah:

   ssh_authorized_key { 'dita_jumbox_ecdsa':
        user => 'dita',
        type => 'ecdsa-sha2-nistp256',
        key  => 'AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBIsT232WPROxL+Sid0lIr96uOk0rl/Rp6YVrQZNkwBLIa9OJXAk55QDoyFePvRc0xxevKCbcZbmVG2kpm6zsSgM='
    }

hasilnya, dalam home direktori dita akan terdapat berkas ssh authorized_keys (~dita/.ssh/authorized_keys). Nah bagaimana caranya agar hanya kunci ssh yang terdaftar di puppet saja yang boleh tercantum di ~dita/.ssh/authorized_keys ? untuk itu, kita harus menambahkan isian ‘purge_ssh_keys => true,


Intro

Puppet adalah software untuk mengatur infrastuktur yang membantu administrator untuk membuat otomatisasi pada semua node server, membuat template, menghindari perintah berulang-ulang. Pada kehidupan nyata, system administrator harus memastikan bahwasanya semua servernya memilik aplikasi terbaru dari repository. Jika system administrator (sysadmin) hanya memanage kurang dari lima server, maka akan mudah bagi sysadmin untuk login ke setiap node dan menjalankan perintah yang dapat memastikan servernya up to date. Bayangkan apabila sysadmin memegang 100 server! tentunya akan menyita waktu bagi sysadmin untuk melakukan login ke semua node.

Contoh lain, puppet dapat melakukan manajemen user, sebuah perusahaan mempunyai dua orang sysadmin yaitu Amin dan Budi. Amin salah satu dari sysadmin tersebut akan mengundurkan diri (resign), umumnya setiap sysadmin memiliki user sendiri-sendiri pada setiap node server. Apabila perusahaan tersebut mempunyai seratus node, Budi harus memastikan bahwasanya login untuk Amin sudah dihapus setelah Amin dinyatakan resmi tidak bekerja pada perusahaan. Nah bagaimana teknisnya? apakah Budi akan melakukan login ke semua server dan membuang user admin? bisa sih, tapi mau kah Budi login ke seratus server? Cara yang gampang bisa menggunakan software manajemen tool semacam puppet.

Persiapan

Pada tulisan kali ini, saya menggunakan Debian Jessie di Virtualbox, saya asumsikan bahwasanya Debian telah terpasang di Virtualbox. Domain yang akan saya pakai adalah puppet.id Note: Untuk mengakali proses dns resolving, kita dapat mengakali nya di berkas /etc/hosts. Berikut adalah isi dari /etc/hosts pada master:

127.0.0.1       localhost
127.0.1.1       puppet master puppet.puppet.id master.puppet.id

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Membuat puppet master

Tahap pertama adalah membuat puppet master, beberapa alternatif untuk membuat puppet master, bisa menggunakan passangger atau dari binary puppet master. Saya akan menggunakan puppet master untuk kali ini. Untuk hostname pada puppet master saya menggunakan nama master.puppet.id

Silakan login ke server master untuk memulai pemasangan. Pada tahap ini kita akan melakukan refresh database paket dan pemasangan ntp.

[email protected]:~# apt-get update && apt-get dist-upgrade -y && apt-get install ntp -y

Langkah selanjutnya adalah mengunduh binary untuk repository puppet dan pemasangan puppetmaster.

[email protected]:~# cd /tmp/
[email protected]:/tmp# wget http://apt.puppetlabs.com/puppetlabs-release-jessie.deb
[email protected]:/tmp# dpkg -i puppetlabs-release-jessie.deb
(Reading database ... 30917 files and directories currently installed.)
Preparing to unpack puppetlabs-release-jessie.deb ...
Unpacking puppetlabs-release (1.0-11) over (1.0-11) ...
Setting up puppetlabs-release (1.0-11) ...
[email protected]:/tmp# apt-get update && apt-get install puppetmaster -y

Matikan service puppet master terlebih dahulu:

[email protected]:~# service puppetmaster stop
 * Stopping puppet master                                                [ OK ]

Langkah selanjutnya adalah mengatur pengaturan dari puppet yang terletak di /etc/puppet/puppet.conf, silakan buka berkas tersebut dan edit seperti pada tampilan dibawah:

[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
#prerun_command=/etc/puppet/etckeeper-commit-pre
#postrun_command=/etc/puppet/etckeeper-commit-post
certname = puppet.puppet.id
dns_alt_names = master.puppet.id,puppet
[master]
# These are needed when the puppetmaster is run by passenger
# and can safely be removed if webrick is used.
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY

Membuat sertifikat

Setelah kita mengatur puppet, langkah selanjutnya adalah membuat sertifikat SSL untuk puppet, puppet dalam proses nya akan menggunakan sertifikat dalam berkomunikasi dua arah dari master ke client. Untuk membuat sertifikat SSL dapat menggunakan perintah berikut,:

[email protected]:/tmp# rm /var/lib/puppet/ssl/* -rf
[email protected]:/tmp# puppet master --verbose --no-daemonize

Dari perintah tersebut puppet akan membuat SSL, dan tekan tomcol CTRL + C untuk menghentikan proses.

Info: Creating a new SSL key for ca
Info: Creating a new SSL certificate request for ca
Info: Certificate Request fingerprint (SHA256): E2:B6:CB:85:41:BE:57:66:9F:4C:0B:E7:72:BD:B3:7E:7B:DB:9D:BD:84:B1:19:7F:CD:85:C1:58:18:67:BB:AE
Notice: Signed certificate request for ca
Info: Creating a new certificate revocation list
Info: Creating a new SSL key for puppet.puppet.id
Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for puppet.puppet.id
Info: Certificate Request fingerprint (SHA256): EC:8C:D3:62:48:CD:FD:20:4F:48:D0:E0:3C:38:66:4B:BA:0C:D6:23:28:10:33:68:E1:9B:5B:55:E0:0D:66:2B
Notice: puppet.puppet.id has a waiting certificate request
Notice: Signed certificate request for puppet.puppet.id
Notice: Removing file Puppet::SSL::CertificateRequest puppet.puppet.id at '/var/lib/puppet/ssl/ca/requests/puppet.puppet.id.pem'
Notice: Removing file Puppet::SSL::CertificateRequest puppet.puppet.id at '/var/lib/puppet/ssl/certificate_requests/puppet.puppet.id.pem'
Notice: Starting Puppet master version 3.7.2
^CNotice: Caught INT; calling stop

Jika tampilan shell menunjukkan tampilan seperti diatas berarti sertifikat SSL sudah dibuat, silakan pastikan dengan menggunakan perintah dibawah.

[email protected]:/tmp# puppet cert list -all
+ "puppet.puppet.id" (SHA256) 36:68:90:27:2D:9B:17:5B:E1:57:E7:C4:9A:85:9C:1B:0D:40:DE:06:88:FC:68:96:60:F5:C9:00:2E:42:82:55 (alt names: "DNS:master.puppet.id", "DNS:puppet", "DNS:puppet.puppet.id")

Kemudian start daemon puppet dengan mengetikkan

[email protected]:~# service puppetmaster start
 * Starting puppet master                                                [ OK ]
[email protected]:~#

Memasang puppet agent

Kita akan memasang puppet agent di node master dan di client. Untuk node master, kita dapat langsung ke tahap pemasangan puppet-agent.

[email protected]:/tmp# wget http://apt.puppetlabs.com/puppetlabs-release-jessie.deb
[email protected]:/tmp# dpkg -i puppetlabs-release-jessie.deb
[email protected]:/tmp# apt-get update && apt-get install puppet -y

Langkah selanjutnya adalah mengatur puppet agent agar terkoneksi ke puppet master. Silakan ubah berkas pada /etc/puppet/puppet.conf seperti pada tampilan dibawah.

[main]
logdir=/var/log/puppet
vardir=/var/lib/puppet
ssldir=/var/lib/puppet/ssl
rundir=/var/run/puppet
factpath=$vardir/lib/facter
certname=client1.puppet.id

[master]
# These are needed when the puppetmaster is run by passenger
# and can safely be removed if webrick is used.
ssl_client_header = SSL_CLIENT_S_DN
ssl_client_verify_header = SSL_CLIENT_VERIFY

[agent]
server = master.puppet.id

Note: Apabila anda memiliki masalah dalam koneksi ke master, misalnya masalah dns maka untuk mengakalinya alah menambahkan IP master ke /etc/hosts. Dengan ip master adalah 192.168.2.1 maka isian dari /etc/hosts adalah sebagi berikut:

127.0.0.1       localhost client1
192.168.2.1  puppet master puppet.puppet.id master.puppet.id

# The following lines are desirable for IPv6 capable hosts
::1     localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Langkah selanjutnya adalah membuat sertitikat pada client1 dan mendaftarkan sertifikat tersebut ke master. Untuk itu silakan ketik perintah seperti dibawah:

[email protected]:~# puppet agent --test
Info: Creating a new SSL key for client1.puppet.id
Info: Caching certificate for ca
Info: csr_attributes file loading from /etc/puppet/csr_attributes.yaml
Info: Creating a new SSL certificate request for client1.puppet.id
Info: Certificate Request fingerprint (SHA256): 96:C2:9E:DF:AF:C5:CB:E6:73:D3:DC:CC:32:21:66:14:6C:42:EC:D5:EB:52:DD:E5:BC:1B:F7:FD:53:6F:F9:A0
Info: Caching certificate for ca
Exiting; no certificate found and waitforcert is disabled

Selanjutnya, pada sisi node master kita harus melakukan tanda tangan ke sertifikat client1, sebelumnya cek apakah ssl adalah benar yang dimaksud dengan perintah sebagai berikut:

[email protected]:~# puppet cert list
  "client1.puppet.id" (SHA256) 96:C2:9E:DF:AF:C5:CB:E6:73:D3:DC:CC:32:21:66:14:6C:42:EC:D5:EB:52:DD:E5:BC:1B:F7:FD:53:6F:F9:A0

Terlihat bahwa fingerprint dari ssl client1 adalah sama, maka langkah selanjutnya adalah melakukan tanda tangan dengan perintah sebagai berikut:

[email protected]:~# puppet cert sign client1.puppet.id
Notice: Signed certificate request for client1.puppet.id
Notice: Removing file Puppet::SSL::CertificateRequest client1.puppet.id at '/var/lib/puppet/ssl/ca/requests/client1.puppet.id.pem'

Cek kembali pada master, bahwa sertifikat tersebut sudah tertandatangani dengan tanda + di depah client1.puppet.id

+ "client1.puppet.id" (SHA256) 1D:22:8F:AF:74:4A:4A:45:AC:64:58:D3:65:15:00:32:E1:71:28:9C:41:C1:2C:33:06:34:F7:93:8F:14:BC:D3
+ "puppet.puppet.id"  (SHA256) 36:68:90:27:2D:9B:17:5B:E1:57:E7:C4:9A:85:9C:1B:0D:40:DE:06:88:FC:68:96:60:F5:C9:00:2E:42:82:55 (alt names: "DNS:master.puppet.id", "DNS:puppet", "DNS:puppet.puppet.id")

Kembali ke client1, silakan eksekusi puppet kembali untuk menerima sertifikat yang sudah di tanda tangani dengan perintah sebagai berikut:

[email protected]:~# puppet agent --test
Info: Caching certificate for client1.puppet.id
Info: Caching certificate_revocation_list for ca
Info: Caching certificate for client1.puppet.id
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for client1.puppet.id
Info: Applying configuration version '1432997774'
Info: Creating state file /var/lib/puppet/state/state.yaml
Notice: Finished catalog run in 0.02 seconds

Kemudian start daemon puppet agent

[email protected]:~# service puppet restart
 * Restarting puppet agent                                               [ OK ]
[email protected]:~#

Note: Apabila terdapat warning pada console tentang ‘puppet not configured to start’, silakan sunting berkas /etc/default/puppet dan ubah START=no menjadi START=yes Selamat client dan master sudah terkoneksi! Untuk pemasangan puppet agent pada master dapat mengikuti proses diatas.

Testing puppet

Langkah selanjutnya adalah membuat berkas pada semua node untuk memastikan bahwasanya puppet terpasang dengan baik. Kita akan membuat berkas di /home/HELLO dengan konten yang akan kita tentukan, untuk itu silakan buka berkas /etc/puppet/manifests/site.pp kemudian silakan tambahkan isian sebagai berikut:

file { '/home/HELLO':
        ensure => present,
        content => 'Hello this is test file',
}

Kemudian test dari client dan server dengan perintah sebagai berikut:

Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Caching catalog for client1.puppet.id
Info: Applying configuration version '1432998118'
Notice: /Stage[main]/Main/File[/home/HELLO]/ensure: created
Notice: Finished catalog run in 0.05 seconds

Dan pastikan bahwasanya isian dari berkas /home/HELLO adalah ‘Hello this is test file’

[email protected]:~# cat /home/HELLO
Hello this is test file

Penutup

Mudah bukan? pada tulisan selanjutnya akan kita bahas puppet lebih lanjut


March is my last month working for RADNET!

Sudah 3 tahun saya bekerja untuk RADNEt, dan maret merupakan bulan terakhir saya. Awalnya saya berkerja di radnet karena ada info dari (saya lupa) kalau pak Noor butuh orang Network dan atau Sysadmin. Iseng saya langsung kontak saja via email, alhamdulillah saya langsung dipanggil dan diterima.

Bekerja di Surabaya adalah salah satu impian buat saya (why not Djakarta?), apalagi berkerja di ISP. Ternyata di sini saya berkerja mengisi kekosongan karena staff yang sudah senior pindah ke cabang bandung.

And the story begun.. setelah berkerja di radnet sebulan, saya langsung nikah. Well, saya termasuk orang yang telat nikah loh. Dan Setahun kurang sehari dari pernikahan anak saya lahir.

Memang berat meninggalkan RADNET karena di radnet suasana kekeluargaan yang kental dan banyak pelajaran yang saya ambil. Namun bagaimanapun juga saya harus pindah untuk melanjutkan mimpi saya selanjutnya.

Kemana?

Akhirnya saya di terima di Wowrack, masih di Surabaya juga kok. Wowrack merupakan perusahaan yang melayani cloud, vps, hosting dan lain lain, agak berbeda dengan radnet.

Doakan saya sukses yah.


Fork
    me on GitHub