git repository搬家

若有需要將整個 repository 從 A 搬到 B ,單純的 git clone 跟 git push 是不夠的,因為還有 branches, tags 等等的。

所以得這樣作。

首先在目的端,例如 github/gitlab ,建立一個空的 repository。

接著要處理來源端的 repository,在 clone 時加上 --mirror

git clone --mirror git@example.com:repo1.git

git clone 完成會有一個 repo1 的資料夾,進入 repo1 的資料夾,執行以下指令把所有 branches, tags 資訊都拉取回來,然後加入新的遠端,並進行推送

git fetch --all
git remote add target git@<新的repository>
git push target --mirror

這樣就大功告成了。

參考資料

BIND+DNS over HTTPs

說明一下為什麼會要這樣作。

因為環境關係,DNS protocol 出不去,只有 A 主機可以透過 HTTP 出去。

因此方案如下:

  1. A 電腦安裝 squid,其他主機可將 HTTP proxy 設定為 A 主機,這樣 HTTP 請求就可透過 A 主機出去。
  2. 環境內原有 B 主機已經安裝 BIND,此主機就安裝 cloudflare 提供的 cloudflared ,使用 DNS over HTTPs 方式,讓 DNS 查詢可以用 HTTP 請求,透過 A 主機去查詢。

安裝與設定

cloudflared 蠻好安裝的,就一個執行檔,下載以後,改個權限就可以執行了 (安裝方式)

那如果要用 systemd 來啟動,也很容易,安裝方式裡就有提供範例:

[Unit]
Description=DNS over HTTPS (DoH) proxy client
Wants=network-online.target nss-lookup.target
Before=nss-lookup.target

[Service]
Environment=http_proxy=http://<proxy>:3128
Environment=https_proxy=http://<proxy>:3128
AmbientCapabilities=CAP_NET_BIND_SERVICE
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
DynamicUser=yes
ExecStart=/usr/local/bin/cloudflared proxy-dns --port 5533

[Install]
WantedBy=multi-user.target

設定好,用 firewall-cmd 設定好防火牆 (TCP 5533) 以後,就可以去調整 BIND 的設定 /etc/named.conf

修改既有的 forwarder 設定

forwarders { 127.0.0.1 port 5533; };

重新啟動 named 以後,就可以試試看了。

流程大致如下

--[DNS查詢]--> B 主機(53/UDP) ----> B 主機(5533/TCP) --[HTTP]--> A 主機(3128/TCP) --> 外部

參考資料

Kubernetes刪除資源卡在Terminating

資料來源:

整理一下,若遇到刪除不了,一定是有原因。以 Namespace 來說,通常是有些資源刪除不掉,這時候要花點耐心去找。

若不想等,就是加上 --grace-period=0 --force ,強制來做。

Pod 也是類似的作法。

若還是不行,可以把 finalizer 清掉,以下是 pod 的例子,但 namespace 也可以用。

kubectl patch pod <pod>-p '{"metadata":{"finalizers":null}}'

最後一招,終極的作法,是直接存取 etcd ,這個會看是用哪個容器平台而有不同的作法。像 OpenShift ,etcd 是以 pod 形式存在,所以需要進到 etcd 的 pod 裡,用 etcdctl 去查詢跟刪除。

雖然通常都是建議不要,但難免會遇到這種情況,就參考看看。

找昨天到現在有更動的檔案

需求是要找到從昨天到現在有變更的檔案,一時也想不出來怎麼做,利用 Google 找了一下,大多都是利用 find 的 -newer 參數。

find 的 -newer 參數要帶入的是一個檔案,表示會以這個檔案為基準來進行比對。

所以假設是要找 2023-11-11 之後的檔案,就先利用 touch 來建立一個基準檔案,其修改日期為 2023-11-11:

touch --date "2023-11-11" /tmp/base

然後再用

find . -newer /tmp/base -print

就可以找出在 /tmp/base 之後變更的檔案了。

find 也有一個 -newerXY 的參數,這個 XY 可以是以下內容

  1. a – 檔案的存取時間
  2. B – 檔案的建立時間
  3. c – 檔案 inode 的變更時間
  4. m – 檔案的修改時間
  5. t – 參數的內容是時間

那要找比 2023-11-11 要新的檔案,就用以下指令

find . -type f -newermt 2023-11-11

要找特定一天的,就用以下指令

find . -type f -newermt 2023-11-11 ! -newermt 2023-11-12

參考資料

電影流水帳(2023/03/01~2023/03/31)

Jennifer Lopez (珍妮弗·洛佩兹)
Jennifer Lopez

日期是寫 2023/3,但其實是大約 6月~8月間看的。這兩片都是跟媽媽有關係的片子。

길복순

動作片,我覺得挺不錯的,打的很過癮。

福順是公司裡的頂尖殺手,但是她有點想退休了,想好好陪女兒,正在猶豫不決。公司高層還想留她,畢竟是公司的招牌。公司大,就有人眼紅,所以就針對她,想取代她。有了這樣的前因,自然就有了打的原因。

有頂尖的新人一起打,其他想拿賞金的人一起打,高層的老闆也是他之前愛的人,也下來一起打,打到後來,福順總算是都打贏了。她的女兒到最後知道了媽媽的身份其實是殺手,媽媽覺得難過,他不想女兒知道自己是殺手,怕他走上同條路。女兒的反應出乎他的意料,居然能接受他。故事就這樣結束了。

The mother

媽媽早年去臥底,跟犯罪分子結合、懷孕,她不想孩子變成犯罪分子,所以跟 FBI 合作,拔除了犯罪分子。生下女兒以後,女兒送給人收養,她受到 FBI 保護,隱姓埋名躲到冰天雪地的地方去。

只是她的形蹤還是被發現了,女兒的形蹤也被發現了,因而被綁走。所以她只好出面,要保護女兒。在這場保護女兒的過程中,同時也拉近她跟女兒的關係。

最後當然是壞人死光光,她跟女兒也修復了一定程度的感情,皆大歡喜。

還原git簽出檔案的修改時間

執行 git clone 以後取得的修改時間是當下執行的時間,所以其實是沒辦法去判斷哪個檔案是七天前修改的,或是十天前修改的。

Stackoverflow 上有人問了相同的問題:Git clone changes file modification time – Stack Overflow

有人就回答了,其實 git 裡面沒有保留檔案修改時間的資訊,但可以有個 tricky 的方法,就是透過 git log 的資訊來變更檔案的修改日期:

git ls-tree -r --name-only HEAD | while read filename; do
  unixtime=$(git log -1 --format="%at" -- "${filename}")
  touchtime=$(date -d @$unixtime +'%Y%m%d%H%M.%S')
  touch -t ${touchtime} "${filename}"
done

這邊主要用到幾個指令,說明如下

  • git ls-tree 是取出檔案名稱
  • git log -1 --format 是取出檔案提交的日期,這邊取出的是 timestamp 值
  • date -d 將 timestamp 值,轉換為日期時間格式。
  • touch -t 依據指定的日期格式去設定檔案的修改日期。

這邊要注意,目錄的修改時間不會被更動到。

透過以上的腳本,就可以還原git簽出檔案的修改時間,然後再搭配 find 指令來找出七天前修改的檔案了。

serverspec

在「基礎架構即程式碼」這本書裡看到 serverspec 這個工具,是 rspec 的延伸,主要是檢查是否合乎規格,但對象換成了主機,而不是程式。

以下安裝都是在 Ubuntu 22.04 上進行,首先要安裝 ruby

sudo apt install ruby bundler

接著要透過 gem 來安裝 serverspec ,使用 gem install 預設是安裝到系統 /usr/local ,但我不想這樣,我希望是安裝到自己使用者目錄下,這時候可以用 –user-install

gem install serverspec --user-install

這樣就安裝完成了。

接下來建立一個目錄,作為工作區,然後初始化 serverspec 專案

mkdir -p work
serverspec-init

這時候會詢問主機的資訊

Select OS type:

  1) UN*X
  2) Windows

Select number: 1

Select a backend type:

  1) SSH
  2) Exec (local)

Select number: 1

Vagrant instance y/n: n
Input target host name: www.example.jp

主機規格描述,是放在 spec/www.example.jp/sample_spec.rb

所以就編輯這個檔案就可以。

連線到主機,是使用 SSH,這邊若是不想輸入密碼,就要把 public key 複製過去

ssh-copy-id user@www.example.jp

登入使用者不一樣,是要調整 spec/spec_helper.rb 裡的 user。

要進行測試,就執行

rake spec

這樣就可以對主機進行檢查了。

想法

  1. 個人不太喜歡 Ruby ,但 spec 的寫法的確很簡潔。日後若要使用,勢必要再對 ruby熟悉一些。
  2. Ansible 應該可以使用 check mode ,也就是 playbook 單純描述預期的狀態,執行 ansible-playbook 時,可以帶入 --check--diff 來做到類似的功能。

參考資料

測試指定的套件會影響哪些套件

若是想知道指定的套件會影響哪些套件,這時候可以怎麼做呢?

我第一個是想到可以用 rpm ,用 man rpm 可以查到 rpm 有以下參數

  • –provides
  • –requires
  • –whatprovides
  • –whatrequires

所以就試試看

rpm -q --whatrequires libweb

但結果卻不如預期,上網找到這篇 centos – Why does rpm –whatrequires fail to report dependencies? – Unix & Linux Stack Exchange

才知道正確用法是這樣,要先用 rpm -q --provides libwebp 去查到 libwebp 有提供什麼capability,然後再用 rpm -q --whatrequires <capability> 去找。

例如 libwebp

[root@workstation ~]# rpm -q --provides libwebp
libwebp = 1.0.0-5.el8
libwebp(x86-64) = 1.0.0-5.el8
libwebp.so.7()(64bit)
libwebpdecoder.so.3()(64bit)
libwebpdemux.so.2()(64bit)
libwebpmux.so.3()(64bit)
[root@workstation ~]# rpm -q --whatrequires "libwebp.so.7()(64bit)"
libwebp-1.0.0-5.el8.x86_64
gd-2.2.5-7.el8.x86_64
ImageMagick-libs-6.9.12.50-2.el8.x86_64

這樣就可以找到,但若是如此,就要寫腳本了。因為 libwebp 有提供多個 capability ,需要逐一去查才行。

有沒有更快的方法呢?

centos – Why does rpm –whatrequires fail to report dependencies? – Unix & Linux Stack Exchange 裡面有提到可以用 rpm -e --test ,直接模擬看看移除。

rpm -e --test libwebp 2>&1 | grep needed | awk '{print $6}' | sort | uniq

這樣就可以很快找出來了。

ufw in archlinux

最近想試試看 wireguard,看了文件,都會提到用 ufw/firewalld 來配置網路,就想說,自家的 archlinux 都沒用防火牆,是不是該來用一下比較好。經過找 archlinux 文件以後,發現 archlinux 其實很自由,可以自由選 firewalld 或 ufw。在公司因為用 RHEL8 ,都是用 firewalld ,為了平衡一下還有家裡的其他電腦,決定就用 debian/ubuntu 的 ufw 。

ufw 的全名是 Uncomplicated firewall ,archlinux wiki 裡就有詳細的說明文件:https://wiki.archlinux.org/title/Uncomplicated_Firewall

安裝方法

用 yay 或 pacman 安裝

yay -S ufw

設定

安裝好以後,先不要啟用,要先設定。

sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw allow ssh

這幾行的意思是說,允許出去,禁止進來,只允許 ssh 服務的連線進來。

接著啟用

sudo ufw enable
sudo systemctl enable --now ufw

然後可以用 sudo systemctl status ufwsudo ufw status 檢查狀態。

接下來因為自己有用 http/https/gitlab/samba/squid 服務,也有使用 docker,所以要額外設置。

先允許 http/https 連線。

sudo ufw allow http
sudo ufw allow https

設置 docker 規則,docker 的部份有人寫好了,所以安裝套件以後再啟用即可。(ufw and docker),啟用以後,docker 容器有 expose 的 port 就會自動 allow。

yay -S ufw-docker
sudo ufw-docker install

再來是 samba,這也是有人寫好套件

yay -S ufw-extras
sudo ufw allow from 192.168.11.0/24 to any app samba

最後是 squid

sudo ufw allow from 192.168.11.0/24 to any port 3128 proto tcp

到這邊就設定完了,沒遇到什麼特別狀況。

參考資料

Rancher安裝

Rancher 是 RKE 的 Web Console。

參考資料

事前準備

安裝 helm

Rancher 是用 helm 安裝的,所以要先安裝 helm (文件)

到這邊挑選版本下載:https://github.com/helm/helm/releases

wget https://get.helm.sh/helm-v3.13.0-linux-amd64.tar.gz tar xf helm-v3.13.0-linux-amd64.tar.gz sudo mv linux-amd64/helm /usr/local/bin/helm

安裝

增加 helm repo

helm repo add jetstack https://charts.jetstack.io helm repo add rancher-stable https://releases.rancher.com/server-charts/stable

jetstack 是 cert-manager 的 repo

安裝 cert-manager

helm install cert-manager jetstack/cert-manager --namespace cert-manager --version v1.11.0 --set installCRDs=true

安裝 rancher

helm install rancher rancher-stable/rancher \ --namespace cattle-system \ --set hostname=rancher.experteam.com.tw \ --set replicas=1 \ --set useBundledSystemChart=true \ --set bootstrapPassword="Redhat12345678"

這邊要加 useBundledSystemChart=true ,若不加,佈署時會失敗。

若安裝失敗,可以用 uninstall

helm uninstall rancher -n cattle-system

配置 Load Balancer

由於會自動安裝 nginx-ingress ,所以可以使用以下幾種方式

  1. 在 F5 配置,將 master, worker 都配置進去即可。
  2. 新增一台 haproxy ,將 master, worker 配置到 backend
  3. 新增一台 nginx ,將 master, worker 配置進去

或者是偷懶的在 DNS 新增一筆 A record,填入 master 的 node IP 即可。

接下來應該就可以登入了。