第1章 saltstack快速入門
1.1 快速安裝
項目 VM1: saltstack-node1.example.com VM2: saltstack-node2.example.com
安裝角色 master && minion minion
IP(eth0) 10.0.0.21 10.0.0.22
網關(eth0) 10.0.0.2
DNS 8.8.8.8,114.114.114.114
系統版本 CentOS release 6.7 (Final)
內核版本 2.6.32-573.el6.x86_64
防火牆 關
selinux 關
1.1.1 系統環境
1.1.1.1 查看命令
hostname cat /etc/redhat-release uname -r /etc/init.d/iptables status getenforce ifconfig eth0 |awk -F "[ :]+" 'NR==2 {print $4}' route -n cat /etc/resolv.conf
1.1.1.2 做好內網DNS解析
兩臺機器同時做好內網DNS的解析。
cat >/etc/hosts<<EOF 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 10.0.0.21 saltstack-node1.example.com 10.0.0.22 saltstack-node2.example.com EOF
1.1.2 安裝master與minion
兩臺機器先安裝epel源:
wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
1.1.2.1 saltstack-node1
同時安裝master和minion端。
yum install -y salt-master salt-minion rpm -qa salt-master salt-minion
安裝後啓動服務。
/etc/init.d/salt-master start chkconfig salt-master on chkconfig --list salt-master /etc/init.d/salt-minion start chkconfig salt-minion on chkconfig --list salt-minion
1.1.2.2 saltstack-node2
只安裝minion端。 yum install -y salt-minion rpm -qa salt-minion
安裝後啓動服務。
/etc/init.d/salt-minion start chkconfig salt-minion on chkconfig --list salt-minion
1.1.3 安裝後檢查
1.1.3.1 saltstack-node1
[root@saltstack-node1 ~]# cd /etc/salt/ [root@saltstack-node1 salt]# ll#檢查,會自動生成如下文件 總用量 72 -rw-r----- 1 root root 29543 2016-03-23 06:24 master#master端主配置文件 -rw-r----- 1 root root 26365 2016-03-23 06:24 minion#minion端主配置文件 drwxr-xr-x 2 root root 4096 2016-08-04 12:42 minion.d -rw-r--r-- 1 root root 27 2016-08-04 12:42 minion_id#minion端的ID drwxr-xr-x 4 root root 4096 2016-08-04 12:42 pki#存放密鑰的目錄 [root@saltstack-node1 salt]# cat minion_id #主機的FQDN名,每個minion端都有 saltstack-node1.example.com
1.1.3.2 saltstack-node2
[root@saltstack-node2 ~]# cd /etc/salt/ [root@saltstack-node2 salt]# ll#檢查,會自動生成如下的文件 總用量 40 -rw-r----- 1 root root 26365 2016-03-23 06:24 minion#minion端主配置文件 drwxr-xr-x 2 root root 4096 2016-08-04 12:42 minion.d -rw-r--r-- 1 root root 27 2016-08-04 12:42 minion_id#minion端的ID drwxr-xr-x 3 root root 4096 2016-08-04 12:42 pki#存放密鑰的目錄 [root@saltstack-node2 salt]# cat minion_id #主機的FQDN名,每個minion端都有 saltstack-node2.example.com
1.1.4 master與minion端的認證
minion端必須經過master端的認證,才能被管理。※
~ saltstack-node2
[root@saltstack-node2 ~]# cd /etc/salt/ [root@saltstack-node2 salt]# vim minion master: saltstack-node1.example.com #指定master端是誰,可寫FQDN或IP地址,第16行 [root@saltstack-node2 salt]# /etc/init.d/salt-minion restart #重啓服務,修改了這一步,還不夠,還需要master端認證才行(即相互交換公鑰) [root@saltstack-node2 salt]# cd pki/minion/ [root@saltstack-node2 minion]# ll -r-------- 1 root root 1679 2016-08-04 13:26 minion.pem#minion的私鑰 -rw-r--r-- 1 root root 451 2016-08-04 13:26 minion.pub#minion的公鑰 #重啓服務後,會自動生成一對密鑰,認證時,公鑰會發給master端,minion端也會接收master端的公鑰
~ saltstack-node1
[root@saltstack-node1 ~]# cd /etc/salt/pki/master/ [root@saltstack-node1 master]# ll -r-------- 1 root root 1675 2016-08-04 12:40 master.pem#master的私鑰 -rw-r--r-- 1 root root 451 2016-08-04 12:40 master.pub#master的公鑰 drwxr-xr-x 2 root root 4096 2016-08-04 13:39 minions#存放所有的minion端公鑰 drwxr-xr-x 2 root root 4096 2016-08-04 12:40 minions_autosign drwxr-xr-x 2 root root 4096 2016-08-04 12:40 minions_denied drwxr-xr-x 2 root root 4096 2016-08-04 13:39 minions_pre drwxr-xr-x 2 root root 4096 2016-08-04 12:40 minions_rejected
~ saltstack-node1master端認證mirror端,必須要接受mirror端,才能管理它
[root@saltstack-node1 ~]# cd /etc/salt/pki/master/ [root@saltstack-node1 master]# salt-key #可以看到,只有一個minion端,但還未接受 Accepted Keys: Denied Keys: Unaccepted Keys: saltstack-node2.example.com Rejected Keys: [root@saltstack-node1 master]# salt-key -a saltstack-node2.example.com # -a添加特定的minion端 The following keys are going to be accepted: Unaccepted Keys: saltstack-node2.example.com Proceed? [n/Y] Y#輸入Y同意 Key for minion saltstack-node2.example.com accepted. [root@saltstack-node1 master]# salt-key #再查看,接受minion端了 Accepted Keys: saltstack-node2.example.com Denied Keys: Unaccepted Keys: Rejected Keys:
1.1.5 認證完成後檢查(不重要)
認證的過程,即相互交換公鑰的過程。
~ 查看minion端公鑰的內容
[root@saltstack-node1 ~]# cd /etc/salt/pki/master/ [root@saltstack-node1 master]# cat minions/saltstack-node2.example.com -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA062YmAq9L3OXZytSosco OOFLBTjhbpJTInwLmNQCU+8+o6ataFaKavNnbOlVmm/3TuZ/So5EGWekaxgtAnFQ uRbv2k+l358uPHQ3X5mf2Hr2d1lI1hMEmBDz+X/zf7TD4KQ/0k3UdMe0DktniBYQ J7L4F4Jw4xqDe0fsv6Z3QrzOQeadvD8ItGtE/oDJ1g5158Fw4yaLU0ixNfMBak8R dA1Cw9hxAy4OYXMr+7meld0lEI2WinnLy3bw2fGiw50MFnw8YVFlOWTJ30mqy5kO GaJ/70RxyQ3adPeSeNNYiqEwhw7YtJGygcQsfzhYL9aLDX7HTXuwxpM0g3Jmn18V jQIDAQAB -----END PUBLIC KEY----- #可以發現,它們的內容是一樣的 [root@saltstack-node2 ~]# cd /etc/salt/pki/minion/ [root@saltstack-node2 minion]# cat minion.pub -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA062YmAq9L3OXZytSosco OOFLBTjhbpJTInwLmNQCU+8+o6ataFaKavNnbOlVmm/3TuZ/So5EGWekaxgtAnFQ uRbv2k+l358uPHQ3X5mf2Hr2d1lI1hMEmBDz+X/zf7TD4KQ/0k3UdMe0DktniBYQ J7L4F4Jw4xqDe0fsv6Z3QrzOQeadvD8ItGtE/oDJ1g5158Fw4yaLU0ixNfMBak8R dA1Cw9hxAy4OYXMr+7meld0lEI2WinnLy3bw2fGiw50MFnw8YVFlOWTJ30mqy5kO GaJ/70RxyQ3adPeSeNNYiqEwhw7YtJGygcQsfzhYL9aLDX7HTXuwxpM0g3Jmn18V jQIDAQAB -----END PUBLIC KEY-----
~ 查看master端公鑰的內容
[root@saltstack-node2 ~]# cd /etc/salt/pki/minion/ [root@saltstack-node2 minion]# cat minion_master.pub #注意名字的變化 -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxQv0en2AJhWq/1dh67Kz 3zuH1G307x0vyJqCg3v7CaNwbKgot4+Aiq+gYBYFQ3uDvoJSYF0bfE5l0ht+s7s8 p2p7nrrWDQfyd9ph5HL4xtXQIltPhdONRsNZbahmB4C4KkHQ5MUSdG1zXaqVBHWk 1nlwtwUd/3A2iOiMtNOx2mhuSTPb1DlPfKcl2uNDbEBc4YLMcofh7HDW5Z7MNMMz ijuOkilaMQcVDCY2PEI+iwrFzPaV5H6YuztFGiF/pHpsIlVFDN4C+QPInQs6ACQq CsHGoUHHePCAqVPtA0F2DsW6iFvNvksFjclzJniVjEpmENwapnB8YogHBZrxYWim 5wIDAQAB -----END PUBLIC KEY----- #可以發現,它們的內容是一樣的 [root@saltstack-node1 ~]# cd /etc/salt/pki/master/ [root@saltstack-node1 master]# cat master.pub -----BEGIN PUBLIC KEY----- MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxQv0en2AJhWq/1dh67Kz 3zuH1G307x0vyJqCg3v7CaNwbKgot4+Aiq+gYBYFQ3uDvoJSYF0bfE5l0ht+s7s8 p2p7nrrWDQfyd9ph5HL4xtXQIltPhdONRsNZbahmB4C4KkHQ5MUSdG1zXaqVBHWk 1nlwtwUd/3A2iOiMtNOx2mhuSTPb1DlPfKcl2uNDbEBc4YLMcofh7HDW5Z7MNMMz ijuOkilaMQcVDCY2PEI+iwrFzPaV5H6YuztFGiF/pHpsIlVFDN4C+QPInQs6ACQq CsHGoUHHePCAqVPtA0F2DsW6iFvNvksFjclzJniVjEpmENwapnB8YogHBZrxYWim 5wIDAQAB -----END PUBLIC KEY-----
同理,我們還可以再把node1的minion端加進來,即自己(master)給自己(minion)認證也是可以的。這樣我們就有兩個minion端和一個master端。※
結果如下:
[root@saltstack-node1 ~]# salt-key #有兩個minion端 Accepted Keys: saltstack-node1.example.com saltstack-node2.example.com Denied Keys: Unaccepted Keys: Rejected Keys:
1.1.6 salt-key命令的用法
[root@saltstack-node1 ~]# salt-key --help#查命令的幫助 -a ACCEPT, --accept=ACCEPT#接受指定的minion端 -A, --accept-all Accept all pending keys#接受所有的minion端 -r REJECT, --reject=REJECT#拒絕指定的minion端 -R, --reject-all Reject all pending keys#拒絕所有的minion端 -d DELETE, --delete=DELETE#刪除指定的minion端 -D, --delete-all Delete all keys#刪除所有的minion端 -L, --list-all List all public keys.#列出所有的minion端(salt-key) -P, --print-all Print all public keys#打印所有的公鑰
1.2 遠程執行
1.2.1 test.ping
[root@saltstack-node1 ~]# salt '*' test.ping 返回true,代表master能管理minion salt是一個固定的關鍵字 *代表要執行命令的目標,*代表匹配所有 test是一個模塊 .ping代表引用test模塊裏的一個方法 官方解釋:salt.modules.test.ping() Used to make sure the minion is up and responding. Not an ICMP ping.
1.2.2 cmd.run
1.2.2.1 例1:查看磁盤分區
[root@saltstack-node1 ~]# salt '*' cmd.run 'df -h' #在所有的minion端執行命令 cmd是一個模塊 .run代表引用cmd模塊裏的一個方法 'df -h'代表Linux裏的shell命令,命令要用單引號引起來 Execute the passed command(被傳遞的命令) and return the output as a string 執行一個被傳遞過去的命令,並以字符串的形式返回輸出 cmd.run,這個模塊的功能非常強大,可以執行所有的linux命令,在生產環境中,慎用!
1.2.2.2 例2:查看IP
[root@saltstack-node1 ~]# salt '*' cmd.run 'ifconfig eth0|grep "inet addr:"' #查看所有minion端的ip
1.2.2.3 例3:查看指定的minion
[root@saltstack-node1 ~]# salt 'saltstack-node1.example.com' cmd.run 'uptime' #指定固定的管理目標(minion),這裏寫的是minion_id
1.3 配置管理
1.3.1 指定file_roots
[root@saltstack-node1 ~]# cd /etc/salt/ [root@saltstack-node1 salt]# vim master#指定base的文件根路徑 #直接搜索【file_root】,把註釋行去掉,注意寫法,多少個空格是固定好的! #兩個空格爲一個級別 file_roots: base: - /srv/salt [root@saltstack-node1 salt]# /etc/init.d/salt-master restart#修改後要重啓
1.3.2 編寫top.sls
[root@saltstack-node1 salt]# mkdir -p /srv/salt/#創建base的文件根路徑 [root@saltstack-node1 salt]# cd /srv/salt/ [root@saltstack-node1 salt]# vim top.sls #指定狀態描述文件【apache】 base: '*':#對所有的minion端生效 - apache#文件名,可以不寫後綴sls
1.3.3 創建狀態描述文件
[root@saltstack-node1 salt]# vim apache.sls #狀態描述文件【apache】的內容 apache-service:#ID名稱 pkg.installed:#分別是模塊.方法 - names:#指定包名,下面指定兩個,注意有s - httpd#安裝httpd包 - httpd-devel#安裝httpd-devel包
1.3.4 遠程執行
[root@saltstack-node1 salt]# salt '*' state.highstate#遠程安裝httpd包
saltstack-node1.example.com:
----------
ID: apache-service#ID名稱
Function: pkg.installed#功能:模塊.方法
Name: httpd#第1個軟件包
Result: True#安裝成功
Comment: Package httpd is already installed.
Started: 17:37:28.053740
Duration: 559.351 ms
Changes:
----------
ID: apache-service#ID名稱
Function: pkg.installed#功能:模塊.方法
Name: httpd-devel#第2個軟件包
Result: True#安裝成功
Comment: Package httpd-devel is already installed.
Started: 17:37:28.613244
Duration: 0.504 ms
Changes:
Summary
------------
Succeeded: 2#成功,兩個
Failed: 0#失敗,無
------------
Total states run: 2
saltstack-node2.example.com:
----------
ID: apache-service
Function: pkg.installed
Name: httpd
Result: True
Comment: Package httpd is already installed.
Started: 17:37:38.054029
Duration: 551.308 ms
Changes:
----------
ID: apache-service
Function: pkg.installed
Name: httpd-devel
Result: True
Comment: Package httpd-devel is already installed.
Started: 17:37:38.605549
Duration: 0.42 ms
Changes:
Summary
------------
Succeeded: 2
Failed: 0
------------
Total states run: 2
1.3.4.1 檢查
[root@saltstack-node1 salt]# rpm -qa httpd*#檢查是否成功安裝 httpd-2.2.15-54.el6.centos.x86_64 httpd-devel-2.2.15-54.el6.centos.x86_64 httpd-tools-2.2.15-54.el6.centos.x86_64 [root@saltstack-node2 ~]# rpm -qa httpd*#檢查是否成功安裝 httpd-devel-2.2.15-54.el6.centos.x86_64 httpd-tools-2.2.15-54.el6.centos.x86_64 httpd-2.2.15-54.el6.centos.x86_64
1.3.5 修改狀態描述文件
安裝好軟件包後,我們可以監控軟件的運行狀態,強制指定軟件必須運行。
[root@saltstack-node1 salt]# cd /srv/salt/ [root@saltstack-node1 salt]# cat apache.sls#修改 apache-service: pkg.installed: - names: - httpd - httpd-devel service.running: - name: httpd - enable: True [root@saltstack-node1 salt]# salt '*' state.highstate#遠程執行 #只看關鍵部分 saltstack-node2.example.com: ---------- ID: apache-service Function: service.running Name: httpd Result: True Comment: Service httpd has been enabled, and is running Started: 17:53:42.105291 Duration: 171.491 ms Changes: ---------- httpd: True
[root@saltstack-node1 salt]# netstat -tunlp|grep 80 tcp 0 0 :::80 :::* LISTEN 32449/httpd #所有的minion端全部啓動apache [root@saltstack-node2 ~]# netstat -tunlp |grep 80 tcp 0 0 :::80 :::* LISTEN 3661/httpd