2016年2月18日 星期四

[Linux] 使用 find -ctime 刪除指定時間區間的檔案 @ Ubuntu 14.04

find -ctime 指令非常方便,例如找時間大於七天的資料:

$ find /path -ctime +7

所以要刪除七天以上的資料,的確可以靠上述完成,但如果有備份程式掛了沒產出時,豈不是會刪光資料?所以又有一招可以找最新七天內的資料:

$ find /path -ctime -7

因此,我就把自動清空指令改成:先判斷備份程式是否正常,正常的話,則刪除某段時期的資料。

連續動作:

$ sh -c  'files=`find /data/jenkins-backup -maxdepth 1 -ctime -7 | wc -l` && test $files -gt 20 && find /data/jenkins-backup -ctime +7 -delete '

而這段意思就是在處理 Jenkins 自動備份機制,因為一天會備份多次,所以用 20 個當作七天內至少要有 20 筆備份資料,當備份資料有正常產出時,在刪除大於七天內的資料。而採用 sh -c 的方式是可以埋在 crontab 中來做事,包含指定 sudo -u user 來限制不小心砍錯資料。

AWS 筆記 - Godaddy 續約憑證 (HTTPS/SSL) 以及 Load Balancer 憑證更新方式

AWS ELB Certificate

購買了每兩年更新一次的憑證服務,然而,憑證更新的原理是所有機器的憑證都會替換掉的。所幸更新憑證時,新舊憑證都會共存的,而 Godaddy 給予 90 天的區間來處理。

官方文件:https://tw.godaddy.com/help/ssl-864
您需要執行幾個步驟後方能續約 SSL,續約操作視憑證類型及網站託管地點而定。 即使您的 SSL 是自動續約,您也需要套用續約積分,並透過帳戶完成續約請求。
您可以在 90 天續約窗口期內購買及套用 SSL 續約: 過期前 60 天至過期後 30 天內。
例如,若您的憑證在 6 月 15 日過期,則您必須在 4 月 15 日至 7 月 15 日間購買並套用續約積分。
在您購買續約積分或您的 SSL 自動續約後,您必須將積分套用至即將過期的 SSL,並完成續約請求。 倘 SSL 過期且您沒有在 90 天續約窗口期內完成續約請求,則之前正常的網站會出現錯誤訊息。
先走一輪 Godaddy 設定:
  1. 在 https://certs.godaddy.com/cert 挑選要續約的憑證,可以看有效日期 
  2. 檢視狀態
  3. 狀態: 續約憑證 -> 點擊後則是一些簡易流程、送單
  4. 接著就只需等待,大概10分鐘內,可以在 https://certs.godaddy.com/cert 看到有效日期被拉長了
  5. 進去檢視憑證,接著下載新的憑證資料(以 Apache 來說,內容物就 gd_bundle-g2-g1.crt 和 yourdomain.crt 兩個檔案)
接著 AWS ELB 的設定:
  1. 在 EC2 -> Load Balancers -> 挑選指定 ELB
  2. 切換至 Listeners 分頁 -> SSL Certificate -> 點選 Change 就可以上傳新的憑證資料
若有其他 ELB ,則直接 Change 到新設定的即可。

2016年2月11日 星期四

How Much Did They Pay You To Give Up On Your Dreams?


最近這一兩年,同儕不外乎追求著數字上的卓越,彼此分享的資訊大概都補足了台灣、大陸和美商的價碼,就是一張冷冰冰的薪資年資梯度表罷了,然而,這段影片就常常出現在我的耳邊:他們到底付了多少錢,讓你放棄夢想?

幾天前和學弟聊了幾句,有的夢想只剩下到國外掙更多的數字,有些人接近了資方,除了替自己的福利爭取時才會轉換勞方心態外,冰冷冷的心態還是沒啥兩樣。到底人是為了熱情工作呢?還是為了未來?還是,就單純的數字?就像玩世紀帝國,不斷地挖礦、搶礦,砍樹種田等,結果從頭到尾就只是數字一直爬昇著,接著就 Game Over 了?

想想未來,想想最初的那一刻吧 :) 這世上一定有更多有趣的事可以追隨的,想不起當年的夢想也沒關係,再找下一個夢想吧!新年快樂!

2016年1月28日 星期四

Nginx 支援多網域 Access-Control-Allow-Origin 設定方式

原先 Access-Control-Allow-Origin 只能支援一個指定網域或 "*" 的設定,想要支持多網域設定時,就來用一下 nginx 的變數吧!

set $access_control_allow_origin "www.changyy.org";
if ($http_host ~ ^(.*\.changyy\.org)$ ) {
set $access_control_allow_origin $1;
}
if ($http_referer ~ ^(https*\:\/\/.*\.changyy\.org)\/ ) {
set $access_control_allow_origin $1;
}
add_header Access-Control-Allow-Origin $access_control_allow_origin;
add_header Access-Control-Allow-Methods "GET, OPTIONS, POST, HEAD, DELETE, PUT";
add_header Access-Control-Allow-Headers "Authorization, X-Requested-With, Content-Type, Origin, Accept";
add_header Access-Control-Allow-Credentials "true";
add_header Access-Control-Max-Age: 86400;


如此一來,只要是 *.changyy.org 的都可以支援啦!同理就可以用在多網域得設置。

若需要支援不同網域以及非預設的 web port ,則要把規則改成:

set $access_control_allow_origin "www.changyy.org";
if ($http_host ~ ^(.*\.changyy\.org(:[0-9]+)*)$ ) {
set $access_control_allow_origin $1;
}
if ($http_referer ~ ^(https*\:\/\/.*\.changyy\.org(:[0-9]+)*)\/ ) {
set $access_control_allow_origin $1;
}

Ansible 筆記 - 解決 selectattr('field_name','equalto','field_value') - TemplateRuntimeError: no test named 'equalto' @ Ubuntu 14.04

最近又再調整 Ansible 的使用架構,想要更多的彈性,勢必就會碰到抽資料出來的問題,接著就會踩到想要用 Jinja2 裡的 test equalto 用法。

目前環境:

$ ansible --version
ansible 2.0.0.2
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides
$ pip show jinja2
---
Name: Jinja2
Version: 2.7.2
Location: /usr/lib/python2.7/dist-packages
Requires: markupsafe


而 equalto 的用法是 Jinja2 2.8 之後才支援的 Orz

只好硬解一下:

$ sudo pip install jinja2 --upgrade
$ pip show jinja2
---
Name: Jinja2
Version: 2.8
Location: /usr/local/lib/python2.7/dist-packages
Requires: MarkupSafe


接著,就沒事了 :P 來一個完整範例紀錄:


- hosts: localhost
  vars:
    rpm_list:
      - name: "my-service-package-1"
        install_dir: "/opt/my-service-package-1/"
      - name: "my-service-package-2"
        install_dir: "/opt/my-service-package-2/"

  task:
    - set_fact: x="{{rpm_list | selectattr('name','equalto','my-service-package-2') | map(attribute='install_dir') |list}}"
    - debug: var={{x}}


執行:

TASK [set_fact] ****************************************************************
ok: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "/opt/my-service-package-2/": "VARIABLE IS NOT DEFINED!"
}


---
更新:

$ cat echo.sh
#!/bin/sh
echo '{"all":["127.0.0.1"]}'

$ cat test.xml
---

- hosts: all 
  vars:
    rpm_list:
      - name: "my-service-package-1"
        install_dir: "/opt/my-service-package-1/"
      - name: "my-service-package-2"
        install_dir: "/opt/my-service-package-2/"
  tasks:
    - set_fact: x="{{rpm_list | selectattr('name','equalto','my-service-package-2') | map(attribute='install_dir') |list}}"
    - debug: var=x

$ ansible-playbook -i echo.sh test.xml 
PLAY [all] ***********************************************************************************************************************************************

TASK [Gathering Facts] ***********************************************************************************************************************************
ok: [127.0.0.1]

TASK [set_fact] ******************************************************************************************************************************************
ok: [127.0.0.1]

TASK [debug] *********************************************************************************************************************************************
ok: [127.0.0.1] => {
    "x": [

        "/opt/my-service-package-2/"
    ]
}

PLAY RECAP ***********************************************************************************************************************************************
127.0.0.1                  : ok=3    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   


其他參考資料: