2021年12月28日 星期二

vagrant 多vm共用private_key

1.單一主機

原本一個vagrantFile設定單一台主機

預設會產生連線的privary_key

專案目錄/.vagrant/machines/default/virtualbox/private_key


2.多主機共用ssh key

若是以一個vagrantFile設定多台主機

不想要管理多個ssh key

可以在vagrantFile內設定

config.ssh.insert_key = false

讓所有的vm都使用同一個ssh key

這個共用的private_key是放在

~/.vagrant.d/insecure_private_key


3. ssh 連線

可以把key複製出來使用

ssh -i key路徑 帳號@ip

但要注意private_key不能太開放使用

可以使用以下修改

chmod 600 private_key


4.若ssh key有異動需要 修改known_hosts

ssh-keygen -f "/home/ozzy/.ssh/known_hosts" -R "192.168.0.168"

ubuntu更新python 並安裝ansible

因為ansible安裝需要將ubuntu上的python更新到3.8以上

如果系統是ubuntu 20 已經是預設安裝python3 

也就是python 3.6.9

不要再安裝2.x的版本會造成問題


1.更新 repository

sudo add-apt-repository ppa:deadsnakes/ppa

sudo apt-get update


2.安裝python

sudo apt-get install python3.8


3.安裝update-alternatives 可以切換python版本

分別把舊的跟新的都設定上去

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 1

sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.8 2


4.設定要使用哪個版本

sudo update-alternatives --config python3


5.更新pip3

sudo python3 -m pip install -U pip

sudo python3 -m pip install -U setuptools


6.安裝ansible

pip3 install ansible


7.若需要改alias

改.bashrc 

alias python=python3.8


安裝的流程 參考

https://www.itsupportwale.com/blog/how-to-upgrade-to-python-3-8-on-ubuntu-18-04-lts/

2021年12月20日 星期一

vagrant 定義多主機

可以在vagrantFile內一次定義多台主機服務

config.vm.define 名稱為之後操作各主機的名稱

注意 名稱不可以用-

ex: 

  ssh進入vm: vagrant ssh node_api_server

  關閉vm主機: vagrant halt node_api_server


ex:

定義兩台主機名稱分別是myControl與node_api_server

都採用相同的系統ubuntu-20.04

Vagrant.configure("2") do |config|

  # 使用相同key

  config.ssh.insert_key = false

  #這裡設定要使用的vm

  config.vm.box = "bento/ubuntu-20.04"

  config.vm.define :myControl do |subConfig|

    subConfig.vm.network :public_network, ip: "192.168.0.169"

  end

  config.vm.define :node_api_server do |subConfig|

    subConfig.vm.network :public_network, ip: "192.168.0.168"

  end

end

2021年11月29日 星期一

mysqld exporter使用

要監控mysql server狀態

安裝role

ansible-galaxy install cloudalchemy.mysqld_exporter

透過ansible安裝mysqld exporter

playbook.yml

- hosts: all

  become: true

  roles:

    - role: cloudalchemy.mysqld_exporter

      mysqld_exporter_dsn: "user:password@(dbHost:3306)/"

      mysqld_exporter_web_listen_address: "0.0.0.0:9104" 

參考連結

https://github.com/cloudalchemy/ansible-mysqld_exporter/blob/master/defaults/main.yml

2021年11月17日 星期三

由command line 傳遞變數給ansible 與docker-compose

1.由command line傳送變數給ansible

  command:

    ansible-playbook -i hosts.yml --extra-vars "a=2 b=3" tasks/xxx.yml

    ansible-playbook -i hosts.yml -e "a=2 b=3" tasks/xxx.yml

  ansible:

    tasks:

      - name: add folder

        file:

          state: directory

          path: '{{a}}'

2.由ansible command line傳送陣列變數給ansible

  以json傳遞

  command:

    ansible-playbook -i hosts.yml --extra-vars "{'myitems':[1,2,3]}" tasks/xxx.yml

  ansible:

    loop: {{myitems}}

    tasks:

      - name: add loop folder

        file:

          state: directory

          path: '{{item}}'

3.由command line傳送變數給docker-compose

  ex:

  command:

    port=12345 docker-compose up -d

  docker-compose:

    ports:

      - ${api_port}:12345

