棄用 keepass2,改用 keepassxc

最近用 keepass2 時,碰到 plugin 不能用的錯誤訊息,更新 plugin 以後也無法解決。在找解決方法時,意外看到 keepassxc ,一樣是跨平台,再加上瀏覽器的整合也不錯,乾脆就跳槽了。

使用方法不難:

我先用網站提供的 PPA 來安裝,執行 keepassxc ,可以開啟 keepass2 的資料檔案,但設定上遇到問題。我碰到的問題是在 Preferences 裡找不到 Browser integration 這選項,利用 Google 搜索以後 (詳見 keepassxc FAQ 與這個 issue),才知道是因為 Ubuntu trusy 的 QT 版本問題,所以無法提供 Browser integration,得使用網站提供的 AppImage 檔案才行。

所以就下載 AppImage 檔案,用 chmod +x 為檔案增加執行權限再執行,就可以看見,並且 Browser 的 extension/addon 也可以順利的跟 keepassxc 連接。

Ansible 需要 python

如果目標主機上沒有 Python 時,Ansible 可是會抗議的。

所以必須要先幫目標主機裝上 Python 才行。首先要將 gather_facts 設定為 no,再利用 raw 模組來進行安裝,不使用 gather_facts 跟其他模組的原因是這些都會使用到 Python。

---
- hosts: all
  become: yes
  gather_facts: no
  tasks:
    - name: install python in Ubuntu
      raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal)

上面用的是 apt,表示適用於 Debian/Ubuntu 等 debian-like 的 distro,至於其他的 distro ,就看套件管理程式是什麼囉。

加速 SSH X11 forward 的速度

今天用 SSH 連回家裡電腦,開 thunderbird ,發現慢的要命,心裡想,照理來說,不傳圖片應該會比較快,難道是傳輸的內文太多嗎? 就利用 Google 找了一下,結果說是加密速度問題,改用較快的加密協定就可以了。

文章裡說改用 arcfour,blowfish-cbc ,但因為安全性的關係,新的 OpenSSH server 都沒有啟用,所以退而求其次,改用 aes128-ctr, aes192-ctr ,的確速度快了很多。

ssh -YC4c aes128-ctr,aes192-ctr user@server

 

另外附上測試 SSH 加密速度的腳本網址:https://gist.github.com/graysky2/0e265604bfd4856a2596

 

參考資料:

Pro Vagrant

今天翻了 Pro Vagrant 這本書,這本書是 2015 年出版的,到今天書裡已經有些資訊是過時的了。不過裏面介紹了如何使用 vagrant 、如何打包 box 以及使用上的觀念與建議作法,還蠻實用的。

書本的原始碼都在 https://github.com/pro-vagrant

裏面提到的 atlas.hashicorp.com ,現在 Hashicorp 已經不再繼續,並且在 2018/6/27 之後,hashicorp 把 vagrant boxes 都搬到  https://app.vagrantup.com 了,Ubuntu 的 box 都在 https://app.vagrantup.com/ubuntu

作者的網站 http://boxes.gajdaw.pl 也已經消失了。

幾個有用的 plugin:

另外就是知道有 vagrant share 跟 vagrant connect 這兩個子指令,vagrant share 可以讓 VM 有個對外的網址,對方或伙伴就可以用 vagrant connect 連上 VM 提供的服務,說真的,這兩個指令蠻讓我驚訝的。

chronograf 使用 gitlab oauth2 認証

去年11月在試 chronograf 1.3 使用 gitlab oauth2 來認証登入時,沒試出來,就去 chronograf github repository 那邊發了 issue ,後來4月左右出了 1.4,開發者有回應,請我再試試看,昨天終於試出來了,下面紀錄一下過程與設定。

  1. 首先去 gitlab admin 頁面 (我用的是 gitlab 8.13.6) 新增 application,在 callback url 填入”http://your_chronograf_server:8888/oauth/generic/callback”。新增以後,把 “applicatoin id” and “secret” 記下來,後面會拿來填入 chronograf 的 “–generic-client-id ” / “–generic-client-secret “。
  2. 在啟動 chronograf 時,帶入以下參數 (gitlab_server 與 chronograf_server 請自行替換):
    • –generic-auth-url=http://gitlab_server/oauth/authorize?redirect_uri=http%3A%2F%2Fchronograf_server%3A8888%2Foauth%2Fgeneric%2Fcallback&response_type=code
    • –generic-token-url=http://gitlab_server/oauth/token?redirect_uri=http%3A%2F%2Fchronograf_server%3A8888%2Foauth%2Fgeneric%2Fcallback&grant_type=authorization_code
    • –generic-scopes=api
    • –token-secret=mysupersecret
    • –generic-api-url=http://gitlab_server/api/v3/user
  3. 到 chronograf 頁面時,就會看到 “Login with Generic”,點選按鈕,瀏覽器會帶到 gitlab 的登入頁面,在登入以後,會再帶回到 chronograf purgatory 頁面。

