自動化運維已經是必不可少的一環(huán)练湿,經歷過生產上各種版本問題,簡單是痛心疾首涌庭,忍不住拿此開刀芥被,希望借此幫助提升國人的技術實力。
編寫此文獻給今天30歲的自己坐榆。
自動化運維包含兩部分:自動化構建跟自動化部署拴魄。
常用的工具是大家耳熟能詳?shù)豭enkins跟docker,但是不好用,不簡單匹中,不牛逼蚀狰!
此篇講解實例 函數(shù)式自動化部署elk方案,將在下期講解函數(shù)式自動化構建spring boot方案职员。
自動化部署這里介紹的工具是nixops:?https://nixos.org/nixops/manual/
這里的核心不是介紹工具,所以我們從底層講解跛溉,后期會專門介紹nixops之大殺器焊切。
自動化部署需要載體,所以產生了不同的隔離級別芳室。
nixops支持三種隔離級別:
1. 環(huán)境隔離(nix-env)
2. 進程隔離(nix-container)
3. 資源隔離(nixos virtualbox)
大家常見的docker就是進程隔離专肪, 虛擬機就是資源隔離。
有了函數(shù)式運維堪侯,我們所需要的隔離90%以上只需要nix-env環(huán)境隔離就可以解決嚎尤,甚至nix-container的進程隔離也是完全不需要虛擬化的,簡單強大伍宦。
nix-container將在后續(xù)nixops使用篇介紹.
不得不說芽死,docker老矣。大家要問次洼,如日中天的docker有哪些不好关贵??
第一: 部署友好度。
你覺得用root裝軟件是個很安全的操作嗎卖毁?
但是nix-env不一樣揖曾,只需建個目錄便于所有用戶共享即可
第二: 資源利用率
我就簡單的部署個jar包,就得啟動虛擬化技術亥啦,損耗實在太大了點炭剪,性能也是極大的浪費。
但是nix-env不一樣翔脱,通過環(huán)境隔離奴拦,與系統(tǒng)無縫集成
?第三: 資源透明度
如果在一臺機器上安裝相同的多個節(jié)點服務,這里就涉及復雜的端口映射届吁,甚至locahost跟主機都是調試一大障礙粱坤。
但是nix-env不一樣,直接原生應用開干瓷产,簡單強大站玄,不需要那么復雜
第四: 版本管理
docker的強項不就是版本管理么?NO濒旦!如果1.0代碼改動一小點株旷,它還是1.0,還是1.0。晾剖。锉矢。
但是nix-env不一樣,它對所有內容進行sha計算齿尽,輕松智能多版本沽损,函數(shù)式就是不可變,1.0也能多版本
第五:依賴管理
如果一個系統(tǒng)庫不提供二進制版本循头,那么需要自己構建绵估。
如果在docker中構建,需要額外的一整套構建環(huán)境
如果不在docker中構建卡骂,系統(tǒng)的庫依賴哪些是docker需要的呢?
有了函數(shù)式運維nix国裳,所有的軟件都是包含了依賴關系,并且構建與部署分離全跨。
第六: 學習門檻
學習docker需要學習專有的語法缝左,雖然不是很難。調試也極其困難浓若。
nix-env僅僅只是一個命令行工具渺杉,輕輕松松解決問題。
忍不住 來一句挪钓,世界本不應該如此復雜少办。。诵原。?
現(xiàn)實中的自動化部署常用的問題有哪些?
第一:? 需要配置大量主從服務端英妓,嚴重侵入系統(tǒng)。已知的有puppet, cloudera manager绍赛。
第二: 不支持離線功能蔓纠。已知的有ansible/salt需要安裝大量的python包才可以使用,離線之傷痛吗蚌!?
第三: 要學習特有的各種模塊及技術腿倚。由于不是函數(shù)式,要處理復雜度蚯妇,確實不能怪它們敷燎。
什么是函數(shù)式運維?
?在函數(shù)式運維的體系里面箩言,軟件包即值硬贯,配置即狀態(tài)。軟件包是不可變的陨收,稍弱改動軟件包之后產生了一個新的軟件包饭豹。
?那么函數(shù)式運維有啥好處呢鸵赖?
由于軟件包無狀態(tài),配置即狀態(tài) 拄衰,所以很輕松建立了配置驅動編程的體系它褪。對于配置,加上嚴格的版本控制翘悉,自然就有了代碼即文檔的效果茫打。由于軟件包即值,配置多版本管理妖混,從一個環(huán)境傳遞到另一個環(huán)境是那么自然 老赤。對于軟件的多版本,即是不同的值那么簡單源葫。由于函數(shù)式的不可變,中間過程相同輸入產生的輸入只用處理一次砖瞧,后續(xù)可復用息堂。如果服務器直接提供二進制構建,即不需要源碼構建進行軟件包安裝块促,否則重新編譯一次后續(xù)復用荣堰,大大提高構建效率。
開始今天的正題: 一鍵搞定elk函數(shù)式部署
1.?部署方案簡單設計(抽象大于實現(xiàn))?
2.?部署方案運行過程(好東西就是玩)
3. 部署方案代碼分析(github源碼精彩講解)
部署方案簡單設計 :
我經常說抽象大于實現(xiàn)竭翠。很多人不明白振坚。大家都笑話我說不寫代碼,光靠腦袋想么斋扰?
抽象大于實現(xiàn)的意義大于渡八,使程序具有美感,非常自然传货,讓人一眼就能明白屎鳍。
這里就以抽象大于實現(xiàn)的思想來思考問題。
為了達到離線部署功能问裕,我們將部署分解成三部分:打包逮壁,部署,啟動粮宛。
打完包之后窥淆,可以離線拷貝到其它機器上進行一鍵部署后啟動。
所有我們的代碼分為elk.package.sh, elk.deploy.sh, elk.start.sh
1. elk.package.sh: 打包是自動化的巍杈,從構建服務器自動同步打包??
nix-channel --add https://nixos.org/channels/nixpkgs-unstable
nix-channel --update
2. elk.deploy.sh: 部署是可以離線的忧饭,并且完全零配置?
3. elk.start.sh啟動是可以遠程調試及傳參的,并且支持同一機器多節(jié)點服務?
一下子就輕松搞定了筷畦。那么需要多少行代碼呢眷昆?不到200行。
?
部署方案運行過程 :
項目源碼: https://github.com/clojurians-org/my-env
部署腳本: run.sh.d/elk-example/{createvm.sh, package.sh, deploy.sh, start.sh}
第0步: 環(huán)境準備
第1步:? 安裝三臺虛擬機(可選)-createvm.sh
第2步: 打包elk依賴-package.sh
第3步: 部署elk組件-deploy.sh
第4步: 啟動elk服務-start.sh
第0步: 環(huán)境準備??
;; 沒有安裝nix的請自行安裝:?https://nixos.wiki/wiki/Nix_Installation_Guide
a. 安裝git
b. 同步代碼
第1步:? 安裝三臺虛擬機? (可選,如已有機器集群可跳過)
創(chuàng)建三臺虛擬機
[larluo@larluo-nixos:~/my-env]$ cat run.sh.d/elk-example/createvm.sh
set -e
my=$(cd -P -- "$(dirname -- "${BASH_SOURCE-$0}")" > /dev/null && pwd -P) && cd $my/../..
echo -e "\n==== bash nix.sh create-vm nixos-elk-001" && bash nix.sh create-vm nixos-elk-001
echo -e "\n==== bash nix.sh create-vm nixos-elk-002" && bash nix.sh create-vm nixos-elk-002
echo -e "\n==== bash nix.sh create-vm nixos-elk-003" && bash nix.sh create-vm nixos-elk-003
第2步: 打包elk?
添加函數(shù)式自動化構建channel:
同步下載軟件包(配置文件同名時亚斋,以elasticsearch優(yōu)先級最高作媚,后續(xù)優(yōu)化)
[larluo@larluo-nixos:~/my-env]$ cat run.sh.d/elk-example/package.sh
set -e
my=$(cd -P -- "$(dirname -- "${BASH_SOURCE-$0}")" > /dev/null && pwd -P) && cd $my/../..
echo -e "\n==== bash nix.sh export nix.gettext-0.19.8.1" && bash nix.sh export nix.gettext-0.19.8.1
echo -e "\n==== bash nix.sh export nix.elasticsearch-6.2.4" && bash nix.sh export nix.elasticsearch-6.2.4
nix-env --set-flag priority 0 elasticsearch-6.2.4
echo -e "\n==== bash nix.sh export nix.logstash-6.2.4" && bash nix.sh export nix.logstash-6.2.4
echo -e "\n==== bash nix.sh export nix.kibana-6.2.4" && bash nix.sh export nix.kibana-6.2.4
第3步: 部署elk?
部署至遠程服務器:
[larluo@larluo-nixos:~/my-env]$ cat run.sh.d/elk-example/deploy.sh
my=$(cd -P -- "$(dirname -- "${BASH_SOURCE-$0}")" > /dev/null && pwd -P) && cd $my/../..
# create user op:op
echo -e "\n==== bash nix.sh create-user 192.168.56.101" && bash nix.sh create-user 192.168.56.101
echo -e "\n==== bash nix.sh create-user 192.168.56.102" && bash nix.sh create-user 192.168.56.102
echo -e "\n==== bash nix.sh create-user 192.168.56.103" && bash nix.sh create-user 192.168.56.103
# install nix
echo -e "\n==== bash nix.sh install 192.168.56.101 tgz.nix-2.0.4" && bash nix.sh install 192.168.56.101 tgz.nix-2.0.4
echo -e "\n==== bash nix.sh install 192.168.56.102 tgz.nix-2.0.4" && bash nix.sh install 192.168.56.102 tgz.nix-2.0.4
echo -e "\n==== bash nix.sh install 192.168.56.103 tgz.nix-2.0.4" && bash nix.sh install 192.168.56.103 tgz.nix-2.0.4
# install gettext for envsubst
echo -e "\n==== bash nix.sh install 192.168.56.101 nix.gettext-0.19.8.1" && bash nix.sh install 192.168.56.101 nix.gettext-0.19.8.1
echo -e "\n==== bash nix.sh install 192.168.56.102 nix.gettext-0.19.8.1" && bash nix.sh install 192.168.56.102 nix.gettext-0.19.8.1
echo -e "\n==== bash nix.sh install 192.168.56.103 nix.gettext-0.19.8.1" && bash nix.sh install 192.168.56.103 nix.gettext-0.19.8.1
# install elasticsearch
echo -e "\n==== bash nix.sh import 192.168.56.101 nix.elasticsearch-6.2.4" && bash nix.sh import 192.168.56.101 nix.elasticsearch-6.2.4
echo -e "\n==== bash nix.sh import 192.168.56.102 nix.elasticsearch-6.2.4" && bash nix.sh import 192.168.56.102 nix.elasticsearch-6.2.4
echo -e "\n==== bash nix.sh import 192.168.56.103 nix.elasticsearch-6.2.4" && bash nix.sh import 192.168.56.103 nix.elasticsearch-6.2.4
# install logstash
echo -e "\n==== bash nix.sh install 192.168.56.101 nix.logstash-6.2.4" && bash nix.sh install 192.168.56.101 nix.logstash-6.2.4
echo -e "\n==== bash nix.sh install 192.168.56.102 nix.logstash-6.2.4" && bash nix.sh install 192.168.56.102 nix.logstash-6.2.4
echo -e "\n==== bash nix.sh install 192.168.56.103 nix.logstash-6.2.4" && bash nix.sh install 192.168.56.103 nix.logstash-6.2.4
# instal kibana
echo -e "\n==== bash nix.sh import 192.168.56.101 nix.kibana-6.2.4" && bash nix.sh import 192.168.56.101 nix.kibana-6.2.4
echo -e "\n==== bash nix.sh import 192.168.56.102 nix.kibana-6.2.4" && bash nix.sh import 192.168.56.102 nix.kibana-6.2.4
echo -e "\n==== bash nix.sh import 192.168.56.103 nix.kibana-6.2.4" && bash nix.sh import 192.168.56.103 nix.kibana-6.2.4
選擇一臺機器進行檢查
第4步: 啟動elk
[larluo@larluo-nixos:~/my-env]$ cat run.sh.d/elk-example/start.sh
set -e
my=$(cd -P -- "$(dirname -- "${BASH_SOURCE-$0}")" > /dev/null && pwd -P) && cd $my/../..
# start elasticsearch-6.2.4
export ES_ALL="192.168.56.101:9200,192.168.56.102:9200,192.168.56.103:9200"
echo -e "\n==== bash nix.sh start 192.168.56.101:9200 elasticsearch-6.2.4 --all ${ES_ALL} --cluster.id monitor"
??????????????? bash nix.sh start 192.168.56.101:9200 elasticsearch-6.2.4 --all ${ES_ALL} --cluster.id monitor
echo -e "\n==== bash nix.sh start 192.168.56.102:9200 elasticsearch-6.2.4 --all ${ES_ALL} --cluster.id monitor"
??????????????? bash nix.sh start 192.168.56.102:9200 elasticsearch-6.2.4 --all ${ES_ALL} --cluster.id monitor
echo -e "\n==== bash nix.sh start 192.168.56.103:9200 elasticsearch-6.2.4 --all ${ES_ALL} --cluster.id monitor"
??????????????? bash nix.sh start 192.168.56.103:9200 elasticsearch-6.2.4 --all ${ES_ALL} --cluster.id monitor
# start kibana-6.2.4
echo -e "\n==== bash nix.sh start 192.168.56.101:5601 kibana-6.2.4 --elasticsearchs ${ES_ALL}" && bash nix.sh start 192.168.56.101:5601 kibana-6.2.4 --elasticsearchs ${ES_ALL}
echo -e "\n==== bash nix.sh start 192.168.56.102:5601 kibana-6.2.4 --elasticsearchs ${ES_ALL}" && bash nix.sh start 192.168.56.102:5601 kibana-6.2.4 --elasticsearchs ${ES_ALL}
echo -e "\n==== bash nix.sh start 192.168.56.103:5601 kibana-6.2.4 --elasticsearchs ${ES_ALL}" && bash nix.sh start 192.168.56.103:5601 kibana-6.2.4 --elasticsearchs ${ES_ALL}