通過 SaltStack 管理伺服器配置
![](https://linuxstory.org/wp-content/uploads/2024/06/234425me50754gj7lc8fgw-800x400.png)
我在搜索Puppet的替代品時,偶然間碰到了Salt。我喜歡puppet,但是我又愛上Salt了:)。我發現Salt在配置和使用上都要比Puppet簡單,當然這只是一家之言,你大可不必介懷。另外一個愛上Salt的理由是,它可以讓你從命令行管理伺服器配置,比如:
要通過Salt來更新所有伺服器,你只需運行以下命令即可
salt '*' pkg.upgrade
安裝SaltStack到Linux上
如果你是在CentOS 6/7上安裝的話,那麼Salt可以通過EPEL倉庫獲取到。而對於Pi和Ubuntu Linux用戶,你可以從這裡添加Salt倉庫。Salt是基於python的,所以你也可以使用『pip』來安裝,但是你得用yum-utils或是其它包管理器來自己處理它的依賴關係。
Salt採用伺服器-客戶端模式,伺服器端稱為領主,而客戶端則稱為下屬。
安裝並配置Salt領主
[root@salt-master~]# yum install salt-master
Salt配置文件位於/etc/salt和/srv/salt。Salt雖然可以開箱即用,但我還是建議你將日誌配置得更詳細點,以方便日後排除故障。
[root@salt-master ~]# vim /etc/salt/master
# 默認是warning,修改如下
log_level: debug
log_level_logfile: debug
[root@salt-master ~]# systemctl start salt-master
安裝並配置Salt下屬
[root@salt-minion~]#yum install salt-minion
# 添加你的Salt領主的主機名
[root@salt-minion~]#vim /etc/salt/minion
master: salt-master.com
# 啟動下屬
[root@salt-minion~] systemctl start salt-minion
在啟動時,下屬客戶機會生成一個密鑰和一個id。然後,它會連接到Salt領主伺服器並驗證自己的身份。Salt領主伺服器在允許下屬客戶機下載配置之前,必須接受下屬的密鑰。
在Salt領主伺服器上列出並接受密鑰
# 列出所有密鑰
[root@salt-master~] salt-key -L
Accepted Keys:
Unaccepted Keys:
minion.com
Rejected Keys:
# 使用id 'minion.com'命令接受密鑰
[root@salt-master~]salt-key -a minion.com
[root@salt-master~] salt-key -L
Accepted Keys:
minion.com
Unaccepted Keys:
Rejected Keys:
在接受下屬客戶機的密鑰後,你可以使用『salt』命令來立即獲取信息。
Salt命令行實例
# 檢查下屬是否啟動並運行
[root@salt-master~] salt 'minion.com' test.ping
minion.com:
True
# 在下屬客戶機上運行shell命令
[root@salt-master~]# salt 'minion.com' cmd.run 'ls -l'
minion.com:
total 2988
-rw-r--r--. 1 root root 1024 Jul 31 08:24 1g.img
-rw-------. 1 root root 940 Jul 14 15:04 anaconda-ks.cfg
-rw-r--r--. 1 root root 1024 Aug 14 17:21 test
# 安裝/更新所有伺服器上的軟體
[root@salt-master ~]# salt '*' pkg.install git
salt命令需要一些組件來發送信息,其中之一是下屬客戶機的id,而另一個是下屬客戶機上要調用的函數。
在第一個實例中,我使用『test』模塊的『ping』函數來檢查系統是否啟動。該函數並不是真的實施一次ping,它僅僅是在下屬客戶機作出回應時返回『真』。
『cmd.run』用於執行遠程命令,而『pkg』模塊包含了包管理的函數。本文結尾提供了全部內建模塊的列表。
顆粒實例
Salt使用一個名為顆粒(Grains)的界面來獲取系統信息。你可以使用顆粒在指定屬性的系統上運行命令。
[root@vps4544 ~]# salt -G 'os:Centos' test.ping
minion:
True
更多顆粒實例,請訪問http://docs.saltstack.com/en/latest/topics/targeting/grains.html。
通過狀態文件系統進行包管理
為了使軟體配置自動化,你需要使用狀態系統,並創建狀態文件。這些文件使用YAML格式和python字典、列表、字元串以及編號來構成數據結構。將這些文件從頭到尾研讀一遍,這將有助於你更好地理解它的配置。
VIM狀態文件實例
[root@salt-master~]# vim /srv/salt/vim.sls
vim-enhanced:
pkg.installed
/etc/vimrc:
file.managed:
- source: salt://vimrc
- user: root
- group: root
- mode: 644
該文件的第一和第三行稱為狀態id,它們必須包含有需要管理的包或文件的確切名稱或路徑。在狀態id之後是狀態和函數聲明,『pkg』和『file』是狀態聲明,而『installed』和『managed』是函數聲明。函數接受參數,用戶、組、模式和源都是函數『managed』的參數。
要將該配置應用到下屬客戶端,請移動你的『vimrc』文件到『/src/salt』,然後運行以下命令。
[root@salt-master~]# salt 'minion.com' state.sls vim
minion.com:
------- ID: vim-enhanced
Function: pkg.installed
Result: True
Comment: The following packages were installed/updated: vim-enhanced.
Started: 09:36:23.438571
Duration: 94045.954 ms
Changes:
------- vim-enhanced:
------- new:
7.4.160-1.el7
old:
Summary
---------Succeeded: 1 (changed=1)
Failed: 0
---------Total states run: 1
你也可以添加依賴關係到你的配置中。
[root@salt-master~]# vim /srv/salt/ssh.sls
openssh-server:
pkg.installed
/etc/ssh/sshd_config:
file.managed:
- user: root
- group: root
- mode: 600
- source: salt://ssh/sshd_config
sshd:
service.running:
- require:
- pkg: openssh-server
這裡的『require』聲明是必須的,它在『service』和『pkg』狀態之間創建依賴關係。該聲明將首先檢查包是否安裝,然後運行服務。
但是,我更偏向於使用『watch』聲明,因為它也可以檢查文件是否修改和重啟服務。
[root@salt-master~]# vim /srv/salt/ssh.sls
openssh-server:
pkg.installed
/etc/ssh/sshd_config:
file.managed:
- user: root
- group: root
- mode: 600
- source: salt://sshd_config
sshd:
service.running:
- watch:
- pkg: openssh-server
- file: /etc/ssh/sshd_config
[root@vps4544 ssh]# salt 'minion.com' state.sls ssh
seven.leog.in:
Changes:
------- ID: openssh-server
Function: pkg.installed
Result: True
Comment: Package openssh-server is already installed.
Started: 13:01:55.824367
Duration: 1.156 ms
Changes:
------- ID: /etc/ssh/sshd_config
Function: file.managed
Result: True
Comment: File /etc/ssh/sshd_config updated
Started: 13:01:55.825731
Duration: 334.539 ms
Changes:
------- diff:
+++
@@ -14,7 +14,7 @@
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
-Port 22
+Port 422
#AddressFamily any
#ListenAddress 0.0.0.0
#ListenAddress ::
------- ID: sshd
Function: service.running
Result: True
Comment: Service restarted
Started: 13:01:56.473121
Duration: 407.214 ms
Changes:
------- sshd:
True
Summary
---------Succeeded: 4 (changed=2)
Failed: 0
---------Total states run: 4
在單一目錄中維護所有的配置文件是一項複雜的大工程,因此,你可以創建子目錄並在其中添加配置文件init.sls文件。
[root@salt-master~]# mkdir /srv/salt/ssh
[root@salt-master~]# vim /srv/salt/ssh/init.sls
openssh-server:
pkg.installed
/etc/ssh/sshd_config:
file.managed:
- user: root
- group: root
- mode: 600
- source: salt://ssh/sshd_config
sshd:
service.running:
- watch:
- pkg: openssh-server
- file: /etc/ssh/sshd_config
[root@vps4544 ssh]# cp /etc/ssh/sshd_config /srv/salt/ssh/
[root@vps4544 ssh]# salt 'minion.com' state.sls ssh
Top文件和環境
top文件(top.sls)是用來定義你的環境的文件,它允許你映射下屬客戶機到包,默認環境是『base』。你需要定義在基本環境下,哪個包會被安裝到哪台伺服器。
如果對於一台特定的下屬客戶機而言,有多個環境,並且有多於一個的定義,那麼默認情況下,基本環境將取代其它環境。
要定義環境,你需要將它添加到領主配置文件的『file_roots』指針。
[root@salt-master ~]# vim /etc/salt/master
file_roots:
base:
- /srv/salt
dev:
- /srv/salt/dev
現在,添加一個top.sls文件到/src/salt。
[root@salt-master ~]# vim /srv/salt/top.sls
base:
'*':
- vim
'minion.com':
- ssh
應用top文件配置
[root@salt-master~]# salt '*' state.highstate
minion.com:
------- ID: vim-enhanced
Function: pkg.installed
Result: True
Comment: Package vim-enhanced is already installed.
Started: 13:10:55
Duration: 1678.779 ms
Changes:
------- ID: openssh-server
Function: pkg.installed
Result: True
Comment: Package openssh-server is already installed.
Started: 13:10:55.
Duration: 2.156 ms
下屬客戶機將下載top文件並搜索用於它的配置,領主伺服器也會將配置應用到所有下屬客戶機。
這僅僅是一個Salt的簡明教程,如果你想要深入學習並理解,你可以訪問下面的鏈接。如果你已經在使用Salt,那麼請告訴我你的建議和意見吧。
閱讀鏈接
- http://docs.saltstack.com/en/latest/ref/states/top.html#how-top-files-are-compiled
- http://docs.saltstack.com/en/latest/topics/tutorials/states_pt1.html
- http://docs.saltstack.com/en/latest/ref/states/highstate.html#state-declaration
顆粒
Salt和Puppet的充分比較
內建執行模塊的完全列表
via: http://techarena51.com/index.php/getting-started-with-saltstack/
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive