1. 程式人生 > >自動化運維工具saltstack

自動化運維工具saltstack

主機名 如果 users color 自動化運維工具 connect 企業版 str 發送

常見自動化運維工具

傳統運維效率低,工作繁瑣且容易出錯
重復性事情反復在做,沒有標準化的流程
傳統運維的腳本繁多,不方便管理
自動化運維要解決的就是這些問題
常見的自動化運維工具
puppet (www.puppetlabs.com)
基於rubby開發,c/s架構,支持多平臺。可管理配置文件、用戶、cron任務、軟件包管理、系統服務等。分為社區版(免費)和企業版(收費),企業版支持圖形化配置
Saltstack(官網:https://saltstack.com,文檔:docs.saltstack.com)
基於python開發,c/s架構,支持多平臺,比puppet輕量,在遠程執行命令時非常便捷,配置和使用都比puppet容易,且能實現puppet幾乎所有的功能

Ansible (www.ansible.com)
更加簡潔的自動化運維工具,不需要在客戶端上安裝agent用戶端,基於python開發。可以實現批量操作系統配置、批量程序部署、批量運行命令
自動化運維工具和腳本自動批量執行命令有些區別,腳本若使用for、while循環一個操作指令時,實際上這個指令只會在一臺服務器上操作完成後才繼續傳遞到下一臺服務器繼續循環執行,這種方式像串行執行,所有任務只能在前一條完成後才能夠繼續執行下一條
自動化運維工具則屬於並行執行,則一些操作命令同時發布到所有機器上同時進行處理,這樣的處理方式要比腳本for循環的方式要快的多

saltstack安裝

saltstack可以使用salt-ssh遠程執行,類似於ansible,也支持c/s模式,下面介紹該模式的使用方式

準備兩臺測試主機
192.168.1.115位服務端
192.168.1.223為客戶端兩臺服務器均設置hostname和hosts,hosts是用於把主機名解析到ip的,如果服務器很多,可以考慮在內部網絡環境中配置一臺DNS解析服務器,1.115主機名為nfs3,·1.223主機名為nfs2
兩臺機器需要全部安裝saltstack yum源,如果這裏列出的yum源失效,則需要自行在其官網上尋找yum源下載地址

http://repo.saltstack.com/#rhel
sudo yum install https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm 

安裝服務端和客戶端

在服務端安裝salt-master 和salt-minion,在安裝時會自動解決軟件包的依賴關系,在安裝結果中也可以看到saltstack的安裝的版本
yum安裝中的zeromq包是saltstack中的消息隊列服務插件

[root@nfs3 ~]# yum install salt-master salt-minion -y

Loaded plugins: fastestmirror

base | 3.6 kB 00:00:00 ? ? 

epel/x86_64/metalink | 8.4 kB 00:00:00 ? ? 

epel | 3.2 kB 00:00:00 ? ? 

extras | 3.4 kB 00:00:00 ? ? 

mongodb-org-4.0 ? 

--------------------省略

Dependency Installed:

  PyYAML.x86_64 0:3.11-1.el7 ? ? ? ? ? ? ? ? ? ? ?  libsodium.x86_64 0:1.0.16-1.el7 ? ? ? ? ? ? ? ? ?  libtomcrypt.x86_64 0:1.17-26.el7 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  libtommath.x86_64 0:0.42.0-6.el7 ? ? ? ? ? ? ? ?  libyaml.x86_64 0:0.1.4-11.el7_0 ? ? ? ? ? ? ? ? ?  openpgm.x86_64 0:5.2.122-2.el7 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  python-babel.noarch 0:0.9.6-8.el7 ? ? ? ? ? ? ? ? python-backports.x86_64 0:1.0-8.el7 ? ? ? ? ? ? ?  python-backports-ssl_match_hostname.noarch 0:3.5.0.1-1.el7 ? ? ? ? ? ?
  python-chardet.noarch 0:2.2.1-1.el7_1 ? ? ? ? ? ? python-ipaddress.noarch 0:1.0.16-2.el7 ? ? ? ? ? ? python-jinja2.noarch 0:2.7.2-2.el7 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  python-kitchen.noarch 0:1.1.1-5.el7 ? ? ? ? ? ? ? python-markupsafe.x86_64 0:0.11-10.el7 ? ? ? ? ? ? python-requests.noarch 0:2.6.0-1.el7_1 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  python-tornado.x86_64 0:4.2.1-3.el7 ? ? ? ? ? ? ? python-urllib3.noarch 0:1.10.2-5.el7 ? ? ? ? ? ? ? python-zmq.x86_64 0:15.3.0-3.el7 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  python2-crypto.x86_64 0:2.6.1-15.el7 ? ? ? ? ? ?  python2-futures.noarch 0:3.0.5-1.el7 ? ? ? ? ? ? ? python2-msgpack.x86_64 0:0.5.6-4.el7 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  python2-psutil.x86_64 0:2.2.1-4.el7 ? ? ? ? ? ? ? salt.noarch 0:2018.3.3-1.el7 ? ? ? ? ? ? ? ? ? ? ? yum-utils.noarch 0:1.1.31-46.el7_5 ? 

Complete!

在用戶端安裝salt-minion

[root@nfs2 ~]# yum install -y salt-minion
Loaded plugins: fastestmirror
base | 3.6 kB 00:00:00 ? ? 
elrepo | 2.9 kB 00:00:00 ? ? 
epel/x86_64/metalink | 8.4 kB 00:00:00 ? ? 
epel | 3.2 kB 00:00:00 ? ? 
extras | 3.4 kB 00:00:00 ? ? 
mongodb-org-4.0 | 2.5 kB 00:00:00 ? ? 
salt-latest | 2.9 kB 00:00:00 ? ? 
updates | 3.4 kB 00:00:00 ? ? 
(1/3): epel/x86_64/updateinfo | 934 kB 00:00:01 ? ? 
(2/3): salt-latest/x86_64/primary_db | 42 kB 00:00:02 ? ? 
(3/3): epel/x86_64/primary | 3.6 MB 00:00:05 ? ? 
Determining fastest mirrors
 * elrepo: mirrors.tuna.tsinghua.edu.cn
 * epel: mirrors.ustc.edu.cn
----------------------------------按照結果省略,正確安裝完成

saltstack相關服務配置

服務端salt服務配置文件
編輯配置文件/etc/salt/minion
找到master配置那行,將服務端(master)的解析名稱(/etc/hosts中配置的)填寫到這裏

[root@nfs3 ~]# vim /etc/salt/minion
master: nfs3

服務端啟動salt服務

[root@nfs3 ~]# systemctl start salt-minion
[root@nfs3 ~]# systemctl start salt-master

salt啟動的是名為python進程,使用ps -aux查看啟動的進程

[root@nfs3 ~]# ps -aux |grep salt
root ? ? ? 3218 ?0.0 ?1.1 307760 21500 ? ? ? ?  Ss ? 22:55 ? 0:00 /usr/bin/python /usr/bin/salt-minion
root ? ? ? 3221 ?0.0 ?2.4 641596 45428 ? ? ? ?  Sl ? 22:55 ? 0:02 /usr/bin/python /usr/bin/salt-minion
root ? ? ? 3229 ?0.0 ?1.0 397724 20304 ? ? ? ?  S ? ?22:55 ? 0:00 /usr/bin/python /usr/bin/salt-minion
root ? ? ? 3297 ?0.0 ?2.1 382876 40796 ? ? ? ?  Ss ? 22:55 ? 0:01 /usr/bin/python /usr/bin/salt-master
root ? ? ? 3302 ?0.0 ?1.0 306172 20176 ? ? ? ?  S ? ?22:55 ? 0:00 /usr/bin/python /usr/bin/salt-master
root ? ? ? 3307 ?0.0 ?1.8 463596 34496 ? ? ? ?  Sl ? 22:55 ? 0:00 /usr/bin/python /usr/bin/salt-master

服務端的master是需要監聽端口的,salt-master進程監聽4505和4506兩個服務端口

[root@nfs3 ~]# netstat -ntlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address ? ? ? ? ? Foreign Address ? ? ? ? State ? ? ? PID/Program name ? ?
tcp ? ? ? ?0 ? ? ?0 127.0.0.1:6379 ? ? ? ? ?0.0.0.0:* ? ? ? ? ? ? ? LISTEN ? ? ?1615/redis-server 1 
tcp ? ? ? ?0 ? ? ?0 0.0.0.0:22 ? ? ? ? ? ? ?0.0.0.0:* ? ? ? ? ? ? ? LISTEN ? ? ?1607/sshd ? ? ? ? ? 
tcp ? ? ? ?0 ? ? ?0 0.0.0.0:4505 ? ? ? ? ? ?0.0.0.0:* ? ? ? ? ? ? ? LISTEN ? ? ?3307/python ? ? ? ? 
tcp ? ? ? ?0 ? ? ?0 127.0.0.1:25 ? ? ? ? ? ?0.0.0.0:* ? ? ? ? ? ? ? LISTEN ? ? ?2751/master ? ? ? ? 
tcp ? ? ? ?0 ? ? ?0 0.0.0.0:4506 ? ? ? ? ? ?0.0.0.0:* ? ? ? ? ? ? ? LISTEN ? ? ?3313/python

用戶端啟動服務
編輯配置文件/etc/salt/minion
找到master配置那行,將解析名稱(/etc/hosts中配置的)填寫到這裏,指定master解析的名稱

[root@nfs2 ~]# vim /etc/salt/minion
master: nfs3

用戶端啟動salt-minion服務只會啟動python的進程,不會監聽任何端口,主要功能是向服務端發送數據,因此salt-minion不會監聽任何端口

[root@nfs2 ~]# systemctl start salt-minion
[root@nfs2 ~]# ps -axu |grep salt
root ? ? ? 2174 ?4.8 ?2.1 307808 21508 ? ? ? ?  Ss ? 23:45 ? 0:00 /usr/bin/python /usr/bin/salt-minion
root ? ? ? 2184 14.6 ?4.0 459064 40184 ? ? ? ?  Sl ? 23:45 ? 0:01 /usr/bin/python /usr/bin/salt-minion
root ? ? ? 2192 ?0.0 ?2.0 397752 20288 ? ? ? ?  S ? ?23:45 ? 0:00 /usr/bin/python /usr/bin/salt-minion
root ? ? ? 2251 ?0.0 ?0.0 112704 ? 964 pts/0 ?  R+ ? 23:45 ? 0:00 grep --color=auto salt

saltstack配置認證

minion與master建立通信
master服務端和minion端通信需要建立一個安全的通道,傳輸過程需要加密,所以需要配置認證。也就是通過密鑰對來加密解密的
用戶端保存公鑰
minion在第一次啟動是會在/etc/salt/pki/minion目錄下生成minion.pen和minion.pub,其中pub為公鑰,在傳輸時會發送給master服務端
服務端保存公鑰
master第一次啟動也會在/etc/salt/pki/master這個路徑下生成密鑰對,當master接收到minion發送過來的公鑰後,需要通過salt-key工具來接受這個公鑰,接受後會在/etc/salt/pki/master/minion這個目錄下存儲接受的公鑰
同時客戶端也會接受master服務端發送過來的公鑰,將其存儲在/etc/salt/pki/minion目錄下,並命名為minion_master.pub的公鑰文件

需要通過借助salt-key工具實現
在使用salt-key工具之前,需要如下配置正確
1.用戶端和服務端都需要修改/etc/salt/minion 配置文件,將master配置的那行都改為服務端的解析名地址。
2.在測試環境中,修改自己的hosts解析,解析名對應服務端的ip地址
完成這些後在服務端可以使用salt-key查看所有的minion端信息

[root@nfs3 ~]# salt-key
Accepted Keys:
nfs3
Denied Keys:
Unaccepted Keys:
localzabbix.com
Rejected Keys:

將用戶端密鑰保存至服務端

[root@nfs3 ~]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
localzabbix.com
Proceed? [n/Y] Y

Key for minion localzabbix.com accepted.
在服務端查看用戶端發送過來的公鑰是一致的
技術分享圖片
刪除所有認證過的主機,然後使用salt-key查看發現所有認證都被刪除,刪除認證後同時保存的公鑰也會被刪除掉

[root@nfs3 minions]# salt-key -D
The following keys are going to be deleted:
Accepted Keys:
localzabbix.com
nfs3
Proceed? [N/y] Y
Key for minion localzabbix.com deleted.
Key for minion nfs3 deleted.
[root@nfs-03 minions]# salt-key 
Accepted Keys:
Denied Keys:
Unaccepted Keys:
Rejected Keys:
[root@nfs3 minions]# pwd
/etc/salt/pki/master/minions
[root@nfs3 minions]# ls

如果需要重新加入這個主機,需要更新master端的信息(也就是每新加一臺服務器,都必須重啟master和minion服務,這樣服務端才會重新去檢測用戶端的變化)
salt-key ?語法用法
-a ? 後面跟主機名,認證指定主機
-A ?認證所有主機
-r ? 指定主機名,拒絕指定主機
-R ?拒絕所有主機
-d ?指定主機名,刪除指定主機
-D ?刪除全部認證過的主機
-y ?語句過程中省略掉交互式,等同於避免按Y交互確認

saltstack執行遠程命令

salt ‘*‘ test.ping 測試所有已經認證過的minion端是否通信正常,返回true則表示狀態互通,命令也可以指定單獨一臺主機進行測試

[root@nfs3 minions]# salt ‘*‘ test.ping
localzabbix.com:
 ?  True
nfs3:
 ?  True
[root@nfs3 minions]# salt ‘localzabbix.com‘ test.ping
localzabbix.com:
 ?  True

執行遠程命令
salt ‘*’ cmd.run "命令" ? 指定主機或多主機來執行遠程命令。如下操作過程

[root@nfs3 minions]# salt ‘*‘ cmd.run "w"
localzabbix.com:
 ? ? 02:19:34 up 1:09, 1 user, load average: 0.00, 0.01, 0.05
 ?  USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
 ?  root pts/0 192.168.1.112 01:11 37:34 0.14s 0.14s -bash
nfs3:
 ? ? 02:19:35 up 5:03, 2 users, load average: 0.00, 0.05, 0.12
 ?  USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
 ?  root tty1 21:42 4:33m 0.06s 0.06s -bash
 ?  root pts/0 192.168.1.112 01:43 7.00s 1.22s 1.11s /usr/bin/python /usr/bin/salt * cmd.run w

這裏指定的*或主機名是已經被接受認證過的客戶端。可以通過salt-key來查詢認證過的,通常是已經設定的id值,關於這部分內容。它支持通配、列表和正則表達式,比如,如果需要指定兩臺客戶端,我們可以寫成 salt ‘nfs*’、salt ‘nfs1[13]‘ 、salt -L ‘nfs1,nfs2’ salt -E ‘nfs(1|2)’ ?等形式,還支持列表,多個機器使用逗號進行分隔,需要加上-L選項。使用正則表達式則必須帶上-E選項。還支持grains ,需要使用-G選項

自動化運維工具saltstack