mysqldump/pgdump 連線密碼的存放

寫資料庫備份腳本時,會避免把密碼放在腳本裡,免得密碼流出去。

這時候密碼要藏在那邊呢?

postgresql

postgresql 的 pg_dump 預設會去讀取 $HOME/.pgpass 檔案,所以可以把帳號跟密碼放在這邊,腳本裡使用 pg_dump 進行備份時就不需要額外用參數指定。

.pgpass 檔案的內容是

hostname:port:database:username:password
  • hostname: 資料庫主機
  • port: 資料庫主機的 port
  • database: 資料庫
  • username: 連線的使用者帳號
  • password: 連線的使用者密碼

使用的時候,就不需要指定密碼了

pg_dump -h <db_host> -U <db_user> -F c -f $dump_file <db_name>

mysql

一般備份 mysql 資料庫會使用 mysqldump,mysqldump 有個參數 --defaults-file=<config_file>

所以可以用這個參數來指定,先在 $HOME/.config 資料夾下新增 backup.my.cnf 檔案,內容如下

[mysqldump]
user=<db_user>
password=<db_pass>
  • <db_user>: 放連線的使用者帳號
  • <db_pass>: 放連線的使用者密碼

至於主機的部份,可以用 mysqldump 參數指定,例如

mysqldump --defaults-file=$HOME/.config/backup.my.cnf -h <db_host> <db_name>

參考資料

vim錄按鍵順序

這用 Google 查好幾次了,決定記錄一下。

在使用 vim 編輯時,難免會遇到重複性很高的工作,vim 有個功能,就是可以錄製按鍵順序。錄製完成以後,可以再次播放剛剛錄製的按鍵順序,這樣就可以省下很多苦工。

要開始錄製,先確定在 normal mode 下,按下 q ,接著按下 a ,這個 a 是 register 的意思,簡單的說,是個代號,表示把按鍵順序放到 a 這個 register 裡。如果你要錄製其他按鍵順序,可以用 b, c, d, e … 以此類推。

接下來,就是要按下你要記錄的按鍵順序,例如移到行首,換掉第一個字元等等的。

等到順序都錄製完了,回到 normal mode ,按下 q 停止錄製。

之後要播放按鍵順序時,就是按下 @ ,然後按下 a ,這就表示要播放 a register 裡的按鍵順序。要重複播放上一次的按鍵順序,用 @@ ;要重複播放 20 次,就用 20@

參考資料

tcpdump小記

以前蠻排斥用 tcpdump 的,因為終端機模式下不容易去看,所以我都是寫到檔案以後,再傳出來用 wireshark 去看。

寫到檔案去,就是用 -w 參數指定要寫入的檔案。下面這行就是監聽 eth0 上的 port 80 封包,然後寫到 /tmp/capture.pcap 檔案。

tcpdump -i eth0 -w /tmp/capture.pcap port 80

昨天查文件學到另外一招,可以在終端機模式下看的方式,用 -X 參數印出 16 進位內容,用 -v 表示要看詳細的內容,越多 v 就越詳細。

tcpdump -i eth0 -vvX

參考資料

microk8s+okd web console

看到這篇:Running the OpenShift console in plain Kubernetes

剛好手頭上有 microk8s ,就裝來試試看。

環境

使用 Ubuntu 22.04

步驟

先安裝 nodejs 16,注意,17 以後的版本因為用了 OpenSSL3 ,所以編譯過程會有錯誤。

curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash -
sudo apt-get install -y nodejs

取得 web console 原始碼

git clone https://github.com/openshift/console.git

進入 console 資料夾,進行編譯

./build.sh

再來是啟動

先檢查 default 這個 service account 有沒有 token,這個 service account 是在 kube-system 這個 namespace 裡。

kubectl get serviceaccount default --namespace=kube-system -o jsonpath='{.secrets[0].name}'

如果沒有,就建立 token

kubectl create token default -n kube-system

複製輸出結果,然後建立 secret

kubectl create secret generic default-token-0621 --from-literal=token=<前面的輸出結果>

好了以後,編輯 service account

kubectl edit secret default-token-0621 -n kube-system

在 yaml 裡加入 secrets

apiVersion: v1
kind: ServiceAccount
metadata:
  name: default
  namespace: kube-system
secrets:
- name: default-token-0621

給權限

kubectl create clusterrolebinding default-cluster-admin --clusterrole=cluster-admin --serviceaccount=kube-system:default

最後要啟動了,因為我是用 microk8s ,先取得 kubeconfig

microk8s config > ~/.kube/config
export KUBECONFIG=~/.kube/config
source ./contrib/environment.sh
./bin/bridge

預設會啟動在 :9000

在Windows 2019 安裝 OpenSSH server

資料來源:微軟-安裝 OpenSSH

我找不到 GUI 怎麼裝,最後是開 PowerShell 終端機來安裝

檢查是否有安裝

Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'

安裝

預設就會安裝 OpenSSH client 了,執行這兩行會需要一點時間,我有遇到錯誤訊息,說安裝失敗,但再執行一次就可以了。

# Install the OpenSSH Client
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0

# Install the OpenSSH Server
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0

啟動、設定與開防火牆

用 Start-Service 就可以啟動,用 Set-Service 設定為自動啟動,後面落落長的 if 是檢查,這段檢查,可以開設定裡的防火牆來看,不用執行也可以。

# Start the sshd service
Start-Service sshd

# OPTIONAL but recommended:
Set-Service -Name sshd -StartupType 'Automatic'

# Confirm the Firewall rule is configured. It should be created automatically by setup. Run the following to verify
if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) {
    Write-Output "Firewall Rule 'OpenSSH-Server-In-TCP' does not exist, creating it..."
    New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
} else {
    Write-Output "Firewall rule 'OpenSSH-Server-In-TCP' has been created and exists."
}

ssh 與 scp

若要連進來,用 ssh 即可,這邊要注意,當 ssh 進去以後,打的指令不是 linux 指令喔,是 windows 指令。

ssh <user>@<windows-2019>

因為 Windows 路徑跟 Linux 不一樣,所以不能用之前 linux 的方式來複製,得這樣用

scp my_file "john@<windows-2019>:C:\\Users\\John\\"

結語

有了 OpenSSH server ,要遠端管理或複製檔案變得方便許多,以後安裝完 Windows 要順手裝上。

參考資料

podman如何使用registry mirror

之前弄好 registry mirror,因為是用 docker,所以需要調整的設定檔是 /etc/docker/daemon.json

那在 podman 裡,該怎麼設定呢?

這部份可以參考 /etc/containers/registries.conf 裡面的說明,然後在 /etc/containers/registries.conf.d 資料夾裏面加上新的設定檔就可以。

例如可以在 /etc/containers/registries.conf.d/my-mirror.conf 加入以下內容

[[registry]]
location = "docker.io"

[[registry.mirror]]
location = "192.168.11.2:6000"
insecure = true

依照行號說明如下:

  1. [[registry]] 必須要加
  2. location = "docker.io" 是表示,遇到 docker.io 時,就要參考這裡的設定。
  3. [[registry.mirror]] 這是表示下面要寫 registry mirror 設定了。
  4. location = "192.168.11.2:6000" 是表示 registry mirror 的位置。
  5. insecure = true 是表示不要檢查這座 registry mirror 的 SSL 憑證。

設定完以後,在 podman pull docker.io/<image> 的時候,實際就會到 registry mirror 拉取 容器映像 ,由 registry mirror 再去決定是否到外面的 docker.io 拉取容器映像。

參考資料

Compiler Explorer

在某個推文上看到的網站 – Compiler Explorer https://godbolt.org/,但我忘了來源。

網站打開以後,左邊貼程式碼,右邊會即時顯示出編譯後的低階語言,支援蠻多語言的。這對想搞清楚底層怎麼處理的開發者來說很方便,可以透過這個網站即時的看到結果,進而調校程式碼。

dnsdiag

想查詢用哪個 DNS 伺服器比較快,之前是查到用 namebench,但這專案沒在維護了,自行編譯使用,又遇到些問題,乾脆就放棄。

後來有看到 diadiag 這個套件,就想說來用看看。

在 Ubuntu 裡,用 apt 就可以安裝。

sudo apt install dnsdiag

dnsdiag 套件裏面有3個工具

  • dnsping
  • dnstraceroute
  • dnseval

dnsping 是測試連到 DNS 伺服器的時間。

dnstraceroute 是列出到 DNS 伺服器的路由,透過這個可以看 DNS 查詢到底有沒有繞路。

dnseval 是本文重點,也就是可以針對各個 DNS 伺服器去做評估,看哪個比較快。

首先要新增一個文字檔,命名為 public-dns-servers.txt,裏面放 DNS 伺服器的 IP。

1.1.1.1
8.8.8.8
168.95.1.1
94.140.14.14
61.31.1.1

然後執行

dnseval -f public-dns-servers.txt www.facebook.com

就可以看到結果了。

server           avg(ms)     min(ms)     max(ms)     stddev(ms)  lost(%)  ttl        flags                  response
--------------------------------------------------------------------------------------------------------------------
1.1.1.1          9.471       9.167       9.659       0.219       %20      3599       QR -- -- RD RA -- --   NOERROR             
8.8.8.8          10.621      8.588       13.036      1.961       %12      1002       QR -- -- RD RA -- --   NOERROR             
168.95.1.1       9.119       9.119       9.119       0.000       %50      2648       QR -- -- RD RA -- --   NOERROR             
94.140.14.14     0.000       0.000       0.000       0.000       %100     N/A        -- -- -- -- -- -- --   No Response         
61.31.1.1        8.215       8.132       8.298       0.118       %33      1366       QR -- -- RD RA -- --   NOERROR             

好了,有了這工具,就可以找出最適合的 DNS 伺服器了。

在MacOS使用其他版本的java

在 Linux 裡要切換 java,可以使用 update-alternative --config java

在 MacOS 裡,要用 /usr/libexec/java_home

MacOS 本身就有帶一包 java ,是 OpenJDK,所以在要切換之前,得先說一下,怎麼安裝其他版本的 java 。要安裝其他版本的 java,用 homebrew 的話,是很簡單的。

要安裝 oracle-jdk,就用

brew search oracle-jdk

要安裝 adoptopenjdk,就用

brew tap adoptopenjdk/openjdk
brew install adoptopenjdk8

要知道裝了哪些 jdk,可以用

/usr/libexec/java_home -V

這行指令會列出所有安裝的 Java ,從這邊可以取得版本號碼跟名稱。

知道版本以後,要使用指定版本的 Java ,可以用切換 PATH 的方式來處理

export JAVA_HOME=$(/usr/lib_exec/java_home -v <your_java_version>)
export PATH=${JAVA_HOME}/bin:${PATH}

參考資料

Registry Mirror

最近在建置 container image 時,常會踩到 exceeded 的錯誤,這是因為 docker 在 2020 時,公告了新的收費機制,並為拉取 container image 的 API 加上了限制,沒有登入的使用者現在每6個小時只能有 100 個 pull requests可用;有登入且採用免費方案的使用者,每6個小時有 200 個 pull requests 可用。這在初期測試 pipeline 時,根本很容易就用超過。

上網搜尋看有沒有方法可以避過這限制,後來在 gitlab 網站上找到文章:Caching Docker images to reduce the number of calls to DockerHub from your CI/CD infrastructure | GitLab

文章裡有提到兩個方法,第一個簡單的方法就是登入,這樣可以提升到 200 個 pull requests。

因為大部分的 executor 都是使用 docker 或 docker + machine,所以設定方法可以單純的在 pipeline 裏面作 docker login,但這樣還要多塞指令跟 credential 。gitlab 很貼心的提供了一個內建的變數,要用這個變數,需要在 gitlab 專案的 settings > CI/CD > Variables 裡,去增加 DOCKER_AUTH_CONFIG ,那在執行 pipeline 時,gitlab-runner 看到有這個變數,就會自動做 login 的動作。

DOCKER_AUTH_CONFIG 的內容可以透過以下方式取得:

  1. 在終端機用指令先登入 index.docker.io: docker login
  2. 用 docker 指令登入後,在家目錄的 .docker 目錄下就會出現 config.json : cat ~/.docker/config.json
  3. 用 jq 指令讓內容變成一行: jq -c "." ~/.docker/config.json

輸出的結果,就可以拿來填了。

第二個方法,則是建置 Registry mirror。

找一台已經安裝 docker 的主機,然後使用 docker 啟動 registry container。在啟動的時候帶入環境參數 REGISTRY_PROXY_REMOTEURL

docker run -d -p 6000:5000 \
    -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \
    --restart always \
    --name registry registry:2

然後登入到 gitlab-runner 所在的主機,修改 /etc/docker/daemon.json ,內容如下

{
  "registry-mirrors": ["http://<your-registry-mirror-server:6000"]
}

修改完以後,讓 dockerd 重新載入設定:

sudo systemctl reload docker

再用 docker info | grep -A 1 -B 1 Mirror 確認。

這樣就設定完成了。

那要怎麼知道 gitlab-runner 在建置時有使用這個 registry mirror 呢?這時可以用 curl 指令來檢查

watch -n 60 curl -s http://<your-registry-server>:6000/v2/_catalog

輸出結果大致會是這樣

{"repositories":["library/docker","library/python"]}

至此,就可以算是解決了 exceeded 的問題啦。