第3章 SaltStack遠程執行
3.1 目標(Targeting)
指定目標,用來匹配minion,默認是以minion ID作爲目標來匹配minion的。
匹配目標,非常重要,因爲匹配錯了,執行命令錯了,後面會很嚴重的。
[root@saltstack-node1 ~]# salt '*' test.ping saltstack-node2.example.com: True saltstack-node1.example.com: True
詳解命令【salt '*' test.ping】如下:
r salt是固定的命令
r *是遠程執行時的目標(代表匹配所有),是本節學習的重點
r test.ping代表要遠程執行的模塊
r test是模塊的名稱
r .(點)代表引用這個模塊
r ping是test模塊裏的一個方法
3.1.1minion ID
這個minion ID是不能隨便改動的,因爲master端認證minion端時,默認是以minion ID的內容命名minion端的公鑰。所以,如果修改minion ID後,該minion就不能被管理了,解決方法是,必須把這個minion刪掉,再重新添加,認證,纔可以管理。
注意:主機的FQDN名和minionID不要隨便改!
~查看minionID
[root@saltstack-node1 ~]# cat /etc/salt/minion_id #默認是主機的FQDN名 saltstack-node1.example.com
~查看minion的公鑰(即證書)
[root@saltstack-node1 ~]# ll/etc/salt/pki/master/minions 總用量 8 -rw-r--r-- 1 root root 451 8月 4 14:35saltstack-node1.example.com -rw-r--r-- 1 root root 451 8月 4 13:26saltstack-node2.example.com
3.1.2不同寫法概述
3.1.2.1 與minion id有關
r globbing(通配符)
r regex(正則)
r list (列表)
範例:redis-node1-redis03-idc04-soa.example.com
r redis-node1:運行的服務是redis,這個是第一個節點
r redis03:說明這個redis是redis集羣編號03裏面的節點
r idc04:這臺服務器運行在編號04的IDC機房中
r soa:這臺服務器是給soa服務使用的
r example.com是域名
3.1.2.2 與minion id無關
r 子網/IP地址
r grains
r pillar
r compound matchers(複合匹配)
r node groups(節點組)
r batching execution(批處理執行)
3.1.3匹配目標的不同寫法
3.1.3.1 通配符
r 任意字符
r ? 單個字符
r ! 取反
salt 'saltstack-node*' test.ping salt '*.example.com' test.ping salt 'saltstack-node?.example.com' test.ping salt 'saltstack-node[1-2].example.com' test.ping salt 'saltstack-node[!2].example.com' test.ping
3.1.3.2 列表(不推薦)
salt -L 'saltstack-node1.example.com,saltstack-node2.example.com' test.ping
3.1.3.3 正則※
salt -E 'saltstack-(node1|node2).example.com'test.ping
~正則表達式在top file裏的寫法
[root@saltstack-node1 ~]# cat/srv/salt/top.sls base: 'saltstack-(node1|node2).example.com': - match:pcre #一定要加上這一行,聲明使用正則匹配。 - apache
3.1.3.4 子網/IP地址
salt -S 10.0.0.0/24 test.ping salt -S 10.0.0.22 test.ping
3.1.3.5 grains
salt -G 'os:CentOS' test.ping salt -G cloud:openstack cmd.run 'df -h' # key(os、cloud) # value(CentOS、openstack)
~grains在top file裏的寫法
[root@saltstack-node1 ~]# cat /srv/salt/top.sls base: 'saltstack-(node1|node2).example.com': - match:pcre - apache 'os:CentOS': - match:grain #一定要加上這一行,聲明使用grain匹配,不加s - apache
3.1.3.6 pillar
salt -I 'Zabbix_Server:10.0.0.22' test.ping
3.1.3.7 compound matchers(複合匹配)
salt -C 'saltstack-node1* orI@Zabbix_Server:10.0.0.22' test.ping salt -C '* and not I@Zabbix_Server:10.0.0.22'test.ping #注意not參數的寫法,前面一定要有target,才能用。
3.1.3.8 node groups(節點組)
可以在master的主配置文件裏修改,指定好,大約在712行。很少用。
3.1.3.9 batching execution(分批處理執行)
salt '*' -b 1 test.ping #同一時刻只允許一臺機器執行命令,很少用。
3.1.4salt命令參數列表
[root@saltstack-node1 ~]# salt -h -b --batch #允許一批機器,同一時刻執行命令,用來控制同時執行命令的機器數量 -C, --compound #混合 -E, --pcre #正則 -L, --list #列表 -G, --grain #grain -I, --pillar #pillar -S, --ipcidr(IP無類域間路由)Subnet #子網或IP地址 -R, --range #範圍
3.2 執行模塊(Modules)
模塊是遠程執行中的重要組成部分。
在遠程執行中的模塊叫做執行模塊(executionmodules),配置管理的模塊稱之爲狀態模塊(executionmodules)。
我們學習執行模塊時,必須要學會看官方文檔,它的優點是全,缺點也是全,太豐富了。
官網(執行模塊): https://docs.saltstack.com/en/latest/
模塊的數量,至少有300加,而且數量還在不停的遞增中……
接下來,我們一起來簡單學習幾個常用的模塊。
注意:cmd.run這個模塊,生產環境中,不建議使用,因爲比較危險。
3.2.1network模塊
模塊由名稱和方法組成。
注意,有些地方需要指定參數。
3.2.1.1 active_tcp
~返回minion端所有的TCP鏈接
salt 'saltstack-node1.example.com'network.active_tcp
3.2.1.2 arp
~Return the arp table from theminion
salt 'saltstack-node1.example.com' network.arp
3.2.1.3 default_route
~Return default route(s) fromrouting table
salt 'saltstack-node1.example.com'network.default_route
3.2.1.4 get_hostname
~Get hostname
salt '*' network.get_hostname
3.2.1.5 hw_addr
~Return the hardware address(a.k.a. MAC address) for a given interface
salt '*' network.hw_addr eth0
3.2.1.6 interface
~Return the inet address for agiven interface
salt '*' network.interface eth0
3.2.1.7 traceroute
~Performs a traceroute to a 3rdparty host
salt '*' network.traceroute baidu.com
3.2.2service模塊
3.2.2.1 available
~Returns True if the specifiedservice is available, otherwise returns False.
salt '*' service.available sshd
3.2.2.2 get_all
~Return a list of all availableservices
salt 'saltstack-node1*' service.get_all
3.2.2.3 start
~Start the specified service
salt 'saltstack-node1*' service.start postfix
3.2.2.4 stop
~Stop the specified service
salt 'saltstack-node1*' service.stop postfix
3.2.2.5 status
~Return the status for aservice, returns the PID or an empty string if the service is running or not,pass a signature to use to find the service via ps
salt 'saltstack-node1*' service.status postfix
3.2.3 state模塊
作用:Control the state system on the minion.
3.2.3.1 show_top
~Return the top data that theminion will use for a highstate
salt 'saltstack-node1*' state.show_top
3.2.3.2 show_highstate
~Retrieve the highstate datafrom the salt master and display it
salt 'saltstack-node1*' state.show_highstate
3.2.3.3 highstate
~Retrieve the state data fromthe salt master for this minion and execute it
salt '*' state.highstate
3.2.3.4 sls
~Execute the states in one ormore SLS files
salt '*' state.sls apache env=base
3.2.4控制cmd模塊的方法
我們可以編輯master的主配置文件:/etc/salt/master
~ACL
client_acl: #訪問控制列表 larry: #用戶larry -test.ping #只能執行test模塊的ping方法 -network.* #只能執行network模塊的所有方法
~黑名單
client_acl_blacklist: #配置黑名單 users: #所有的用戶 - root #用戶root -'^(?!sudo_).*$' #所有非sudo用戶 modules: #模塊關鍵字 - cmd #cmd模塊,裏面的方法全部都不能用
~所有用戶不能執行cmd模塊的設置方法如下:
client_acl_blacklist: modules: - cmd
3.3 返回程序(Returnners)
如果salt minion太多的時候,每次查看執行結果都要看很久,而且屏幕都佔滿了。也不方便查看是否執行成功。這個時候saltsack的returner功能上場了。我們可以把執行的命令結果存入數據庫,通過數據庫查看就很方便了。
最大的作用,可以把所有的返回結果,統一存放在同個地方,做統計、分析時會比較好用。
默認情況下,返回程序是minion端將結果返回給master端。
我們可以自定義返回程序,將結果寫入到redis或是MySQL。需要注意,返回結果是minion發送的,和master沒有關係。也就是說,minion直接把結果寫入到redis或MySQL中。
參考網址:
https://docs.saltstack.com/en/latest/ref/returners/index.html#full-list-of-returners
https://docs.saltstack.com/en/latest/ref/returners/all/salt.returners.mysql.html
3.3.1salt.returners.mysql(案例)
返回數據到mysql服務器上,注意:minion端依賴一個python包:python-mysqldb。
官網介紹:可以在master端或者minion端配置文件裏面寫上mysql相關的配置,如果是minion端,需要在每個minion的配置文件裏面寫,如果寫到master端的配置文件,minion端則無需配置。因此,我們可以把這些配置寫到master端的配置文件。
但是,我在做實驗的時候,把相關配置寫入到master的配置文件,minion端沒寫,結果發現mysql的表裏是空的,沒有記錄。注:系統環境的版本是CentOSrelease 6.7 (Final)。
所以,爲了防止出錯,我們就把mysql的相關配置寫入到所有minion的配置文件裏。
mysql返回程序操作流程如下:
3.3.2安裝mysql和依賴包
~master端
yum install -y mysql-server MySQL-python /etc/init.d/mysqld start
~所有minion端要安裝:MySQL-python
如果不裝,這個minion端的執行返回結果是不會寫到mysql數據庫表的。
yum install -y MySQL-python
3.3.3mysql的相關配置
因爲要把客戶端執行命令的結果直接返回給mysql服務器,所以客戶端也要配置mysql信息的,在minion的配置文件中加入如下信息,你也可以把它單獨寫在一個文件中。爲了方便管理推薦寫在單獨文件中:
cat >/etc/salt/minion.d/mysql.conf<<EOF ###### Returner settings ###### ############################################ # Whichreturner(s) will be used for minion's result: #return: mysql mysql.host:'10.0.0.21' mysql.user:'salt' mysql.pass:'salt' mysql.db:'salt' mysql.port:3306 EOF cat/etc/salt/minion.d/mysql.conf
~所有結點的minion服務都要重啓
/etc/init.d/salt-minion restart
3.3.4創建salt的數據庫和表結構
3.3.4.1 創建庫
mysql --------------------------------- CREATE DATABASE `salt` DEFAULTCHARACTER SET utf8 DEFAULTCOLLATE utf8_general_ci;
3.3.4.2 創建三個表
use salt; # 在salt庫裏創建三張表 --------------------------------- CREATE TABLE `jids` ( `jid`varchar(255) NOT NULL, `load`mediumtext NOT NULL, UNIQUE KEY`jid` (`jid`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; CREATE INDEX jid ON jids(jid) USING BTREE; --------------------------------- CREATE TABLE `salt_returns` ( `fun`varchar(50) NOT NULL, `jid`varchar(255) NOT NULL, `return`mediumtext NOT NULL, `id`varchar(255) NOT NULL, `success`varchar(10) NOT NULL, `full_ret`mediumtext NOT NULL, `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, KEY `id`(`id`), KEY `jid`(`jid`), KEY `fun`(`fun`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
--------------------------------- CREATE TABLE `salt_events` ( `id` BIGINT NOT NULL AUTO_INCREMENT, `tag` varchar(255) NOT NULL, `data` mediumtext NOT NULL, `alter_time` TIMESTAMP DEFAULT CURRENT_TIMESTAMP, `master_id` varchar(255) NOT NULL, PRIMARY KEY (`id`), KEY `tag` (`tag`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; --------------------------------- show tables; # 查看所有的表
3.3.4.3 授權
grant all on salt.* tosalt@'10.0.0.0/255.255.255.0' identified by 'salt'; exit;
3.3.5驗證
我們可以在master端打開兩個窗口,一個看shell執行返回結果,一個看mysql中返回的結果。
返回程序把執行結果寫入到mysql中,但是,返回程序無論寫到哪裏,master端都會顯示執行結果。
3.3.5.1 shell
我們輸入下面兩條命令,將遠程執行的結果,返回給mysql。
salt '*' test.ping --return mysql salt '*' cmd.run 'uptime' --return mysql
3.1.1.1 mysql
我們可以登錄數據庫,查看遠程執行的結果是否已被保存在數據庫的salt_returns表裏。
mysql use salt; show tables; select * from salt_returns; select * from salt_returns\G; # 倒數第二條命令,顯示的結果,看的很混亂。 # 最後一條命令,顯示的結果,更加人性化。推薦!
執行命令:select *from salt_returns\G;
結果如下所示:
salt '*' cmd.run 'uptime' --returnmysql命令相對應的圖:
salt '*' test.ping --return mysql命令相對應的圖: