How to Build DevOps Culture from Zero to Hero (Salindia)

IDDevOps-Estu
Foto: Wisnu P.

Berikut adalah materi yang saya bawakan di IDDevOps Meetup 10 Oktober lalu di kantor Home Kredit Indonesia.

Materi yang saya bawakan ini lagi ujicoba. Saya melihat trend DevOps kini, lebih fokus kepada penggunaan tools, service dan hal teknis lainnya. Namun agak terlupa untuk juga mengelola DevOps dari sisi humanity, people, team.

Abstraksi

DevOps Culture merupakan sisi lain yang terjadi pada sisi System Engineer dari penerapan Agile/Scrum di pengembangan software. Sayangnya kultur ini terkadang lupa untuk diimplementasikan dengan baik. Tim hanya fokus penerapan Agile/Scrum pada tim developers. Padahal dengan adanya DevOps Culture, akan bisa makin mempercepat proses release produk secara masif, terstruktur dan sistematis. Di sesi ini saya akan menceritakan beberapa kasus yang pernah saya alami dalam implementasi DevOps Culture. Sehingga sedikit banyak dapat menjadi masukan untuk semua pihak.

Materi salindia dapat diakses di tautan:  https://speakerdeck.com/tuanpembual/buid-devops-culture-from-zero

Estu~

Workshop DevOps Fundamental #1 Jogja

Poster_Devops2.pngHae Jogja.

Saya dan kawan-kawan Qatros akan mengadakan Workshop DevOps Fundamental di Jogja, 20-21 Juli.

Silahkan daftar bagi yang berminat. Slot sangat terbatas.

Workshop ini sangat cocok untuk programmer dan sysadmin yang baru ingin migrasi ke DevOps things.

Tabik.

Bila membutuhkan detail acara, silahkan kontak saya.

Deploy Aplikasi NodeJS di Kubernetes KOPS AWS (Bagian 5)

Sudah install-install, dilanjut mendeploy aplikasi sederhana di K8s. Panduan ini saya sadur dari tautan github ini. Pilih bagian 6 Kops. Pada bagian ini saya berasumsi docker, kubectl, kops sudah terpasang. Cluster k8s sudah dibuat. Dashboard k8s sudah bisa diakses.

image from https://github.com/nathanpeck/nodejs-aws-workshop/tree/master/6%20-%20Kubernetes%20(kops)

Step Ujicoba

Clone Repo

saya membuat garpu dari repo https://github.com/nathanpeck/nodejs-aws-workshop dan menyesuakan sedikit dengan kebutuhan saya.

git clone https://github.com/tuanpembual/nodejs-aws-workshop.git
cd nodejs-aws-workshop/cd 6\ -\ Kubernetes\ \(kops\)

Konsep

Konsepnya adalah ada dua aplikasi nodejs (locations dan characters) yang jalan di port 8081. Kemudian akan dimapping oleh nginx sebagai load balancer. Konfigurasi minimalnya akan seperti ini:

location /api/locations {
  proxy_pass http://locations-service:8081;
}
location /api/characters {
  proxy_pass http://characters-service:8081;
}

Selanjutnya kita akan membangun image dari 2 service tadi (locations dan characters) plus nginx. Kemudian image yang sudah dibangun akan kita unggah ke docker registry (Docker Hub). Selanjutnya kita akan memasang dua aplikasi itu ke cluster k8s. Dilanjutkan dengan mengekpos dua aplikasi itu sehingga bisa diakses publik. Lanjutkan membaca “Deploy Aplikasi NodeJS di Kubernetes KOPS AWS (Bagian 5)”

Memasang Kops dan Membuat Kubernetes Cluster (Bagian 4)

Sudah sampe bagian 4 aja ini. Silahkan membaca bagian satu, dua, tiga dulu.

Di bagian ini saya akan menuliskan urutan pemasangan tools, pembuatan cluster k8s, dan pemasangan dashboard k8s. Di bagian ini belum akan membahas bagaimana menjalankan aplikasi di Kubernetes.

Tahap-tahap instalasi dibawah ini saya ambil dari dokumentasi kops di github:

0. https://github.com/kubernetes/kops/blob/master/docs/aws.md

Pengaturan Environment

Domain=kube.example.com
bucket_name=kube-state-store
KOPS_CLUSTER_NAME=kube.example.com
KOPS_STATE_STORE=s3://${bucket_name}

Menyiapkan Lingkungan Kerja

Perintah dibawah ini dilakukan di lapto/PC yang digunakan untuk memanajemen cluster k8s. Dalam kasus saya adalah Thinkpad x230 dengan OS openSUSE Leap 15.1.

  1. Lakukan installasi AWS CLI. Bisa mengambil dari dokumentasi aws dan lakukan konfigurasi dasar.
  2. Buat IAM khusus kops, bisa mengacu ke panduan diatas
  3. Install kops dan kubectl
curl -LO https://github.com/kubernetes/kops/releases/download/$(curl -s https://api.github.com/repos/kubernetes/kops/releases/latest | grep tag_name | cut -d '"' -f 4)/kops-linux-amd64
chmod +x kops-linux-amd64
sudo mv kops-linux-amd64 /usr/local/bin/kops
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"
chmod +x ./kubectl
sudo mv ./kubectl /usr/local/bin/kubectl
  • Atur router 53.
  • ID=$(uuidgen) && aws route53 create-hosted-zone --name kube.example.com --caller-reference $ID | jq .DelegationSet.NameServers
    
  • Lakukan update dns ke CloudFlare dari hasil output sebelumnya (dalam kasus saya).
  • Atur env
  • export bucket_name=kube-state-store
    export KOPS_CLUSTER_NAME=kube.example.com
    export KOPS_STATE_STORE=s3://${bucket_name}
    
  • Silahkan buat bucket di s3 dengan nama kube-state-store, gunakan webconsole AWS saja.
  • Lanjutkan membaca “Memasang Kops dan Membuat Kubernetes Cluster (Bagian 4)”

    Implementasi Docker, Kubernetes, Kops di Binar Academy (Bagian 3)

    Setelah bagian 1 dan bagian 2. Mari mbahas ke yang lebih serius.

    Kubernetes

    Kubernetes (selanjutnya ditulis k8s) adalah salah satu orchestration untuk docker. Sebelum ke k8s saya sempat menyicip docker swarm dengan dua mesin. Namun proses ini menurut saya kurang pas untuk implementasi di Binar Academy. Kubernetes merupakan tool bersumber terbuka yang awalnya didesain oleh Google dan kemudian dipelihara oleh Cloud Native Computing Foundation.

    Saya pertama belajar menggunakan minikube dengan 2 mesin di Digital Ocean. Tantangan pertama saya gagal paham menggunakan k8s dashboard. Kalo ingat masa itu adalah lucu sekali. Dan masih bingung dengan istilah: pods, deployment. Kemudian juga gagal dalam konfigurasi network menggunakan cinder. Padahal runut mengikuti panduan resmi. Entahlah, mungkin ada langkah yang luput dan sebagainya.

    K8s Cluster

    Ilustrasi dari https://kubernetes.io/docs/tutorials/kubernetes-basics/create-cluster/cluster-intro/

    Minikube

    Silahkan install minikube dan ikuti panduan hello-minikube.

    Tautan berikut juga layak untuk dibaca:

    Setelah membaca tautan diatas diharapkan sedikit paham apa itu k8s, bagaimana cara bekerjanya. Lanjutkan membaca “Implementasi Docker, Kubernetes, Kops di Binar Academy (Bagian 3)”

    Implementasi Docker, Kubernetes, Kops di Binar Academy (Bagian 2)

    Melanjutkan bagian dua. Sillahkan membaca bagian 1 disini. Ini sepertinya jadi tulisan yang makin ngelantur.

    Docker Compose

    Docker Compose adalah tool yang akan membaca sekumpulan konfigurasi untuk dapat menjalankan satu atau lebih container dengan lebih mudah. Dalam konfigurasinya juga meliputi proses docker build dan docker run. Pada opsi build, compose akan menjalankan build dengan memanggil file Dockefile yang tersedia. Untuk opsi alamat image, compose akan mengunduh docker images sesuai alamat yang disediakan. Bisa dari docker hub atau juga dari private registry yang membutuhkan krendensial.

    Install compose:

    Docker compose membutuhkan beberapa pustaka python untuk menjalankannya. Untuk memasang di openSUSE Leap 15.1 cukup menjalankan ini di konsole

    sudo zypper in docker-compose

    Untuk menjalankan docker-compose, dibuatlah sebuah file dengan format yml standar dengan nama file docker-compose.yml. Didalamnya berisi konfigurasi manual.

    Contoh konfigurasi bisa melihat contoh berikut

    tree
    .
    ├── docker-compose.yml
    ├── Dockerfile
    └── index.html
    0 directories, 3 files
    

    Isi docker-compose adalah sebagai berikut:

    version: '3'
    services:
    ## Using image from docker hub
      hello:
        image: tuanpembual/hello
        hostname: hello
        container_name: hello
        ports:
          - "80:8080"
    ## Using image from local
      hellov2:
        build: .
        hostname: hellov2
        container_name: hellov2
        ports:
          - "80:8081"
    

    Menjalankan Compose

    docker-compose up
    

    Perintah diatas dapat dijalankan jika file konfigurasi menggunakan nama standar semisal docker-compose.yml. Namun jika nama file berbeda, butuh mengatur path file seperti berikut:

    docker-compose -f p-website-docker-compose.yml
    

    Opsi docker-compose

    docker-compose start
    docker-compose up
    docker-compose ps -a
    docker-compose stop
    docker-compose down
    

    Ada banyak model penggunaan docker-compose. Model yang saya tulis adalah perintah yg saya gunakan sehar-hari.

    Docker Swarm

    Swarm adalah tool yang dapat membantu manajemen docker pada multiple host. Bahasa lainnya adalah orkestrasi (orchestration). Swarm sendiri merupakan tools native dari Docker. Tentang swarm sendiri dapat ditemukan di wiki docker dan swarm.

    Saya sempat beberapa minggu ngulik swarm, mencoba membuat cluster sederhana. Mencoba untuk mengimplementasikan di AWS, namun setelah mencoba beberapa kali, solusi ini belum mampu menjawab kebutuhan tim di Binar Academy.

    Bahan riset selanjutnya adalah bagian tiga, mencoba kubernetes atau k8s.
    Estu~

    Implementasi Docker, Kubernetes, Kops di Binar Academy (Bagian 1)

    Awal Cerita

    Kali ini saya akan cerita (iya cerita, bukan tutorial). Bagaimana saya kenalan dengan docker, apa saja yg saya lakukan, dan bagaimana saya meracuni lingkungan pengembangan melalui docker. Saya sendiri masih merasa kesulitan untuk mengajarkan docker kepada orang lain. Bingung harus memulai dari mana.

    Proses belajar docker ini menghantarkan saya dalam proses yang cukup lama. Saya kembali lagi mendalami docker Maret 2018. Dalam kurun waktu 6 bulan terakhir ini merupakan proses yang cukup intens. Peluh dan spaneng yang dikeluarkan menjadi catatan berarti buat saya. Mulai dari membeli buku (beberapa judul yang akhirnya selesai saya baca), course online yang belum jadi saya mulai, membaca dokumentasi satu ke dokumentasi lainnya. Hingga menjadi bunga tidur dalam minggu-minggu penuh tekanan. Namun proses tidak pernah mengkhianati hasil.

    Daftar Buku

    Saya kebetulan melihat share facebook dari pak Utian Ayuba, promo beli 15 buku 25USD Mei 2018 silam. Humble Book Bundle Dev Ops by Packt. Ya sudah saya beli. Kata kunci yang saya cari adalah: docker, swarm, kubernetes. Berikut daftar buku ditulis berdasarkan saran urutan membaca:

    • Docker Cookbook By Neependra Khare, June 2015
    • Mastering Docker By Scott Gallagher, December 2015
    • Continuous Delivery with Docker and Jenkins By RafaÅ‚ Leszko August 2017
    • Deployment with Docker By Srdjan Grubor, November 2017
    • Kubernetes Cookbook By Hideto Saito, Hui-Chuan Chloe Lee, Ke-Jou Carol Hsu, June 2016
    • Mastering Kubernetes By Gigi Sayfan, May 2017
    • Getting Started with Kubernetes – Second Edition By Jonathan Baier, May 2017
    • DevOps with Kubernetes By Hideto Saito, Hui-Chuan Chloe Lee, Cheng-Yang Wu, October 2017

    Kemudian satu buku tambahan atas rekomendasi mas Agung Setiyawan

    • Docker for Rails Developers by Rob Isenberg, September 2018

    Dan buku terakhir yang belum selesai saya baca,

    • Kubernetes on AWS by Ed Robinson, November 2018

    Lanjutkan membaca “Implementasi Docker, Kubernetes, Kops di Binar Academy (Bagian 1)”

    DevOps; Jenkins, Pengantar Lain

    logo-jenkins*Tulisan dibawah ini banyak nggamblehnya.

    Di era-era menuju implementasi DevOps, Jenkins bukanlah barang baru. Dan tidak diragukan lagi, Jenkins merupakan salah satu tools wajib dalam menunjang proses pengembangan perangkat lunak secara keseluruhan (Continuous Integration) dan memberdayakan tim untuk melaksanakan bagian teknis dari pengiriman berkelanjutan( Continuous Delivery).

    Dalam pekerjaannya, praktisi DevOps diharuskan mampu mengubah infrastuktur, konfigurasi dan alat-alat yang menunjang proses DevOps menjadi sebuah kode. Beberapa menyebutnya “Infrastructure as Code (IaC)”. Tujuannya adalah pengurangan biaya(Cost reduction), kecepatan eksukusi (Speed- Faster execution) dan pengurangan resiko( (Risk – remove errors and security violations).

    Ada banyak cara untuk melakukannya. Provisioning merupakan salah satunya. Toolsnya juga macam-macam. Saya terbiasa menggunakan shell scripting, chef dan ansible. Sudah itu aja pengantarnya. Abis ini saya ndongeng membuat jobs di Jenkins.

    Sebenarnya membuat jobs di Jenkins itu ndak susah-susah amat. Namun kebiasaannya, membuat jobs cukup dengan klik klik terus jadi. Ya jadi. Tapi bagaimana dengan prinsip  IaC diatas? Ya mbuh. Nek jenkinsnya modar, trs? Ya wasalam.

    Sebenarnya jobs dan konfigurasi di Jenkins bisa saja langsung disimpan, tapi formatnya adalah xml. Sedikit nganu.

    Salah satu solusinya adalah dengan menulis Jenkins Jobs dalam format *.groovy. Kumpulan *.groovy ini dikumpulkan dalam lumbung, yang akan diperbaharui otomatis. Adalah job-dsl yang bertugas mengubah format groovy menjadi jobs yang disimpan dalam bentuk xml.

    Kita mulai dari mana?

    1. Salin repo
      $ git clone https://github.com/tuanpembual/jenkins-jobs.git
      
    2. Install Jenkins. Cara paling mudah adalah menggunakan Vagrant. Vagrantfilenya bisa dicomot dari repo saya. Dalam Vagrantfile sudah ada box yg bisa dipilih. Saya menggunakan ubuntu 16.04. Kemudian jalankan instalasi jenkins via shell provisioning. Oh iya, sekalian direktori share foldernya dicek; sesuaikan dengan kondisi anda.
    3. Install plugin jobs-dsl (ini plugin awal kita bekerja). Dan install jg beberapa plugin lain yang dibutuhkan. Berikut beberapa plugin yang saya rasa perlu:
      • git
      • greenballs
      • build-pipeline-plugin
      • job-dsl
      • cloudbees-folder
      • swarm
      • slack
      • envinject
      • gradle
      • view-job-filters
      • postbuildscript
      • email-ext
      • plot
      • aws sdk
      • s3 plugin
    4. Konfigurasi root jenkins. Bagian yang perlu diperhatikan adalah bagian root:
      <workspaceDir>${ITEM_ROOTDIR}/workspace</workspaceDir>
      <buildsDir>${ITEM_ROOTDIR}/builds</buildsDir>
      
    5. Buat jobs untuk menampung seed jobs. Isian untuk seed jobs kira-kira begini: (atau bisa nyomot file xml di repo tadi)
      Project Name: seed-jobs
      SCM: none
      Build Trigger: none
      Build: Process Jobs DSLs

      • DSL Script: jobs/*.groovy
      • Action for removed jobs: Disable
      • Action for removed views: Ignore
    6. Buat folder jobs di repo. Dengan vim, buatlah file baru semisal BelajarJenkins.groovy. Isinya kira-kira begini:
      ## jobs/BelajarJenkins.groovy
      String app = "BelajarJenkins"
      folder("${app}") {
        description "ini adalah description"
      }
      job("${app}/BuildGradle") {
        description "Coba build gradle"
        logRotator {
          daysToKeep(7)
          numToKeep(10)
        }
        triggers {
          scm('H/2 * * * *')
        }
        steps {
          gradle {
            tasks('clean test')
          }
        }
        publishers {
          mailer('mail@example.com', false, true)
        }
      }
      
    7. Lakukan perintah buid di seed jobs di Jenkins dengan menekan tombol build now. *semoga g ada error 😀
    8. Tadaaaa. Jobs pertama sudah jadi. Silahkan buat file *.groovy lainnya untuk membuat jobs lainnya ya.

    Jika akan digunakan untuk proses produksi, silahkan aktifkan scm menuju repo jenkins-jobs anda. Kemudian trigger scm dalam format cron (* * * * *). Artinya seed-jobs akan dibuild setiap menit jika terdapat perubahan pada repo. Efeknya adalah segala perubahan manual pada jenkins jobs lainnya akan ditimpa selalu. Dan untuk melakukan perubahan diharuskan mengubah langsung pada file *.groovy dan ajukan pull request ke repo.

    Sudah, itu saja. Berikut beberapa bacaan lain terkait jobs-dsl. Setelah ini saya akan menulis beberapa potongan kode yang biasa saya gunakan dalam membuat jobs.

    Bacaan:
    [0]. Getting Started:  https://github.com/jenkinsci/job-dsl-plugin/wiki/Tutorial—Using-the-Jenkins-Job-DSL
    [1]. API Viewer: https://jenkinsci.github.io/job-dsl-plugin/

    Selamat mencoba.

    Estu~

    Chef; Membuat Cookbook Sederhana dan Ujicoba Cookbook dengan Test-Kitchen

    Chef Software Inc. company logo

    Melanjutkan tulisan sebelumnya.
    Prasyarat tool dan kawan-kawannya yang digunakan:

    1. ChefDK dan Ruby
    2. Text Editor
    3. Vagrant
    4. Internet kenceng
    5. Test-Kitchen

    Kali ini rencananya mau bikin cookbook nginx untuk lingkungan deb (debian, ubuntu, etc). Mari dimulai membuat cookbook dan ujicoba di lokal:

    1. Buat lingkungan kerja
      $ mkdir -p ~/chef-repo/cookbook && cd ~/chef-repo
    2. Generate cookbook kosong dengan perintah chef
      $ chef generate cookbook cookbooks/nginx
    3. Edit resep, tambahkan perintah untuk memasang paket nginx dan dependensinya
      $ vim cookbooks/nginx/recipes/default.rb
      #
      # Cookbook Name:: nginx
      # Recipe:: default
      #
      # Copyright (c) 2016 The Authors, All Rights Reserved.
      
      include_recipe "apt"
      
      # memasang nginx
      package 'nginx' do
        action :install
      end
      
      service 'nginx' do
        action [:enable, :start]
      end
      
      # mengubah conten index.html dgn isi lain
      template "/usr/share/nginx/html/index.html" do
      	source "nginx.erb"
      	mode "0644"
      end
      $ vim cookbooks/nginx/metadata.rb
      
      name 'nginx'
      maintainer 'The Authors'
      maintainer_email 'you@example.com'
      license 'all_rights'
      description 'Installs/Configures nginx'
      long_description 'Installs/Configures nginx'
      version '0.1.0'
      
      depends 'apt'
    4. Generate template halaman index.html
      $ chef generate template cookbooks/nginx nginx
      $ vim cookbooks/nginx/templates/default/nginx.erb
      nginx.erb
    5. Mari kita uji resepnya lewat kitchen
      $ cd cookbooks/nginx
      $ vim .kitchen.yml
      ---
      driver:
        name: vagrant
      
      provisioner:
        name: chef_zero
      
      platforms:
        - name: ubuntu/trusty64
      
      suites:
        - name: default
          run_list:
            - recipe[nginx::default]
          attributes:
      $ kitchen create
      $ kitchen converge
    6. Tambahkan unit testing dengan bantuan serverspec
      $ vim cookbooks/nginx/test/integration/default/serverspec/default_spec.rb
      require 'spec_helper'
      
      # Serverspec examples can be found at
      # http://serverspec.org/resource_types.html
      
      nginx_port = 80
      
      describe 'nginx' do
      
        describe package('nginx') do
        	it { should be_installed}
        end
      
        describe service('nginx') do
        	it { should be_running}
        end
      
        describe service('nginx') do
        	it { should be_enabled}
        end
      
        describe port(nginx_port) do
          it { should be_listening}
        end
      end
      
    7. Lakukan testing-kitchen
      $ kitchen verify
    8. Proses ini akan memakan waktu lama, tergantung internet. Jika tanpa error maka cookbook sudah benar. Selamat!
      Login ke mesin dan lakukan curl

      $ kitchen login
      $ curl localhost
    9. Hancurkan instansce kitchen setiap selesai testing.
      $ kitchen destroy

    Sekian, tulisan selanjutnya akan membahas knife bootstrap.

    *kode sumber cookbook ini dapat dilihat di akun github saya.

    Bacaan:

    [0] https://learn.chef.io/learn-the-basics/rhel/configure-a-package-and-service/
    [1] https://learn.chef.io/local-development/ubuntu/get-started-with-test-kitchen/
    [2] https://www.digitalocean.com/community/tutorials/how-to-create-simple-chef-cookbooks-to-manage-infrastructure-on-ubuntu

    Estu, yang lagi sibuk di dapur

    Chef; Sebuah Pengenalan

    Chef Software Inc. company logo
    Chef Software Inc. – Logo

    Chef adalah salah satu tools yang digunakan untuk otomatisasi oleh DevOps. Dalam penggunaannya, Chef ditulis dengan bahasa ruby. Terus, bagaimanakah gambaran chef bekerja?

    workstation-server-node

    Istilah-istilah umum:

    • Cookbook; Buku Resep, adalah sekumpulan perintah untuk memasang dan mengkonfigurasi sistem. Misal nginx cookbook, adalah resep untuk memasang nginx, dan lain-lain.
    • Workstation; Komputer yang kita gunakan untuk bekerja, bisa laptop maupun desktop dengan sistem operasi Linux/Mac OS/Windows.
    • Chef Server; adalah pusat lumbung yang menyimpan kumpulan cookbook (buku resep) dan informasi setiap node. Semisal chef server menyimpan data fqdn node dan sistem operasi yang terpasang.
    • Node; adalah komputer (server) yang dikelola oleh Chef Server. Setiap node telah terpasang chef-client. Node lah tempat kita menerapkan cookbook. Node bisa berbentuk fisik maupun mesin virtual.

    Begitulah kira-kira.. Langkah selanjutnya adalah memasang Chef Development Kit (ChefDK) sebelum memulai menulis resep; ditulisan selanjutnya.

    Bagi yang masih penasaran tentang Chef dan DevOps gabung aja di DevOps Meetup #1 Jogja, 4 Juni 2016.

    Dan dibawan ini daftar isi tulisan saya tentang Chef:

    1. Chef; Konfigurasi Workstation; Memasang Chef Development Kit (ChefDK)
    2. Chef; Membuat Cookbook Sederhana dan Ujicoba Cookbook dengan Test-Kitchen
    3. Chef; Mengenal Supermarket; Repository Cookbook ala Chef
    4. Chef; Mengatur Chef-Server
    5. Chef; Bootstrap Node Menggunakan Vagrant

    Estu, yang lagi masak-masak.