Saltstack實戰之自動安裝部署MooseFS

幾年前本身只會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。

相關文章
相關標籤/搜索