4.由command line傳送變數給ansible再傳給docker-compose

  ex:

  command:

    ansible-playbook -i hosts.yml --extra-vars "api_port=12345" tasks/ansible.yml

  ansible.yml:

    tasks:

    - name: Shell Start node-api-server

      shell:

        cmd: 'port={{api_port}} docker-compose --compatibility up -d'

  docker-compose.yml:

    ports:

      - ${api_port}:12345

2021年11月10日 星期三

mongo-express錯誤listDatabases requires authentication

原本mongo+mongo-express運作相當穩定

後來掛掉 透過docker logs察看到一個錯誤

MongoError: command listDatabases requires authentication

需要驗證

在docker-compose.yml上加上設定ME_CONFIG_MONGODB_URL解決

ex: docker-compose.yml

mongo-express:

  image: mongo-express:latest

  container_name: mongo_admin

  restart: always

  ports:

    - 8081:8081

  environment:

    ME_CONFIG_MONGODB_ADMINUSERNAME: 帳號

    ME_CONFIG_MONGODB_ADMINPASSWORD: 設定密碼

    ME_CONFIG_SITE_BASEURL: /mongo

    ME_CONFIG_MONGODB_URL: "mongodb://帳號:密碼@mongo—container名稱:27017/"


2021年11月9日 星期二

透過 ansible 限制docker-compose 執行的cpu與記憶體

 實際場域遇到一個狀況

在Window Server運行node api server

發生node吃掉100%cpu 而讓系統無法回應


將node api server以docker佈署到Linux主機上

希望可以限制每個continainer的資源

限制可使用的cpu與記憶體

佈署docker container是透過ansible執行

ansible設定docker-compose的cpu限制 在3.x版後就不支援了

只能透過docker執行

要透過docker-compose執行 只能透過shell執行


安裝

1.docker-compose.yml

node-api-server:

  image: node:12.22.7-alpine3.14

  container_name: node-api-server

  working_dir: /usr/src/NODE_API_SERVER/bin

  restart: always

  command: >

    sh -c 'node index'

  volumes:

    - '/home/vagrant/project_pools:/usr/src/'

  ports:

    - 12345:12345

    - 9229:9229

  deploy:

    resources:

      limits:

        cpus: '0.40'

        memory: '300M'

2.ansible 安裝檔 install.yml

tasks

  - name: build docker

    become: true

    docker_compose:

      project_src: 'docker-comose檔案所在的目錄'

3.ansible 執行檔start.yml

tasks:

  - name: Shell Start node-api-server

    shell:

      cmd: docker-compose --compatibility up -d

      chdir: 'docker-comose檔案所在的目錄'

      

參考

https://blog.yowko.com/docker-compose-3-cpu-memory-limit/

2021年10月31日 星期日

vagrant 安裝docker與docker compose

1.先安裝vagrant plugin

  vagrant plugin install docker

  vagrant plugin install vagrant-docker-compose

2.VagrantFile

  Vagrant.configure("2") do |config|

  ...

    config.vm.provision :docker

    config.vm.provision :docker_compose

  end

其他詳細使用可以參考

https://github.com/leighmcculloch/vagrant-docker-compose

2021年10月26日 星期二

Prometheus資料清除

今天一早收到通報Grafana在昨天晚上就沒有資料

查了一下主機 硬碟爆了連使用ansible進去更新

都沒辦法建立暫存檔

要清理Prometheus的metrics資料 只能透過admin api處理

預設web admin api是沒有enable

1.需要在prometheus加入啟動web admin api

  docker-compose.yml

  prometheus:

    image: prom/prometheus:latest

    command:

      - '--config.file=/etc/prometheus/prometheus.yml'

      - '--storage.tsdb.retention=7d' //設定資料只保留7天

      - '--web.enable-admin-api' //啟動

      - '--web.enable-lifecycle'

  改了docker-compose.yml 只要重新啟動就會生效

2.在主機上透過curl呼叫 admin api執行刪除metrics

  指定job資料刪除

  curl -X POST -g 'http://localhost:9090/api/v1/admin/tsdb/delete_series?match[]={job="要刪除的job名稱"}'

  

2021年10月20日 星期三

以字串做sql時間欄位比較

當由前端要送一個值到db作日期的前後比較

而這個欄位的是dateTime欄位

要比較的值以MM.DD.YYYY 送進去就可以作比較

若用YYYYMMDD則無效

直接以new Date()送出則會發生錯誤

sql日期比較

當要對一個dateTime欄位作日期的比較

前端

ex: dateStr = moment().format('MM.DD.YYYY')

sql

SELECT * FROM mytable WHERE edate <='10.10.2021 00:00:00'

dbeaver換語系

dbeaver是可以跨平台的db工作

但裝起來卻是簡中顯示 要改成英文

需要去改dbeaver.ini設定

/sanp/dbeaver-ce/147/usr/share/dbeaver-ce/dbeaver.ini是唯讀改不了

透過修改

/var/lib/snapd/desktop/applications/dbeaver-ce_dbeaver-ce.desktop

加入-ln en設定

Exec=env BAMF_DESKTOP_FILE_HINT=/var/lib/snapd/desktop/applications/dbeaver-ce_dbeaver-ce.desktop /snap/bin/dbeaver-ce -nl en

即可

2021年10月6日 星期三

git 發生 server certificate verification failed. CAfile: none CRLfile: none 錯誤

當由私人git repo下載安裝

可能出現錯誤

server certificate verification failed. CAfile: none CRLfile: none

造成無法安裝

可以透過環境設定

export GIT_SSL_NO_VERIFY=1

跳過檢查就可安裝 

2021年10月3日 星期日

vagrant shared folder npm問題與symlink操作

目的希望以vagrant建立開發環境

只將要開發的nodejs專案以shared folder方式

在host上執行開發

但問題會發生在 如果在shared folder內執行npm install

將造成錯誤

如果是在vm內的非shared folder執行是不會有什麼問題


目前測試比較簡易的作法是

shared folder內作npm install會安裝的node_modules目錄

不要是實體目錄,而只是一個連結到其他位置的symlink即可解決

ubuntu內建立symlink


ln -s 實體目錄 虛擬目錄


1.列出指定目錄下的symlink

  find 目錄 -type l

2.建立symlink

  ln -s 實體目錄 虛擬目錄

3.移除symlink

  rm 虛擬目錄

注意

  如果是實體目錄 必須以rm -rf 目錄名稱

  如果只是連結 只需要rm即可

2021年9月24日 星期五

下課

看著時間 差不多是8點半了

騎著車 準備去接妹下課

騎出巷口 慢慢往安親班的方向

遠遠的看到妹妹

手提著水壺擺動 腳步像是邊走邊跳

我知道 他是邊走邊唱著歌


看到爸爸來 上了車

妹妹:爸爸 我肚子餓了

爸爸:走 我們去看看有什麼可以吃的

妹妹國中了 我們也開始新的生活步調

2021年9月23日 星期四

express透過req要取得request進來的url資訊

可以透過

1.req.protocol // http或https

2.req.hostname // 這只會取到example.com

3.req.get('host') // 可以取到 example.com:3000

4.req.originalUrl // 取得/main?x=1&y=2

2021年8月16日 星期一

張三的歌



在家工作 習慣性的打開音樂播放

喇叭裡傳來的是張三的歌

聽著聽著 停了下來 翻翻 相簿裡7年前的照片

 

這首歌裡有好多自己的記憶

高中時我媽還在鹽程區的華后飯店當打掃

他說有一天他看到了電視明星石峰去住在那拍片

電影是父子關係 主題曲是張三的歌



高中學著吉他 總會背著吉他去學校

放學後 幾個同學 在已經放學後的教室裡 大聲唱著歌

"我們要飛到那遙遠地方看一看

這世界並非那麼淒涼

我們要飛到那遙遠地方望一望

這世界還是一片的光亮"

在那個不識愁滋味的年紀

歌詞裡 彷彿是那只說強說愁的浪漫




6年前離開台北 回到高雄

離開前 帶著妹妹回來高雄兩個禮拜

每天每天帶著他到 我想帶他去看的地方

去屏東的果園

去我小時候住過的老家

去夢時代 去潮州

我不知道 以後是不是還有可以帶著他這樣到處飛翔


"忘掉痛苦忘掉那地方

我們一起啟程去流浪

雖然沒有華廈美衣裳

