Automate Django createsuperuser in Ansible

Ansible 有個 django_manage 模組,可以很方便的執行 django 裡的 manage.py,但是受限於 createsuperuser 的關係,並沒辦法在建立 superuser 的同時,一併設定密碼。

一般網路上的解決方法是自己寫個小 python 腳本 (可以看這篇 How to automate createsuperuser on django? ),丟給 shell 去執行。我是想到可以利用 manage.py 提供的 changepassword 並搭配 expect 來做,大致上是這樣子:

另外也做了避免重複建 superuser 的機制。

Ansible notify

notify 很方便,可以先不執行 task,等到都執行完了才執行 handler 裡的 task。

但我遇到明明有 notify ,handler 裡的 task 卻沒有執行到,試了很久,找了好久才知道,必須 task 的狀態有改變的時候才會 notify ,而 ansible 的每個 task 的狀態並不是都會改變的,例如 ansible 發現檔案跟要變更的一致就不會改變狀態。

如果要強制改變,可以加上 changed_when: true ,這樣在執行完 task 時,永遠都把狀態設定為改變,也就會 notify 了。

- name: Install nginx configuration
  template: src=nginx.conf.j2 dest=/etc/nginx/sites-enabled/default
  notify:
    - reload nginx
  changed_when: true

Swift 2.2

今天網路上除了 PHP 7 釋出的消息外,就是 Apple 開放 Swift 2.2 源碼的消息了。

上 Swift.org 看,現在已經可以安裝在 Ubuntu 上,就寫了一個簡單的腳本來安裝。

執行完會安裝到 /opt/swift-2.2 下,PATH 需要自己加。

中文的學習手冊可以看 The Swift Programming Language中文版

這篇則是知名開發者 zonble 的心得分享,但要注意的是,這篇心得分享文是在 Swift 剛剛推出的時候所寫的,與現在可能有不小的差距:Swift

關於接下來幾個月的變化可以參考 Apple 釋出的計劃表:https://github.com/apple/swift-evolution

Github ATOM

Github 推的編輯工具,還蠻好用,跟 Sublime Text 比起來,至少可以打中文… XD

安裝相當簡單,到 ATOM 網站,下載對應的安裝檔案安裝就可以了,我是用 Ubuntu,下載 .deb 用 dpkg -i 安裝就可以了。

安裝以後,需要調校一下,因為字型的關係,中文會顯示不出來。設定可以參考下面來進行調整:

不過說真的,我不是很常用這個,大部份還是用 vim。這兩天再拿出來用,才發現多了一個 apm 的指令,顧名思義就是管理 ATOM packages 用的,像是安裝、反安裝或更新等等,都可以透過這個指令進行。

不過,要檢查 ATOM 更新的話,就比較麻煩了,還好有 package 可以幫忙做這件事情,我是用 atom-update 這個 package。

補充:參考這篇 Atom 使用心得與 Package 推薦 跟根據自己需求,裝了一些 packages/themes:

  • atom-beautify
  • atom-hexo
  • atom-material-syntax
  • atom-material-ui
  • atom-update
  • autocomplete-python
  • color-picker
  • ex-mode
  • file-icons
  • git-blame
  • git-log
  • git-plus
  • highlight-selected
  • indent-helper
  • linter
  • linter-flake8
  • markdown-preview-plus
  • markdown-toc
  • merge-conflicts
  • minimap
  • project-manager
  • recent-projects
  • vim-mode

Migrate ghost to hexo

Hexo 是一個快速、簡單且強大的網誌框架,Ghost 是一個用 javascript 寫的 Blog 平台。

我在公司有用 Ghost 架一個小小的 Blog ,紀錄一些事情,後來想把 Ghost 搬到 Raspberry PI 上,但是 Raspberry PI 的效能不是很好,就轉念改用 Hexo。Raspberry PI 只架設單純的 Web server,桌機用 Hexo,在產生完網頁之後,再 Deploy 到 Raspberry PI 上。

要搬家基本上不難,Hexo 這邊先安裝 hexo-migrator-ghost,然後依照說明,先到 Ghost 那邊 (http://yourblog.com/ghost/debug/) 匯出資料,然後回到 Hexo ,用 hexo migrate ghost exported_json 匯入剛剛在 ghost 匯出的檔案就可以了。

圖片的話,要自己處理,最快的方法是複製 your_ghost_folder/content/images 到 your_hexo_folder/source/images ,然後將文章裡圖片路徑的 /content 移掉就可以了。

Hexo 在處理文章圖片上有更好的方式,可以參考這篇文章:Asset Folders ,在 _config.yml 裡啟用 post_asset_folder: true 以後,在建立新文章時,hexo 會自動建立以文章標題為名的資料夾,把圖片放到該資料夾下面,然後引用就可以了。這樣做比大堆頭的擺在 source/images 下自己管理來的好。

gitlab 的備份檔

gitlab 的備份是一個 tar 檔案,用 tar xf 解開以後,會依照你 gitlab 裡的 user/group 區分目錄,解開以後,會發現裏面又是一堆 .bundle 檔案。

.bundle 該怎麼解開呢?其實它也是一個 tar 檔案,用 tar tf 就可以看到內容,所以如果要還原的話,就先建一個目錄,再切到該目錄下解開就可以了。

Zabbix discoverer processes more than 75% busy

在公司 Zabbix dashboard 上看到這訊息,但明明 CPU 就沒飆到那麼高,後來去 google 了一下,主要是參考這兩篇:

文章裡提到的訊息有點差異,不過都是改 /etc/zabbix/zabbix_server.conf 裡的 StartXXXX 設定,將數值調高即可。例如 discoverer 就調高 StartDiscoverers 的數值,ping 就調高 StartPingers 的數值,以此類推。

改完,重新啟動即可,Zabbix Dashboard 上應該就看不到這訊息了。

P.S. 好像應該來開個 「IT 日常」的分類?!

pyenv: no such command `virtualenv-init’

最近開 terminal 時,都會看到這樣的錯:

pyenv: no such command `virtualenv-init’

今天終於想要解決這問題了,找了一下,源頭是在 oh-my-zsh 的 virtualenv plugin 裡,裏面用了 eval “$(pyenv virtualenv-init – zsh)” ,循線追到 pyenv,發現是 pyenv 沒有 pyenv-virtualenv plugin 的關係。

依照 yyuu/pyenv-virtualenv 上的說明,執行以下指令,就解決問題了。

git clone https://github.com/yyuu/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv

最後,順道更新 pyenv :cd ~/.pyenv && git pull –rebase origin master

OpenKM

同事找到這篇介紹 OpenKM 的文章:開源OpenKM文管系統 立即打造知識管理平台

想說就裝起來試試看好了,看到有人用 docker 搭起來,就照著做囉:使用docker在centos6.5上部署openkm详细过程

不過這篇文做法的缺點是,把原本的 /usr/local/tomcat 都移到 volume 裡去,這就等於是程式都放到外面去了。或許應該參考原本 mcsaky/openkm 的 Dockerfile 與 OpenKM Installation ,再來改寫 Dockerfile 會比較好一點。

反正只是先試試看,所以我也沒有用 nginx 擋在前面,直接用 tomcat ,就先這樣用吧~ 有需要的時候,再來研究看怎麼改寫。

vagrant 的後繼者 – otto

主要是看入門指南跟摸索後的筆記。

執行 otto compile 以後,會自動依據所在的目錄去猜測是哪種語言開發的,並且產生以下目錄跟檔案:

  • .otto/
  • .ottoid

.ottoid 應該要加入到版本控制系統裡,這檔案如果被刪除可能會出錯;.otto 目錄下則是放產生出來的檔案:

  • appfile 資料夾裡只有  Appfile.compiled 跟 version 兩個檔案,Appfile.compiled 的格式看起來是 json ,我猜是給 otto 使用的。
  • data
    • 只有 dev_ip 檔案,是放開發環境的 IP 資訊,建議不要編輯
  • compiled
    • infra-xxxxx 資料夾裡的檔案是 terraform 的設定檔,建議不要編輯
    • app
      • build
        • build-node.sh 看起來是建置環境用的腳本,裏面會依據你專案類型去安裝必要的套件,例如 nginx、nodejs runtime、python 等等。
        • template.json 是 packer 用的 template 檔案,裏面就呼叫了 build-node.sh 去安裝必要的套件。
      • deploy
        • main.tf 是 terraform 的設定檔
      • dev
        • Vagrantfile 就開發環境用的 Vagrantfile,這裏面 private_network 的 IP 跟 .otto/data/dev_ip 是一樣的。
      • foundation-consul
        • app-build 資料夾裡放的是 upstart.conf (upstart script) 跟 main.sh 。main.sh 裡自動下載並安裝 consul ,然後產生 consul service description 。除了 consul ,也設置了 dnsmasq。
        • app-deploy 資料夾裡只有 main.sh,就簡單的啟動 consul 服務。
        • app-dev 資料夾裡跟 app-build 一樣有兩個檔案,但 main.sh 裡啟動的 consul 服務是 bootstrap server。這邊的檔案會配置到開發環境裡。
        • app-dev-dep 資料夾裡只有 main.sh ,只有產生 consul service description 跟重新載入 consul 服務。
        • deploy 資料夾裡是 terraform 的設定檔,主要檔案是 main.tf,先不多著墨。main.tf 裡用到的變數則是定義在 variables.tf,看起來這裡是要特別設定的地方。

看起來照預設設定是佈署到 Amazon VPC 上。

執行 otto dev 以後,會開始下載 vagrant box ,這時間有點久,等下載完成會設置開發環境。等到完成以後,使用 otto dev ssh 就可以登入,/otto/foundation-1/ 下可以看到 main.sh ,這些檔案的原始檔是在 .otto/compiled/app/foundation-consul/app-dev 下。

執行你的 web application 以後,開另外一個 terminal,執行 otto dev address 可以看到 IP,接著就可以到瀏覽器輸入 IP:port 看到畫面了。

用 otto infra 就會在 Amazon 上建立 infrastructure。infra 看起來主要是配置 VPC 裡的 gateway、subnet、routing 與資源等等。(目前只支援 AWS)

用 otto build 是會建立 Amazon image ,最後就是用 otto deploy 佈署上去。

在 infra, build, deploy 時,都會問 AWS 的資訊,在問了以後,otto 會存到加密過的檔案裡。如果不想 otto 問這些,也可以預先設置好這些環境變數:AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY, AWS_SSH_PUBLIC_KEY_PATH

一般來說,otto 會自動猜測,使用猜出來的 Appfile,也可以自己手寫 Appfile (完整的 Appfile 說明)。如果有使用到相依的服務,也可以在 Appfile 裡寫 https://ottoproject.io/intro/getting-started/deps.html

otto dev destroy 是清除掉開發環境,otto infra destroy 跟 otto deploy destroy 則是清理 Amazon 上的機器。