到這邊就算是成功了。但是我還沒去試怎麼去給予權限,讓使用者不要只能停留在 purgatory 頁面。

docker-gitlab 與 container registry

之前有試了兩三次,但都卡在憑證部份,昨天終於搞定了。

主要參考文件是 https://github.com/sameersbn/docker-gitlab/blob/master/docs/container_registry.md

第一步是產生憑證,不要用上面文章提供的 openssl 指令,用 https://gitlab.com/gitlab-org/gitlab-ce/issues/25967 所提供的:

# 假定是在 docker-compose.yml 所在的目錄下
mkdir -p certs
cd certs
openssl req -nodes -newkey rsa:4096 -keyout registry-auth.key -out registry-auth.csr -subj "/CN=gitlab-issuer"
openssl x509 -in registry-auth.csr -out registry-auth.crt -req -signkey registry-auth.key -days 3650

第二步是修改、調整原有的 docker-compose.yml

# gitlab
gitlab:
  environments:
    # ... other environment variables
    # ...
    # Registry
    - GITLAB_REGISTRY_ENABLED=true
    - GITLAB_REGISTRY_HOST=registry.example.com
    - GITLAB_REGISTRY_PORT=443
    - GITLAB_REGISTRY_API_URL=http://registry:5000
    - GITLAB_REGISTRY_KEY_PATH=/certs/registry-auth.key
    - SSL_REGISTRY_KEY_PATH=/certs/registry-auth.key
    - SSL_REGISTRY_CERT_PATH=/certs/registry-auth.crt
  volumes:
    # ... other volumes
    # ...
    # 將前面建立的 certs 資料夾掛載到 /certs
    - ./certs:/certs
  links:
    # ... other service links
    # ...
    - registry
registry:
  image: registry:2.4.1
  expose:
    - "5000"
  ports:
    - "5000:5000"
  volumes:
    - /var/gitlab/shared/registry:/registry
    - ./certs:/certs
  environment:
    - REGISTRY_LOG_LEVEL=info
    - REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/registry
    - REGISTRY_AUTH_TOKEN_REALM=https://git.example.com/jwt/auth
    # 如果你用的 gitlab 設定為 relative url root,那就是
    # - REGISTRY_AUTH_TOKEN_REALM=https://example.com/git/jwt/auth
    - REGISTRY_AUTH_TOKEN_SERVICE=container_registry
    - REGISTRY_AUTH_TOKEN_ISSUER=gitlab-issuer
    - REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE=/certs/registry-auth.crt
    - REGISTRY_STORAGE_DELETE_ENABLED=true

第三步是改 Apache 或 Nginx 的設定,Nginx 的設定可以參考 https://github.com/sameersbn/docker-gitlab/blob/master/docs/container_registry.md

我用的是 Apache ,所以我是參考 https://gist.github.com/dkarlovi/5f6ab416aa882086c7305b004b590dd4 來做修改,改完記得重新啟動 Apache 或 Nginx。

修改完以後,執行 docker-compose up ,應該就沒問題了。

我遇過以下問題:

  1. 瀏覽 https://git.example.com/group1/project1/container_registry 時,出現 Internal server error:主要是 gitlab 環境變數裡的 GITLAB_REGISTRY_KEY_PATH、SSL_REGISTRY_KEY_PATH、SSL_REGISTRY_CERT_PATH 跟 registry 環境變數裡的 REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE 沒有設定好,當然其他的也有可能,儘可能都檢查一次。
  2. docker login 失敗:其實也是上面提的那幾個環境變數沒設定好。