但是心裡充滿著希望"

6年過去了
妹妹一直跟我生活著
今年要上國中了 不再是以前那個小小孩
看著他長大 看著他在我身邊的每一天
對於生活 我充滿著感恩

2021年7月29日 星期四

生日 這天

印象中 每年生日這天 總是太陽高照的好天氣

畢竟 這是夏天

早上 接到妹打電話來 跟我說生日快樂

工作一天 很順利 時間內把所有工作都完成了

也放心的把下個禮拜的假單丟出去


回到家 才放好上班的背包

妹妹就要我把他藏的禮物找出來

平常都是我藏禮物給他找

每年生日 無論妹妹有沒在家

都會寫卡片給我

因為今年暑假 他在家 可以陪我

卡片 很窩心


吃了飯 洗好澡

我們騎車 出去買東西

來全聯買了他的潤髮乳

去風船買了章魚燒

去麵包店 買個小蛋糕 回來

邊吃 邊看阿神的木筏求生

再跟妹妹玩猜猜看的遊戲


生日這天 覺得很幸福





2021年5月23日 星期日

妹妹的新房間



一樣在5點多醒來

起床去跑步 發現今天的口罩不太透氣

勉強跑了2000就休息了

昨天一整天的拼圖 只剩一些

一早 拼圖就整個完成了

然後跟妹開始整理房間


妹妹的新房間 就是我國中開始所住的房間

書桌還是一樣

雖然幾年前 就已經幫妹準備好了自己的房間

但是生活上 還是都跟我一起

反而是他的房間都被我拿來當工作書房跟睡午覺比較多


說好 等上國中 妹就要在自己房間睡覺了

開始整理妹房間架上的書

那些童書繪本都打包起來 把書架都清空了

整理他書桌的那些玩具娃娃都收了起來

把所有他的東西都搬到了自己房間佈置起來

看起來這次 他真的想要用自己的房間了


我想妹妹長大了

已經不再是以前那個小小 需要我抱的妹妹


忙了一整天 累的很早就睡著

直到妹妹幫我關了燈

矇嚨間 想到 妹妹被子有沒有拿

房間冷氣 會不會定時

趕緊爬了起來 拿被子到妹房間

他很快的上了床 跟我說了晚安 關燈


回到房間 我反而睡不著了


原本 每天 睡覺時 妹總是一直說話

一直說話給我聽

半夜起來 看著熟睡的他

我心裡 很踏實很安心

看著他長大

慢慢的不再依靠自己

我想爸爸的失落感 大概就是這樣吧 

2021年5月17日 星期一

各種執行方式下傳遞參數給nodejs的執行

在使用command line執行node程式

透過參數傳遞到程式內的幾個執行方式

參數的傳遞

1.node

  js程式內(buildTest.js)

    const host = process.argv[2]

    const type = process.argv[3]

  執行

    node buildTest myhost mytype

2.透過npm執行

  將node執行放到package.json的script上透過

  npm run執行

  1.package.json內設定

    {

      ...

      "build-test": "node ./xxx/buildTest",

    }

  2.npm 執行

    npn run build-test myhost

3.包裝成bat檔案執行

  bat檔案內容(build-test.bat)

    @echo off

    node buildTest.js %1

  執行

    build-test.bat myhost

4.保證正確的執行路徑設定

  透過各種方式執行

  需要注意到路徑問題

  要執行的js檔案在 /ozzy/test/build-test.js

  執行方式

  1.在根目錄下執行

    使用node /ozzy/test/build-test.js執行

  2.進入到js檔案所在目錄執行

    cd /test/

    node build-test.js

  若執行的js內有用到相對路徑

  相對的對象會是node執行的位置

  可能會造成問題


  要保證在任何地方都可執行

  最好取得完整路徑

  作法是以__dirname 搭配path.join取得絕對路徑

  __dirname會拿到js檔案所在目錄的位置

  ex:

    在build-tes.js內要取到/ozzy目錄

    原本相對路徑是用

    const ozzyPath = '../'

    改用

    const ozzyPath = path.join(__dirname,'..')

2021年4月20日 星期二

window上nginx的操作紀錄

1.nginx.pid

  nginx.pid檔案內會紀錄當下運作的nginx master程序的pid

  若手動重複執行多次的nginx

  則nginx.pid內紀錄的是最後被執行的nginx master pid

2.停止nginx

  透過指令nginx -s quit或 nginx -s stop

  除了停止外同時會把nginx.pid檔案刪除

3.手動刪除nginx.pid

  因為找佈道nginx.pid,會造成nginx指令無法操作

4.由工作管理員要停止nginx程序

  若被停掉的是workder,則會自動產生新的worker程序

  停掉master程序 才能一個個刪除worker程序

  透過手動停止 nginx.pid並不會被刪除

5.安全的使用

  啟動nginx確保不要被重複產生多個master process

  停止或重啟都透過指令操作

  這樣可以透過檢查nginx.pid的存在與否 判斷nginx是否運作

2021年4月19日 星期一

2021年4月16日 星期五

vue建立動態watch

當建立一個vue物件

如果data內容是由變數動態產生

要watch這些動態data值 可以透過this$watch建立


 const dataObj = {  
  x:'',  
  y:''  
 }  
 建立vue物件  
 {  
  data() {  
   return dataObj  
  },  
  created() {  
   for(const prop in dataObj) {  
    this.$watch(prop, function(newValue, oldValue) {  
     // .. do something  
    });  
   }  
  }  
 }  

2021年4月8日 星期四

Git error - Fatal: Not a git repository錯誤處理

在window上發生了幾次莫名的git忽然消失問題

察看目錄下.git目錄都還在

但系統確不認得這是一個git 目錄

處理的方式

1.檢查.git/config檔案是否變成亂碼

2.刪除 git/HEAD

3.git init

應該就回復正常了

2021年4月1日 星期四

git 回復檔案到舊commit點

在做程式開發 如果發現

程式有問題,想要回復到 指定的commit點

ex:

master的點在今日04/01上

希望回到 03/20的commit點 'a123456'


git reset --hard "a123456"

git push -f origin master


就可以發現server上master的commit點會是'a123456'

而且'a123456'之後的commit 也就是03/20之後的commit

都已經背清除掉

2021年3月24日 星期三

淚海

 那年 剛退伍回來的那一年

一群朋友常一起出遊

只記得一個夜晚 幾個朋友坐在朋友的吉普車內

好像是往西子灣去的方向

在車上 還放了把吉他

在昏暗的車後座 拿起了吉他

在車上 就彈著唱起 淚海

那是個還是年輕

還是浪漫的會唱起歌的年代



2021年3月12日 星期五

quasar 為內定emit handler加入更多的傳遞參數

在handler加入要另外傳遞的參數

例如當要接收checkbox的input event

handler能接收到的只有val 與evt這兩個參數

<q-checkbox v-model="selected" :val="item.id" @input="inputHandler">

inputHandler(val, evt){


}


但如果需要再多傳遞參數到handler

可以改寫為以下

就可以傳遞更多的自訂參數給handler

<q-checkbox v-model="selected" :val="item.id" @input="(val, evt) => inputHandler(val, evt, my_var)">


inputHandler(val, evt, myvar){


}

2021年1月26日 星期二

南下

趁著要開車回南部的空檔

中午跟同學約在北車京站的開飯川食堂

好久不見的大家 席間聊著工作

聊著生活 還有聊到知道的同學們近況

熙光也特別請假來了

吃完飯3點多回到新莊


大概4點 開車上路回高雄

走二高 一路順暢好開

一直開到清水服務區 才換手mei繼續

回到高雄8點多不算晚

行李都丟到家裡後

先騎車去costco買明天去嘉義

要順便 帶給客戶的水果

都把事情做完 買個麵當晚餐

才休息



2021年1月25日 星期一

漫步台北

來台北這天是空檔的一天

早上帶mei媽到北車搭高鐵

順便就來北車這走走


以前住台北 常來也最方便的地方就是北車

重慶南路上的天龍書局

衡陽路口的星巴克 都是常去的地方

轉個彎 二二八公園 也是自己一個人常去放空的地方

武昌街旁的省城隍廟

還有對面的明星咖啡廳旁的傳統市場

也都是自己到處亂走亂逛 會去的地方


走到西門町 吃個阿宗麵線

再走回天龍買書

要搭車回新莊才發現 領錢的提款卡

在花旗的提款機內 忘記拿

再走回銀行取回卡片

才回新莊


傍晚陪mei去客戶那

搭公車到復興南京站

陶然坊是客戶工作的地方

我們也順道在這吃飯

聽說這裡是米其林等級的烤鴨

只是我們兩個人 沒辦法吃太多

一份客戶招待的鴨架 就吃的很是滿足

8點多搭公車回新莊

買了雙鞋 就要準備明天要回高雄的行李整理




2021年1月24日 星期日

關西 大溪一日遊

上台北前mei已經報好了鄰居的遊覽行程

這也是自己很難得參加的活動

旅遊的地點是 關西雲夢山丘


7點多 在中平國中前集合上車

整車都是附近的街坊鄰居

上高速公路走 感覺像是以前要出國時

坐車去機場一樣

坐在最後一排 還好沒有暈車

到了關西休息站 先下車休息

這次的遊覽車是附近鄰居夫婦

自己的車 很親切


雲夢山丘是第一個行程

還沒有開發完全 對外開放的部分

還有許多地方在施工

看得出來 整個完成後

會是個很適合來走一整天的園區



午餐是在關西老街自己解決

車停在小小街道旁的第一銀行前

趁下車前google了一下

清香飲食店 是街上50年的老店

沿著馬路直走就到了

道地的客家菜

吃完 要去逛老街

結果走錯地方 差點趕不上坐車時間

再往前一點 安東古橋 是大家拍照的地方


結束這邊行程 往龍潭出發

目的地是龍潭三坑自然公園 

到這裡已經起風了 外套穿著有些涼

停留一會就往大溪老街去

好久沒來這裡 街上的人還蠻多的

走走逛逛 買了豆乾 買了花生糖

晚餐就在路邊吃了 大腸香腸

這樣的行程 一天走下來

也到了要回台北的時候

2021年1月23日 星期六

2021寒假的第一天

高鐵站的摩斯早餐

開始了 妹妹這個國小最後一個寒假

每年總在寒暑假時回到台北

到板橋 沿著四川路走

轉個彎 原來樂器行就在慈惠宮的旁邊

已經租好的鼓室 這是妹妹第一次打真的爵士鼓




樂器行11點才開門

真的就是11點鐵門才拉開

小小鼓室裡 冷氣很強

鼓棒敲下去後 真實的聲音

自己下去打 許多以前練團的感覺 都回來了

一個小時結束後 跟老闆聊聊

走路回到車站搭環狀線 到新莊


幸福路下車 站在寶雅這 等mei來

到家裡 吃了好吃的蝦仁水餃

就跟mei騎車去桃園


沿著二省道走 接到中正路上

有一點熟悉的路 是大學時

跟同學騎車去林口游泳時 騎的路線

車過了迴龍 空氣明顯感到有些涼了

看著地圖找到榮總附近的新光三越

把東西交給了mei的朋友才離開

來的路上看到橋邊有個假日花市

我們繞進去逛逛

吃個雞蛋糕 吃個米血 逛逛花市

再騎車回家


晚上大家吃完飯後

回福壽街路上 順便買染髮劑染頭髮

2021寒假的第一天

2021年1月6日 星期三

nginx upstream設定

透過upstream設定多台服務的負載平衡

以一個網頁的request內用到多個連線 當範例

1.預設

  所有的連線輪詢分配到各主機上

2.least_conn

  將連線給目前連線數最少的主機

2.iphash

  以ip辨識同個ip的request都會進同一台主機


當其中有主機出問題無法服務

會透過以下兩個設定判斷 是否把該台主機排除在負載平衡外


1.fails_timeout:

  當失敗連線間隔這個設定的秒數後, 新進來的連線

  還是會對這台主機進行retry連線

2.max_fails:

  當retry失敗次數達到這個設定最大值

  還無法連線 這台機器就會背排除

以下的範例設定是

當連線失敗10s後 再接到的request會再連線這台主機

當retry達到5次後 還無法連線 這台主機就會被剔除

直到nginx 重啟

upstream myapp {
  #iphash;
  #least_conn;
  server 127.0.0.1:3000 max_fails=5 fails_timeout=10s;
  server 127.0.0.1:3001 max_fails=5 fails_timeout=10s;
}