幾年前本身只會Shell腳本,在服務器很少的時候,感受還忙的過來,到後來服務器愈來愈多的時候就不行了。寫了不少的腳本放到計劃任務中按期執行,能解決一部分工做,但效率仍是很低下,由於服務器太多了,每次腳本有變更就須要在全部服務器上都更新一遍,很是痛苦,後來我學會了用expect來處理交互,但效率依然很低下,等腳本自動登陸完全部的機器並執行完相關命令,至少30分鐘過去了。
html
而後,我加入了一些技術羣,瞭解到了像Func,Puppet以及Chef這樣的工具,並試着使用它們來管理服務器,效果然的很好。node
就在幾個星期之前,在Puppet羣裏面,我聽到了Salt這個詞,「綠肥」每天在羣裏「拉客」,號稱是Func+Puppet,用Python實現的,因爲我對Python頗有好感,也還算有點基礎,因而就試着用了用Salt。linux
學一個東西最快的方法就是用它去解決現有的實際問題,我選擇了使用Salt來自動安裝部署一套MooseFS分佈式文件系統,結果,我花了1天的時間就完成了整個工做,同時對Salt好感也超越了Puppet,說實話,我如今很是願意將線上全部Puppet相關的代碼都用Salt來重寫一遍,其中包括整個Hadoop集羣的自動部署。git
好了,廢話很少說,下面開始講解整個實戰過程!github
Salt其實也僅僅只是一個工具,解決問題的關鍵是咱們的思路,正好比我可以用Salt來實現自動安裝部署MooseFS,那麼前提確定是我瞭解手動安裝部署MooseFS的整個過程。所以,建議你們先閱讀個人《在CentOS上安裝部署MooseFS分佈式文件系統》http://heylinux.com/archives/2467.html 這篇文章,瞭解如何經過手動的方式來安裝部署MooseFS。服務器
接下來,咱們首先要對Salt的基礎進行一系列的學習,這裏,我強烈推薦官網的Tutorial:http://docs.saltstack.com/topics/tutorials/walkthrough.html 在完成了整個Tutorial以後,經過Module Index頁面,咱們可以快速查閱Salt全部模塊的功能與用法:http://docs.saltstack.com/py-modindex.htmlless
個人整個Salt代碼結構以下:分佈式
$ treeide
.工具
├── pillar
│ ├── moosefs
│ │ └── params.sls
│ ├── _salt
│ │ └── params.sls
│ ├── schedules
│ │ └── params.sls
│ ├── top.sls
│ └── users
│ └── lists.sls
├── README.md
├── salt
│ ├── moosefs
│ │ ├── files
│ │ │ └── index.html
│ │ ├── states
│ │ │ ├── chunkserver.sls
│ │ │ ├── client.sls
│ │ │ ├── common.sls
│ │ │ ├── master.sls
│ │ │ └── metalogger.sls
│ │ └── templates
│ │ ├── httpd.conf
│ │ ├── mfschunkserver.cfg
│ │ ├── mfsexports.cfg
│ │ ├── mfshdd.cfg
│ │ ├── mfsmaster.cfg
│ │ └── mfsmetalogger.cfg
│ ├── _roles
│ │ ├── backup.sls
│ │ ├── datanode.sls
│ │ └── master.sls
│ ├── _salt
│ │ ├── states
│ │ │ └── minion.sls
│ │ └── templates
│ │ └── minion
│ ├── top.sls
│ └── users
│ └── states
│ └── create.sls
└── tools
├── install_salt_minion.sh
└── tips.txt
Salt的默認配置須要存放在/srv下,在/srv/pillar中主要存放的是各種「參數」,而在/srv/salt下存放的是具體的state「代碼文件」,以及配置文件的「模板」。
Salt的入口文件分別是/srv/pillar/top.sls 與 /srv/salt/top.sls,入口文件的意思就是,在minion「客戶端」上,每次請求服務端配置的時候,它們實際上所請求的是這兩個文件,雖然在上面有不少的文件,但其實它們都是經過這兩個文件所關聯起來的。
好比在/srv/pillar/top.sls文件的內容是:
base:
'*':
- _salt.params
- schedules.params
- moosefs.params
- users.lists
即針對全部的服務器('*'),引用_salt,schedules以及moosefs目錄下params.sls中的配置和users目錄下lists.sls的配置。
而/srv/salt/top.sls文件的內容是:
base:
'*':
- _salt.states.minion
- users.states.create
'ip-10-197-29-251.us-west-1.compute.internal':
- _roles.master
- _roles.datanode
'ip-10-196-9-188.us-west-1.compute.internal':
- _roles.backup
- _roles.datanode
'ip-10-197-62-239.us-west-1.compute.internal':
- _roles.datanode
即針對全部的服務器('*'),引用_salt/states目錄下minion.sls中的配置,以及users/states目錄下create.sls中的配置;針對服務器ip-10-197-29-251.us-west-1.compute.internal,引用_roles目錄下master.sls中的配置,其他兩個主機相似。
而_roles/master.sls文件的內容是:
include:
- moosefs.states.master
即引用 moosefs/states 目錄下 master.sls的配置,進一步查看 master.sls 的配置,就能夠看到以下內容:
include:
- moosefs.states.common
mfsmaster:
service:
- running
- require:
- cmd.run: mfsmaster
cmd.run:
- name: 'cp metadata.mfs.empty metadata.mfs'
- cwd: /var/mfs/
- user: daemon
- unless: 'test -e metadata.mfs.back'
- require:
- file: /etc/mfs/mfsmaster.cfg
mfs-cgi:
pkg.installed:
- require:
- pkg: httpd
...
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://moosefs/templates/httpd.conf
- template: jinja
- user: root
- group: root
- mode: 644
- require:
- pkg: httpd
...
即具體的配置步驟,包括了mfsmaster的service啓動,初始化數據文件,修改httpd.conf配置文件等,而這一部分的具體配置,你們能夠在個人GitHub: https://github.com/mcsrainbow/HeyDevOps/tree/master/Salt
Salt默認的不少示例,目錄結構很是簡單,而我由於有「分類強迫症」,不喜歡將各種不一樣類型的文件放在同一個目錄下,因此我建立了states和files以及templates目錄來分別存放states,普通文件和配置文件。而建立_roles目錄並在top.sls中引用,而不是經過直接引用moosefs.states.master這種方式,緣由是我手裏的服務器全是EC2上的雲主機,主機名默認已經固定了,不方便自定義的規劃,所以我在_roles目錄下根據自身須要,根據線上服務器的角色建立了一些文件,在這些文件中再去引用相關的配置,這樣,從此每臺服務器就須要綁定好它對應的角色就能夠了,更新_roles目錄下的文件就能夠更新全部對應的服務器。
固然,這些都是我實際環境中遇到的問題,也是我所構思出來的解決方法,我在本文中着重講解了個人思路,以及Salt的工做流程,是由於我發如今我學習的過程當中,它們給我帶來的困擾和疑惑是最大的。具體的states實現,你們能夠經過我在GitHub。