Skip to main content

· 10 min read
zaxro

basic tutorial

以下出自官網. 主要介紹幾個大方向.

Concepts

  • Pipelines: CI/CD 透過 pipeline 建立。
  • CI/CD variables: 有 GitLab 預設變數(可以在 script 用 export 取得)、自定義環境變數和secure files
  • Environments: 要把應用部署在不同環境要使用。
  • Job artifacts: 程式過程中執行的產物(例如 xxx.csv)檔案的輸出以及其他 job 使用等。
  • Cache dependencies: 使用 cache 關鍵字可以幫助減少 pipeline 的運行時間,提高 CI/CD 效率。通過緩存依賴項,可以避免在每次運行 pipeline 時都從頭開始安裝相同的依賴項。
  • GitLab Runner: 設定執行這個 pipeline 的計算機。
  • Pipeline efficiency: 在 pipeline 過程中也會遇到一些煩人的問題,例如運行了一分鐘才失敗,需要多次查看等。如何提高效率呢?可以使用緩存、縮減要拉的映像檔大小、使用規則以及 only/except 關鍵字來控制作業在何時和何處運行。
  • Test cases: 在測試平台上建立測試情境。

· 3 min read
zaxro

Device basic introduction

internet gateway

互聯網閘道器(Internet Gateway)是一種網路設備,用於連接位於本地網路(例如公司或家庭網路)內的設備與互聯網間的通訊,扮演網路中介,將本地網路封包轉到外網,再把外網封包轉回本地網路,所以需要有 router 功能

Modem

數據機(Moden),主要功用是將數字訊號轉換成模擬訊號。

數字訊號

數字信號是一種離散的信號,它由一系列離散的數字或二進制碼表示。這些二進制碼只能取 0 或 1 的值。

模擬訊號

模擬信號是一種連續的信號,它是由一個連續的波形表示的。模擬信號可以取無限個值,因為它們是基於物理量(如電壓、電流、聲音波形等)的連續變化。模擬信號常用於聲音和視頻等模擬設備中,如收音機、電視和手機等

Do Internet gateway and modem need to be used together?

不一定,這依據情形而定。以下情形會需要一起用:

  1. 撥號網路: 需要將計算機的數字訊號轉成模擬訊號,並透過電話線傳遞訊號到互聯網。
  2. 電視網路: 同上,一些有線電視網路提供的網路服務一樣要先做訊號轉換,再透過有線電視網路傳輸。

簡言之,如果你家使用撥接或有線電視提供的網路,就會需要數據機

如果你家用光纖、DSL、電纜等,就可以不用轉換訊號,直接透過 Igw 將數字訊號 routing 到外部網路。

· 13 min read
zaxro

名詞解釋

IAAS: 雲端業者提供硬體設施、網路。不包含作業系統(Linux or Windows),中介軟體(MySql,Pika),以及應用程式。

PAAS: 雲端業者提供硬體設施、網路、作業系統、中介軟體,因次伺服器故障跟備份資料庫等工作可以由雲端業者負責。

SAAS: 雲端業者提供硬體設施、網路、作業系統、中介軟體、應用程式。Gmail 就屬這類型.

Region: aws 基礎設施的一個單位,每個區域都是獨立數據中心群集,由多個 Availability Zone 組成,所以像新加坡區,aws 目前就 3 個可用區域。

Availability Zone: 具有獨立的電源、網絡和冷卻系統,以及與其他可用區域之間高帶寬、低延遲的網絡連接。每個可用區域都是一個獨立的數據中心群集,具有高度的冗餘性和可靠性,並且可以通過低延遲的連接實現可用區域之間的容錯和負載平衡。

VPC(Virtual Private Cloud): VPC 只能限在單個 region 內,但可以跨同一格 region 內的多個 Availability Zone

· 4 min read
zaxro

前提

這邊假設已經設定好 host,且 zabbix 有接上 grafana 情況後,繼續往下描述.

目的: 定時抓取某 log file 其中的特定關鍵字,用 zabbix-sender 傳送資訊給 zabbix server,並把資料設定報警到 telegram,資訊會用 grafana 的 log 顯示。

step1. 設定 item

正常 zabbix 設定機器流程:

建立 Hosts groups-> 建立 Templates->往 Template 內設定要監控的 item->再把 templates 連結到 Hosts Groups 上面->最後把主機也就是 Host 添加到指定的 Host groups 上面。

這邊因為特別需求關係(只有這一台機器需要),因此直接在該 Host 上面設定 item.

選 Hosts

zabbix-side-bar

因為是用 zabbix-sender 所以這邊 type 用 zabbix trapper,要注意機器上面都用 Key 跟 zabbix server 溝通,Name 是該 Item 的名字,兩個設定常常會搞混。

zabbix-side-bar

step2. 安裝 zabbix-sender 並傳資料

機器上腳本設定 zabbix_sender 傳送資料,用 key 跟 output 做傳送

# 安裝zabbix-sender
yum install zabbix-sender
# 傳資訊給zabbix server
zabbix_sender -z 10.121.0.9 -s yourHostName -k test -o "$(cat /tmp/Lost_connection_to_db_server_${range2}_${range1}.log)"

確認 zabbix 是否有收到資料

zabbix-side-bar

step3. 設定 grafana 抓取資料

確認有收到資料後,在 grafana 新建 panel

zabbix-side-bar

設定資料原,注意這邊的 Query Mode 是設定 Text,有很多種型態,選錯會找不到資料

zabbix-side-bar

Grafana 模式記得要選 log,也可以使用其他模式玩玩看,因為這邊沒啥雷,就不特別截圖說明

(optional)step4. zabbix 告警 tg

先設定 Trigger,Problem expression 也就是當傳送資訊符合設定的條件就會引發告警,Recovery experssion 也就是當資訊符合哪些條件就會解除告警。

zabbix-side-bar

確定完的確會告警跟回復後,就可以設定 TG 告警。先去 Administration->Media type 複製 Telegram 那格。

zabbix-side-bar

在 Token 位置加入你 TG Token

zabbix-side-bar

建立新 User Group

zabbix-side-bar

設定該 User Group 對哪些 Host Group 有監控權限。

zabbix-side-bar

建立 User,並把該 User 加到 Group 內部,並設定當哪些狀態發生就往 TG 送資料

zabbix-side-bar

以上都 OK,可以會到前面 media type 那邊測試是否可以傳資料到TG

如果要將 Trigger 的資料送到 TG,一定要設定 Actions,這邊是一個坑,前面設定完了但都沒有送到 TG,結果發現這格沒有設定ZZZ

zabbix-side-bar

· 11 min read
zaxro

what is aws IAM

什麼是 IAM aws 官網的資訊一般都寫得滿棒的,本文出處主要是參考官網資訊做整理,因為管理上經驗只限於自己的環境用的 s3,CI 等等,所以打算趁這個機會檢視之前設定的 iAM 有沒有問題,當然,我相信這只是過程,隨著看過的資訊跟事情越多,會得到不同或者多個答案,總之,就先從這一步開始吧!

AWS Identity and Access Management (IAM) 用途:安全地控制對 Amazon Web Services (AWS) 和帳戶資源的存取。使用 IAM 為使用者和角色等身分提供您的帳戶中資源的存取權。

· 3 min read
zaxro

遇到問題的情境

CICD 步驟裡面,每當開發人員把 code 寫完之後,會進行測試並把 code build 成 image 後推到 image registry ,之後到環境執行 deploy。

在 gitlab 裡面會用 gitlab runner,並在.gitlab-ci.yml 設計促發的情境下,執行.gitlab-ci.yml 內容,要在 gitlab runner 內 build image 通常會用到 docker:dind,它是具有 docker 引擎的 container!一般的 image 內通常都不會去安裝 docker 引擎,這段有點難懂,但你可以想想有 nginx,mysql 等等的 image,基本上只會有自己預設功能,不需要 docker 引擎,對於 docker 而言,裡面要可以用 docker 指令的, docker:dind 是一個選項。

在 build 版執行的 yml 如下。 主要功能就是登入在 gitlab 上面的公司的 image registry,之後在 gitlab runner 執行 build image 並推到 gitlab image registry.

.gitlab-ci.yml
stages:
- build

variables:
IMAGE_NAME: hahaha
CI_IMAGE: $CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA

# Build moni
build-moni:
stage: build
image: docker:dind
tags:
- docker
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- docker build . -t $CI_IMAGE
- docker push $CI_IMAGE
- docker rmi $CI_IMAGE
except:
- schedules


Dockerfile
FROM node:16

COPY /node /node
WORKDIR /node
RUN npm install;npm install gulp -g;gulp build;
EXPOSE 4000
CMD [ "npm", "run", "start" ]

執行過程到這一步- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY遇到報錯, error during connect: Post "http://docker:2375/v1.24/auth": dial tcp: lookup docker on 1.1.1.1:53: no such host

解法:

在你掛到 gitlab runner 中 /etc/gitlab-runner 裡面的 config.toml,請先用 docker inspect 觀察 volume 掛載位置,如果你是用官網 local volume 掛載方法,那就是在 VM 上去 vim /srv/gitlab-runner/config/config.toml,去修改 volumes = ["/cache"] 變成 volumes = ["/var/run/docker.sock:/var/run/docker.sock","/cache"]

並執行docker restart gitlab-runner!

可能原因:

執行這個修改,volumes 改為 ["/var/run/docker.sock:/var/run/docker.sock", "/cache"],讓 Runner Executor 使用主機外部的 Docker Engine。

所以推測,這可能是 gitlab runner 跟 gitlab server 上面驗證的機制,如果沒有這樣加,dind 就找不到 gitlab server 的驗證那關,所以就會失敗

· 3 min read
zaxro

workflow 區分 env 設定模式

使用 CI 跟寫程式都會遇到要從 env 拿取變數值的時候,在 github 管理方式如下,主要判斷是這個變數是否要給多個 workflow 使用。

單 workflow 使用

非密碼類型,在 workflow 中定義 env 即可。

name: Greeting on variable day

on:
workflow_dispatch

env:
DAY_OF_WEEK: Monday

jobs:
greeting_job:
runs-on: ubuntu-latest
env:
Greeting: Hello
steps:
- name: "Say Hello Mona it's Monday"
run: echo "$Greeting $First_Name. Today is $DAY_OF_WEEK!"
env:
First_Name: Mona

不同層次的環境變數可以繼承並覆蓋較高層次的環境變數。例如,如果您在頂級工作流程文件中設置了一個環境變數,並且在作業中使用相同的變數名稱定義了另一個值,那麼在該作業中使用的值將覆蓋頂級值。

密碼類型,就需要用到會跨多個 workflow 的 secrets 去管理。

多 workflow 使用

需在 github UI 設定變數。這些變數可以跨多個工作流程使用。 位置

github-env-repo-variable.png

主要三層級:

  1. 組織

  2. 存儲庫

  3. 環境

    上面圖有 repo 跟 env 的,使用順序部分:Environment > Repository > Organization。 如果有相同變數,優先用 Environment , than Repository, than:Organization。

使用情境

這邊提供參考

如果您不確定,也可以從存儲庫密鑰開始為所有東西創建密鑰。如果之後有引入需要不同密鑰的不同環境,例如 prod,dev,test 等,則可以將存儲庫密鑰移動到特定環境。然後在特定環境用特定變數值。

使用方法

設定在 sercrets

要用要這樣用${{ secrets.YOURKEY }} 為啥格式長這樣要看secrets 上下文

設定在 variables

要用要這樣用${{ vars.YOURKEY }} 為啥格式長這樣要看vars 上下文

設定在 workflow 裡的 env

如果是在機器底下,可以用$KEY(linux).

設定在機器外面(job 以上層級)要用env 上下文${{ env.mascot }}

· 3 min read
zaxro

同 pc 的 curl 結果不同

前陣子因為需要檢查域名設定,測試過程中發現在 pycharm 運行 curl 指令,運行結果跟 iterm2 的運行結果不同,以下是 demo 指令

