Ví dụ như video này đây youtube.com/Literate Devops with Emacs

Hiểu đơn giản là giờ chúng ta cần everything as code, cần reproducible, tăng khả năng stateless (hãy như Guix)

Sử dụng org-babel

Với org-babel#literate-programming thì các đoạn code sẽ được viết trong cặp #+BEGIN_SRC NGÔN-NGỮ-THỰC-THI#+END_SRC với các option như thực thi ở thư mục nào :dir,…

Các ví dụ:

Cài cắm các tool

* Build PC
** Setup emacs
#+BEGIN_SRC compile
sudo apt-get update
sudo apt-get install -y emacs-nox
# Setup dotfiles
curl https://txgvnn.github.io/sh/dots | bash
#+END_SRC

** Setup minikube
#+BEGIN_SRC compile
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
sudo install minikube-linux-amd64 /usr/local/bin/minikube
#+END_SRC

#+RESULTS:

#+BEGIN_SRC sh
minikube config set driver kvm2
minikube config set kubernetes-version v1.20.15
#+END_SRC

Để backup các file secret, config các kiểu

#+NAME: gitlab-token
#+BEGIN_SRC sh :results output
cat ~/projects/infra-deployment/gitlab/terraform.tfvars
#+END_SRC

#+NAME: gitlab-token-output
#+RESULTS: gitlab-token
: gitlab_token="XYZ-token"

Cần restore lại thì như sau

#+BEGIN_SRC sh :var INPUT=gitlab-token-output
cat > ~/projects/infra-deployment/gitlab/terraform.tfvars << EOF
$INPUT
EOF
#+END_SRC

#+RESULTS:

org-mode sẽ lấy biến INPUT bằng giá trị của name gitlab-token-output trên kia.

Đối với các file org chứ thông tin nhạy cảm chúng ta nên dùng file là org.gpg để được encrypt bằng gpg

Setup được trên các máy remote thông qua TRAMP như ssh

#+BEGIN_SRC sh :dir /ssh:root@the-sun:/
apt-get install -y nginx
#+END_SRC

Hoặc đơn giản là viết README cho dự án mà mình cũng chạy được luôn

Chúng ta có thể export README.org -> README.md

* Build docker image
#+BEGIN_SRC sh
make build-image
#+END_SRC

* Chạy thử với docker-compose
#+BEGIN_SRC compile
docker-compose up
#+END_SRC

Sử dụng eev package

(use-package eev
  :ensure t :defer 1
  :config (require 'eev-load)
  (global-set-key (kbd "<f8>") #'eepitch-this-line)
  (global-set-key (kbd "C-<f8>") #'eewrap-eepitch))

Một số bài toán phức tạp hơn thì ta cần dùng eev. Cụ thể eev có tính năng như kmacro vậy. Ví dụ chúng ta cần mở terminal ssh qua vm1 rồi lại ssh qua vm2 rồi ssh vm3. eev là giải pháp.

Khi dùng eev chạy (eepitch-shell) nó sẽ bật thêm 1 buffer shell. Và cứ nhấn f8 để nó copy từng dòng ở bên code sang bên shell. Nó hỗ trợ rất nhiều loại để mình tương tác như eepitch-ansiterm, eepitch-python,…

Ví dụ như mình cần resize disk cho 1 con VM quản lý bằng virsh ở server the-sun như sau:


* Resize disk to 40G
  #+begin_src sh :eval no
  # (eepitch-shell)
  # (eepitch-kill)
  # (eepitch-shell)
  ssh root@the-sun

  virsh start base

  cat > /tmp/disk.yaml << EOF
  <disk type='file' device='disk'>
    <driver name='qemu' type='qcow2'/>
    <source file='/var/lib/libvirt/images/disk-can-resize.img'/>
    <target dev='vdb' bus='virtio'/>
  </disk>
  EOF

  virsh attach-device base /tmp/disk.yaml

  virsh console base # Đoạn này sẽ phải nhảy sang shell để nhập pass

  lsblk
  parted /dev/vdb
  resizepart 1 40GB
  quit

  e2fsck -f /dev/vdb1
  resize2fs -p /dev/vdb1

  ^] # Đoạn này để thoát virsh console

  virsh shutdown base

  virsh list --all
  #+end_src

eev thì thật cực kỳ linh động, có thể gọi là log as code hay code as log cũng được đấy nhỉ.