我們的伺服器由 Puppet 配置管理工具來管理,伺服器上線後由 puppet 完成初始化和配置等一系列工作(比如,靜態 IP 配置,DNS 設置,NFS/SAN 掛載,LDAP/Kerberos 登錄,安全加固配置,內核參數優化,防火牆規則配置等等),等初始化完成後開始運行,運行一段時間後會有一些需要自動和手動操作的任務(比如升級、重啟、 備份等),這時候我們使用 Fabric 來批量執行這些臨時任務。
所以從這裡可以看到 Puppet 和 Fabric 其實是兩個不同性質的工具,看下面的歸類可能會更清楚一些。Puppet 和 Fabric 兩個的工作其實可以由一個工具 SaltStack(或 AnsibleWorks)完成,減少一個工具的使用會減輕一點負擔(學習工具的人力成本、安裝和配置工具的時間成本等等)。
操作系統和軟體的安裝、配置、初始化等; (Puppet, Chef, CFEngine, AnsibleWorks, SaltStack) 自動執行任務,比如定期備份、清除日誌等; (Fabric, AnsibleWorks, SaltStack) 手動執行任務,比如部署應用、升級、重啟、檢查和校驗文件系統、增加用戶等。 (Fabric, Rake, AnsibleWorks, SaltStack) |
SaltStack 採用 zeromq 消息隊列進行通信,和 Puppet/Chef 比起來,SaltStack 速度快得多。還有一點我們喜歡 SaltStack 的地方是它是 Python 寫的,比 Puppet/Chef 這些 Ruby 工具更接近我們的能力圈。
安裝主控伺服器(salt master)
和大多數類似工具一樣,SaltStack 需要在一台機器(主控)上安裝伺服器端軟體(SaltStack 稱之為 salt master),在多台機器(受控)上安裝客戶端軟體(SaltStack 稱之為 salt minion)。在主控機器上給下屬(受控)發命令,在受控機器上接受和執行上級(主控)的命令。
在 Ubuntu 上安裝 salt master:
- $ sudo add-apt-repository ppa:saltstack/salt
- $ sudo apt-get update
- $ sudo apt-get install salt-master
在 CentOS 6.x 上安裝 salt master:
- # rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
- # yum update
- # yum install salt-master
安裝受控客戶端(salt minion)
在 Ubuntu 上安裝 salt minion:
- $ sudo add-apt-repository ppa:saltstack/salt
- $ sudo apt-get update
- $ sudo apt-get install salt-minion
在 CentOS 6.x 上安裝 salt minion:
- # rpm -Uvh http://ftp.linux.ncsu.edu/pub/epel/6/i386/epel-release-6-8.noarch.rpm
- # yum update
- # yum install salt-minion
安裝完 salt minion 後記得修改配置文件,讓 salt minion 指向 salt master 伺服器地址:
- $ sudo vi /etc/salt/minion
- ...
- # Set the location of the salt master server, if the master server cannot be
- # resolved, then the minion will fail to start.
- master: saltmaster.vpsee.com
- ...
- $ sudo restart salt-minion
在 master 上執行 salt-key list 就會看到有個 minion1.vpsee.com 請求加入受控,執行 -a 接受請求后,主控和受控之間的信任關係就建立起來了,主控就可以任意 “擺布” 受控了:
- # salt-key list
- Accepted Keys:
- Unaccepted Keys:
- minion1.vpsee.com
- Rejected Keys:
- # salt-key -a minion1.vpsee.com
- The following keys are going to be accepted:
- Unaccepted Keys:
- minion1.vpsee.com
- Proceed? [n/Y]
執行命令的例子
在主控機器上執行一個命令,讓所有受控機器執行 hostname 命令:
- # salt '*' cmd.run "hostname"
- minion1.vpsee.com:
- minion1.vpsee.com
在主控機器上執行一個命令,讓所有受控機器上執行內建 test.ping 命令:
- # salt '*' test.ping
- minion1.vpsee.com:
- True
還有一些內建命令可以嘗試:
- # salt '*' disk.usage
- # salt '*' network.interfaces
執行狀態的例子
開頭的時候我們說了 SaltStack = Fabric + Puppet,上面 “執行命令的例子” 演示了 Fabric 類似的功能,這裡要演示的是 Puppet 類似的功能,在主控上定義好系統配置應該有的狀態,然後受控自動完成相應的操作和配置。
首先確定狀態定義的文件應該放在什麼地方,以下操作都在主控(salt master)上執行。檢查 /etc/salt/master 文件的 file_roots 條目,默認是在 /srv/salt 下,如果沒有這個目錄還需要手動創建一個:
- # vi /etc/salt/master
- ...
- #file_roots:
- # base:
- # - /srv/salt
- ...
- # mkdir /srv/salt
比如我們想在所有受控機器上安裝 vim 軟體包,並使用自己定義的 vimrc 文件:
- # vi /srv/salt/vim.sls
- vim:
- pkg.installed
- /etc/vimrc:
- file.managed:
- - source: salt://vimrc
- - mode: 644
- - user: root
- - group: root
- # vi /srv/salt/vimrc
- syntax enable
- set textwidth=79
- set shiftwidth=4
- set tabstop=4
- set expandtab
- set softtabstop=4
- set shiftround
- set fileencodings=utf-8
- set encoding=utf8
- set tenc=utf8
強制執行這個狀態:
- # salt '*' state.sls vim
再來一個例子,參考 “安裝和使用系統監控工具 Glances” 一文,我們想在所有受控機器上安裝 Glances,如何實現呢?
- # vi /srv/salt/glances.sls
- python-pip:
- pkg.installed
- build-essential:
- pkg.installed
- python-dev:
- pkg.installed
- glances:
- pip.installed:
- - require:
- - pkg: python-pip
強制執行這個狀態:
- # salt '*' state.sls glances
- ...
- minion1.vpsee.com:
- ----------
- State: - pip
- Name: glances
- Function: installed
- Result: True
- Comment: Package was successfully installed
- Changes: Glances==1.7.1: Installed
- ...
[火星人 ] 系統自動化配置和管理工具:SaltStack已經有1450次圍觀