curl -XPOST 'https://www.boce.com/apiHtml/login' \
-A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36" \
-H 'Content-Type: application/json' \
-d '{
"email_or_phone":"thisIsSecret",
"password":"thisIsSecret"
}'

curl 指令基本介紹

Curl 是一種在命令列介面下使用的開放原始碼檔案傳輸工具,常用於 HTTP、HTTPS、FTP 等協定的傳輸 因為curl選項太多,可以用curl --help all看所有選項, 常用選項有以下

  1. -H 帶 header
  2. -A 帶 useragent
  3. -i 看回應 header(可以拿來查回應 token)
  4. -d 使用 post 方法要帶入 data
  5. -X 使用的方法 ex. POST PUT DELETE GET
  6. -c cookie 相關操作 以下為例,登入網站並把回應 cookie 存在 cookie.txt
curl -c cookie.txt -XPOST 'https://www.boce.com/apiHtml/login' \
-A "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36" \
-H 'Content-Type: application/json' \
-d '{
"email_or_phone":"thisIsSecret",
"password":"thisIsSecret"
}'

後續可以用curl -b cookie.txt在請求時把 cookie 帶入到 request 中

  1. -v 詳細模式
  2. -o file名稱 網址 下載圖片使用,檔名自己命名 Write to file instead of stdout
  3. -O 網址 下載資料使用,檔名同遠端網址檔名 Write output to a file named as the remote file
  4. -L 跟隨 301 302 跳轉
  5. Basic Authentication,可以攜帶 --user username:password 來通過驗證。

step1. 問題排查 curl -v 看過程

比較後發現,ide 跟 terminal 帶的 header 跟 useragent 這些都有帶,問題不在這邊。

step2. 檢查使用的 curl 是否有差

檢查which crul輸出

ide: /usr/bin/curl (curl 7.79.1 (x86_64-apple-darwin21.0) libcurl/7.79.1 (SecureTransport) LibreSSL/3.3.6 zlib/1.2.11 nghttp2/1.45.1 Release-Date: 2021-09-22)

terminal: /Users/ford/opt/anaconda3/bin/curl (curl 7.82.0 (x86_64-apple-darwin13.4.0) libcurl/7.82.0 OpenSSL/1.1.1n zlib/1.2.12 libssh2/1.10.0 nghttp2/1.46.0 Release-Date: 2022-03-05)

發現有差別,進一步檢查發現兩者檔案 size 也有差,使用的相關套件也有差。

解法: 直接指定 curl 位置,/usr/bin/curl 。

心得

基本上連自己電腦環境都可能用髒了,之後排查類似的 bug 順序會先檢查彼此使用指令的版本,確認沒差太多,在開始往其他方向排查。

· 9 min read
zaxro

S3 靜態網站設定

info

如果有打算限制能近來的域名,就請不要用靜態網站,就用預設的 RestApi 模式,接 cloudfront 透過 header 去限定。

官網教學很詳細! 要在 Amazon S3 上設定靜態網站,如果是使用 UI 的話,請按照以下步驟進行操作:

  1. UI: 建立新的 S3 Bucket 或選擇一個現有的 Bucket。(Cli:aws s3 mb s3://me-profile --profile ford --region us-west-1 在 us-west-1 建立 s3 bucket,bucket 名稱是 me-profile,使用的 user 是 ford)
  2. UI:在 Bucket 屬性中啟用靜態網站主機。
  3. UI:指定要使用的索引文件(index.html)和錯誤文件。(Cli:aws s3 website s3://bucket-name --index-document index.html --error-document error.html)
  4. UI :將必要的文件添加到 Bucket 中。(可以用 也可以用 cli Cli:aws s3 sync ./dist/ s3://fordserver-front --delete --profile ford)
  5. UI :配置 Bucket 策略以允許公開訪問文件,預設會全擋。
  6. UI :新增儲存貯體政策,將儲存貯體內容設為可供大眾讀取,把這個 json 複製貼上
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::Bucket-Name/*"
]
}
]
}

Resource 更新為您的儲存貯體名稱!