saltstack遠程執行底層原理
Salt的底層通信是通過ZeroMQ完成的,採用了ZeroMQ的訂閱發佈模式(Pub和Sub),如下圖所示。
簡單來講,Pub/Sub模式類似於廣播電臺,在訂閱發佈模式中Pub將消息發送到總線,所有的Sub收到來自總線的消息後,根據自己的訂閱條件來接收特定的消息。對應到Salt中就是master將事件發佈到消息總線,minion訂閱並監聽事件,然後minion會查看事件是否 ,通過正則匹配的各種方法去匹配minion。下面簡要說明下Saltmaster和minion的通信過程, Salt master啓動時會監聽兩個端口,默認是4505和4506。
4506的作用: Salt Master Ret接口,支持認證(auth)、文件服務、結果收集等功能;
4505的作用:Salt Master pub接口,提供遠程執行命令發送功能。
Salt minion啓動時從配置文件中獲取master的地址,如果爲域名,則進行解析。解析完成後,會連接master的4506(Ret接口)進行key認證。認證通過,會獲取到master的publish_port(默認是4505),然後連接publish_port訂閱來自master pub接口的任務。當master下發操作指令時,所有的minion都能接收到,然後minion會檢查本機是否匹配。如果匹配,則執行。執行完畢後,把結果發送到master的4506(Ret接口)由master進行處理,命令發送通信完全是異步的,並且命令包很小。此外,這些命令包通過maqpack進行序列化後數據會進一步壓縮(Maqpack是一種高效的二進制序列化格式),所以Salt的網絡負載非常低。
salt命令的結構語法
# salt '<target>' <function> [arguments] salt 'salt-minion-1' cmd.run 'uptime'
匹配方式
1、通配符匹配 [root@salt-master ~]# salt '*' test.ping [root@salt-master ~]# salt 'salt-minion01' test.ping [root@salt-master ~]# salt '*01' test.ping [root@salt-master ~]# salt 'salt-minion0[1|2]' test.ping [root@salt-master ~]# salt 'salt-minion0[!1|2]' test.ping [root@salt-master ~]# salt 'salt-minion0?' test.ping 2、列表匹配 [root@salt-master ~]# salt -L 'salt-minion01,salt-minion02' test.ping 3、正則匹配 [root@salt-master ~]# salt -E '^salt' test.ping [root@salt-master ~]# salt -E '^salt.*2$' test.ping 4、IP匹配 [root@salt-master ~]# salt -S '192.168.1.32' test.ping [root@salt-master ~]# salt -S '192.168.1.0/24' test.ping 5、複合匹配 [root@salt-master ~]# salt -C 'G@os:CentOS and [email protected]' test.ping 6、分組匹配 [root@salt-master ~]# vim /etc/salt/master nodegroups: webserver: 'salt-minion01,salt-minion02' dbserver: 'salt-minion03 [root@salt-master ~]# systemctl restart salt-master [root@salt-master ~]# salt -N 'webserver' test.ping [root@salt-master ~]# salt -N 'dbserver' test.ping 7、Grains匹配 [root@salt-master ~]# salt -G 'os:CentOS' test.ping [root@salt-master ~]# salt -G 'localhost:salt-minion02' test.ping 說明:上面這些匹配方式在top.sls文件中同樣適用。
常用模式:分組匹配和列表匹配
saltstack模塊介紹
模塊介紹:
test模塊
模塊名:test 功能:用於測試 [root@salt-master ~]# salt '*' test.ping
user模塊
參考:http://docs.saltstack.cn/ref/modules/all/salt.modules.useradd.html#module-salt.modules.useradd # salt '*' user.add name <uid> <gid> <groups> <home> <shell> [root@salt-master ~]# salt '*' user.add testuser
cmd模塊
模塊名:cmd 功能:實現遠程的命令行調用執行(默認具備root操作權限,使用時需評估風險) #查看所有minion內存和磁盤使用情況 [root@salt-master ~]# salt '*' cmd.run "free -m" [root@salt-master ~]# salt '*' cmd.run "df -h"
pkg模塊
模塊名:pkg 功能:軟件包狀態管理,會根據操作系統不同,選擇對應的安裝方式(如CentOS系統默認使用yum,Debian系統默認使用apt-get) #安裝 [root@salt-master ~]# salt '*' pkg.install "vsftpd" #卸載 [root@salt-master ~]# salt '*' pkg.remove "vsftpd" #安裝最新版本 [root@salt-master ~]# salt '*' pkg.latest_version "vsftpd" #更新軟件包 [root@salt-master ~]# salt '*' pkg.upgrade "vsftpd" #查看幫助手冊 [root@salt-master ~]# salt '*' pkg
file模塊
模塊名:file
功能:被控主機常見的文件操作,包括文件讀寫、權限、查找、校驗
#校驗所有minion主機文件的加密信息,支持md5、sha1、sha224、shs256、sha384、sha512加密算法
[root@salt-master ~]# salt '*' file.get_sum /etc/passwd md5
#修改所有minion主機/etc/passwd文件的屬組、用戶權限、等價於chown root:root /etc/passwd
[root@salt-master ~]# salt '*' file.chown /etc/passwd root root
#獲取所有minion主機/etc/passwd的stats信息
[root@salt-master ~]# salt '*' file.stats /etc/passwd
#獲取所有minion主機/etc/passwd的權限mode,如755,644
[root@salt-master ~]# salt '*' file.get_mode /etc/passwd
#修改所有minion主機/etc/passwd的權限mode爲0644
[root@salt-master ~]# salt '*' file.set_mode /etc/passwd 0644
#在所有minion主機創建/opt/test目錄
[root@salt-master ~]# salt '*' file.mkdir /opt/test
#在所有minion主機穿件/tmp/test.conf文件
[root@salt-master ~]# salt '*' file.touch /tmp/test.conf
#將所有minion主機/tmp/test.conf文件追加內容'maxclient 100'
[root@salt-master ~]# salt '*' file.append /tmp/test.conf 'maxclient 100'
#刪除所有minion主機的/tmp/test.conf文件
[root@salt-master ~]# salt '*' file.remove /tmp/test.conf
補充:
# file.managed 下發文件,確保文件存在
# file.directory 建立目錄
# file.symlink 建立軟連接
# file.recurse 下發整個目錄
# file.tidied: 查找匹配的文件或目錄刪除,如果沒有不做操作
service模塊
模塊名:service 功能:被控主機程序包服務管理 #開啓(enable)禁用(disable) salt '*' service.enable <service name> salt '*' service.disabled <service name> #reload、restart、start、stop、status操作 salt '*' service.reload <service name> salt '*' service.restart <service name> salt '*' service.start <service name> salt '*' service.stop <service name> salt '*' service.status <service name>