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
và #+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ỉ.