python第三方庫系列之二十--批量機器配置管理庫SaltStack

        我們的服務器由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, Func, Rundeck, AnsibleWorks, SaltStack, …)

        SaltStack採用zeromq消息隊列進行通信,和Puppet/Chef比起來,SaltStack速度快得多。還有一點我們喜歡SaltStack的地方是它是Python寫的,比Puppet/Chef這些Ruby工具更接近我們的能力圈。

一、安裝主控服務器(salt master)
和大多數類似工具一樣,SaltStack需要在一臺機器(主控)上安裝服務器端軟件(SaltStack稱之爲salt master),在多臺機器(受控)上安裝客戶端軟件(SaltStack稱之爲salt minion)。在主控機器上給下屬(受控)發命令,在受控機器上接受和執行上級(主控)的命令。
(1.1)在Ubuntu上安裝salt master:
$ sudo add-apt-repository ppa:saltstack/salt
$ sudo apt-get update
$ sudo apt-get install salt-master
(1.2)在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)
(1.1)在Ubuntu上安裝salt minion:
$ sudo add-apt-repository ppa:saltstack/salt
$ sudo apt-get update
$ sudo apt-get install salt-minion
(1.2)在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
(2)安裝完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
...
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章