檢討之前為什麼沒能架設好,原因如下:

  1. 對 SSL 憑證不了解:我的 git.example.com / registry.example.com 都使用 SSL 憑證,但又跟 registry-auth 的憑證搞混,總的來說,總共三個憑證,git.example.com 一個,registry.example.com 一個,registry-auth 一個。gitlab.example.com/registry.example.com 的憑證是給網頁伺服器(Apache/Nginx)使用,Apache/Nginx 設定裡要設定,然後 docker-compose.yml gitlab 服務裡只用到 gitlab.example.com 的憑證,要用 SSL_KEY_PATH, SSL_CERTIFICATE_PATH 跟 SSL_DHPARAM_PATH 這三個環境變數來設定。而 registry-auth 則是 gitlab 服務與 registry 服務作 token 認証用的,主要是 gitlab 環境變數裡的 GITLAB_REGISTRY_KEY_PATH、SSL_REGISTRY_KEY_PATH、SSL_REGISTRY_CERT_PATH 跟 registry 環境變數裡的 REGISTRY_AUTH_TOKEN_ROOTCERTBUNDLE。
  2. Apache 的 SSL 設定錯誤:SSLCertificateFile, SSLCertificateKeyFile, SSLCertificateChainFile 跟 SSLCACertificateFile 都要設定,我少設了 SSLCertificateChainFile,導致 registry 服務去問 gitlab 時,有憑證錯而有 HTTP request fail 的問題。

找 git repository commits 裡的特定字串

因為在目前的程式碼裡找不到特定的字串,但是之前應該有,可能被移掉了,所以想找找之前提交的程式碼有沒有特定的字串。

請 Google 大神幫忙了一下,在 StackOverflow 上找到答案:How to grep (search) committed code in the git history? – Stack Overflow ,原來用 git grep 搭配 git rev-list 就可以做到:

# 找全部
git grep <regexp> $(git rev-list --all)

# 只找特定目錄下的
git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util

在 javascript 裡將 dict/object 轉換為 xml

照一般的作法,會是用操作 DOM 的方式來產生出 XML,但這樣很繁瑣,找了好幾個函式庫,最後是找到 object-to-xml (Github網址),使用方法很簡單:

var objectToXML = require('object-to-xml');

var obj = { 
  '?xml version=\"1.0\" encoding=\"iso-8859-1\"?' : null,
  request : {
    '@' : {
      type : 'product',
      id : 12344556
    },
    '#' : {
      query : {
        vendor : 'redhat',
        name : 'linux'
      }
    }
  }
};

console.log(objectToXML(obj));
/*
<?xml version="1.0" encoding="iso-8859-1"?>
<request type="product" id="12344556">
  <query>
    <vendor>redhat</vendor>
    <name>linux</name>
  </query>
</request>
*/

在 ‘@’ 裡的,都是屬性,而在 ‘#’ 裡的則是子 element 。

在 typescript 裡,要用

import * as objectToXML from 'object-to-xml';

來匯入使用。

sqlite3 的 alter table

sqlite3 的 alter table 不能刪除 column 或是修改 column ,只能新增!!

是故,如果要修改或刪除,只能先將原來的 table 更名,然後重新建立,再使用 insert into + select 來插入。

語法示意如下:

BEGIN TRANSACTION;
CREATE TEMPORARY TABLE t1_backup(a,b);
INSERT INTO t1_backup SELECT a,b FROM t1;
DROP TABLE t1;
CREATE TABLE t1(a,b);
INSERT INTO t1 SELECT a,b FROM t1_backup;
DROP TABLE t1_backup;
COMMIT;

寫這篇,才想到 django migration 可能也因為這限制,所以當資料庫是 sqlite3 時,有刪除或更動 model 屬性時,並沒有真的更動資料表格。

Run ansible in gitlab runner

在 gitlab runner 裡想要執行 ansible playbook 進行佈署,幾個問題以及我的應對:

  1. ansible 的安裝:是可以自己加 ansible 的 package repository ,然後用 apt 安裝,但已經有好心人打包了裝好 ansible 的 docker image ,只要在 .gitlab-ci.yml 加入 image 設定即可:
    image: williamyeh/ansible:ubuntu14.04
  2. playbook 要放在哪裡?因為要直接在專案進行佈署,所以 playbook 也要放在專案裡,我在專案裡建立了一個 ansible 的目錄,把 playbook 放在這裡。
  3. 私密資料如何保存?gitlab 在專案設定裡提供了 variables,可以用來存放這些私密的資料,在 .gitlab-ci.yml 裡,只要用 $VAR_NAME 就可以使用這些變數。.gitlab-ci.yml 裡也可以自訂 variables ,但這些 variables 是進到 git repository 的,要視情況使用。
  4. Ansible 連到目的機器需要 SSH Key:這比較麻煩一點,好在 gitlab 有提供如何使用 SSH key 的文件,步驟很詳細,簡述如下:
    1. 在專案設定的 variables 裡新增有 SSH private key 的變數。
    2. 檢查 ssh-agent ,如果沒有就安裝 openssh-client
    3. 執行 ssh-agent
    4. 用 ssh-add 匯入第一個步驟所設定好的變數
    5. 在 ~/.ssh/config 裡加入不檢查 host key 的設定:
      Host *
          StrictHostKeyChecking no

參考資料: