Saltstack自動化操作記錄(1)-環境部署


 

早期運維工作中用過稍微復雜的Puppet,下面介紹下更為簡單實用的Saltstack自動化運維的使用。

Saltstack知多少
Saltstack是一種全新的基礎設施管理方式,是一個服務器基礎架構集中化管理平台,幾分鍾內便可運行起來,速度夠快,服務器之間秒級通訊,擴展性好,很容易批量管理上萬台服務器,顯著降低人力與運維成本;它具備配置管理、遠程執行、監控等功能,一般可以理解為簡化版的puppet和加強版的func;通過部署SaltStack環境,可以在成千上萬台服務器上做到批量執行命令,根據不同業務特性進行配置集中化管理、分發文件、采集服務器數據、操作系統基礎及軟件包管理等,SaltStack是運維人員提高工作效率、規范業務配置與操作的利器。SaltStack基於Python語言實現,結合輕量級消息隊列(ZeroMQ)(SaltStack的通信模式總共分為2種模式:ZeroMQ、REAT,鑒於REAT目前還不是太穩定,通常會選擇ZeroMQ模式)與Python第三方模塊(Pyzmq、PyCrypto、Pyjinjia2、python-msgpack和PyYAML等)構建。

Saltstack運行模式
Local:本地,一台機器玩,不建議
Master/Minion:通過server/agent的方式進行管理,效率很高(批量管理1000台機器,25秒搞定)
Salt SSH:通過SSH方式進行管理,效率相對來說比較低(批量管理1000台機器,83秒搞定)

Saltstack三大功能
遠程執行(執行遠程命令)
配置管理(狀態管理)
雲管理

Saltstack特征
1)部署簡單、方便;
2)支持大部分UNIX/Linux及Windows環境;
3)主從集中化管理;
4)配置簡單、功能強大、擴展性強;
5)主控端(master)和被控端(minion)基於證書認證,安全可靠;
6)支持API及自定義模塊,可通過Python輕松擴展。

Master與Minion認證
1)minion在第一次啟動時,會在/etc/salt/pki/minion/(該路徑在/etc/salt/minion里面設置)下自動生成minion.pem(private key)和 minion.pub(public key),然后將 minion.pub發送給master。
2)master在接收到minion的public key后,通過salt-key命令accept minion public key,這樣在master的/etc/salt/pki/master/minions下的將會存放以minion id命名的 public key,然后master就能對minion發送指令了。

Master與Minion的連接
1)SaltStack master啟動后默認監聽4505和4506兩個端口。4505(publish_port)為saltstack的消息發布系統,4506(ret_port)為saltstack客戶端與服務端通信的端口。如果使用lsof 查看4505端口,會發現所有的minion在4505端口持續保持在ESTABLISHED狀態。

2)minion與master之間的通信模式如下

SaltStack基礎環境安裝與配置記錄
英文文檔參考:https://docs.saltstack.com/en/latest/
兩台centos6.8系統的機器,其中:
192.168.1.101  linux-node1  做主控端 master
192.168.1.102  linux-node2  做被控端 minion

1)兩台機器的主機名要固定統一,要能相互ping通

固定好master和minion機器名,然后在master機器上做hosts綁定:
[root@linux-node1 ~]# cat /etc/hosts
127.0.0.1   localhost wutao localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.1.101  linux-node1 
192.168.1.102  linux-node2

2)下面采用源碼安裝的方式

a) master端安裝 (為了測試效果,服務端也安裝minion)
[root@linux-node1 ~]# wget http://ftp.linux.ncsu.edu/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@linux-node1 ~]# rpm -ivh epel-release-6-8.noarch.rpm --force
[root@linux-node1 ~]# yum -y install salt-master
[root@linux-node1 ~]# yum -y install salt-minion
[root@linux-node1 ~]# chkconfig salt-master on
[root@linux-node1 ~]# chkconfig salt-minion on 

b) minion端安裝
[root@linux-node2 ~]# wget http://ftp.linux.ncsu.edu/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
[root@linux-node2 ~]# rpm -ivh epel-release-6-8.noarch.rpm --force
[root@linux-node2 ~]# yum -y install salt-minion
[root@linux-node2 ~]# chkconfig salt-minion on

3)SaltStack配置
a)master端的配置
[root@linux-node1 ~]# vim /etc/salt/master        //修改下面幾行 (由於這個文件內容默認全部注釋的,所以可以直接情清空該文件,然后復制下面內容。但是記住配置的格式不能錯!!)                         
interface: 192.168.1.101    //綁定主控端master的ip,冒號后必須空一格
auto_accept: True             //當該項配置成True時表示自動認證,就不需要手動運行salt-key命令進行證書信任
file_roots:                          //指定saltstack文件根目錄位置
  base:                              //前面必須留兩個空格  
      - /srv/salt                    //前面必須留四個空格
[root@linux-node1 ~]# service salt-master start
Starting salt-master daemon: [ OK ]
[root@linux-node1 salt-2014.7.0]# netstat -ntlp
.......
tcp 0 0 192.168.1.101:4505 0.0.0.0:* LISTEN 12715/python
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1356/master
tcp 0 0 192.168.1.101:4506 0.0.0.0:* LISTEN 12727/python
......
[root@linux-node1 ~]# ps aux | grep python
root 8428 0.0 0.2 111704 8956 ? Ss Jan05 26:14 /data/paas/env/bin/python /data/paas/env/bin/supervisord -c /data/paas/open_paas/bin/supervisord.conf
root 12713 0.0 0.5 281772 22060 ? S 17:39 0:00 /usr/local/bin/python /usr/bin/salt-master -d
root 12714 0.7 0.9 319760 35700 ? S 17:39 0:00 /usr/local/bin/python /usr/bin/salt-master -d
root 12715 0.0 0.5 367796 22136 ? Sl 17:39 0:00 /usr/local/bin/python /usr/bin/salt-master -d
root 12716 0.0 0.5 367796 21912 ? Sl 17:39 0:00 /usr/local/bin/python /usr/bin/salt-master -d
root 12717 0.0 0.5 281772 21728 ? S 17:39 0:00 /usr/local/bin/python /usr/bin/salt-master -d
root 12722 2.4 1.0 413304 40952 ? Sl 17:39 0:01 /usr/local/bin/python /usr/bin/salt-master -d
root 12723 2.4 1.0 413308 40956 ? Sl 17:39 0:01 /usr/local/bin/python /usr/bin/salt-master -d
root 12724 2.4 1.0 413300 40968 ? Sl 17:39 0:01 /usr/local/bin/python /usr/bin/salt-master -d
root 12725 2.4 1.0 413324 40972 ? Sl 17:39 0:01 /usr/local/bin/python /usr/bin/salt-master -d
root 12726 2.3 1.0 413304 40972 ? Sl 17:39 0:01 /usr/local/bin/python /usr/bin/salt-master -d
root 12727 0.0 0.5 670916 22380 ? Sl 17:39 0:00 /usr/local/bin/python /usr/bin/salt-master -d
root 13124 0.0 0.0 103312 880 pts/3 R+ 17:40 0:00 grep python

在主控端master上添加TCP 4505、TCP 4506的規則,而在被控端monion上就無需配置防火牆
原因是被控端直接與主控端的zeromq建立長連接,接收廣播到的任務信息並執行。
即master端的iptables里添加下面兩台規則:
[root@linux-node1 ~]# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 4505 -j ACCEPT
[root@linux-node1 ~]# iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 4506 -j ACCEPT
[root@linux-node1 ~]# iptables save
[root@linux-node1 ~]# /etc/init.d/iptables save
[root@linux-node1 ~]# /etc/init.d/iptables restart

b)minion端的配置(如果master端也想管控自己,可以配置自己的monion)
[root@linux-node2 ~]# vim /etc/salt/minion         //修改下面幾行                      
master: 192.168.1.101          //指定主控端master的ip地址,冒號后必須空一格
id: minion-192-168-1-102     //修改被控端monion主機識別id,建議使用主機名或ip來設置,冒號后必須空一格
[root@linux-node2 ~]# service salt-minion start
Starting salt-minion daemon: [ OK ]
[root@linux-node2 ~]# ps aux | grep python
root 16610 13.0 0.5 431116 23432 ? Sl 05:15 0:01 /usr/local/bin/python /usr/bin/salt-minion -d
root 16633 0.0 0.0 103312 884 pts/0 S+ 05:16 0:00 grep python

4)SaltStack使用說明(在master機器上操作)

sat-key命令說明:

[root@linux-node1 ~]# salt-key --help
--version            顯示版本號后退出
--versions-report    顯示程序的所有依賴包版本號,並退出
-h, --help           幫助信息
-c CONFIG_DIR, --config-dir=CONFIG_DIR    指定配置目錄,默認 :/etc/salt/
-q, --quiet          安靜模式,不輸出信息到控制台
-y, --yes            對所有詢問是否繼續,回答yes,默認:false
Logging Options:     設置loggin選項會覆蓋掉配置文件中對日志的配置.
--log-file=LOG_FILE      指定日志文件路徑,默認: /var/log/salt/key.
--log-file-level=LOG_LEVEL_LOGFILE   日志文件等級,可設置下面中的一個值 'all', 'garbage','trace', 'debug', 'info', 'warning', 'error', 'quiet'.默認: 'warning'.
--key-logfile=KEY_LOGFILE    將所有的輸出發送到指定的文件,默認: '/var/log/salt/key'

--out=OUTPUT, --output=OUTPUT    把salt-key命令的輸出信息發送給指定的outputer. 可設置為下面參數值 'no_return', 'virt_query'.'grains', 'yaml', 'overstatestage', 'json', 'pprint','nested', 'raw', 'highstate', 'quiet', 'key', 'txt',
--out-indent=OUTPUT_INDENT, --output-indent=OUTPUT_INDENT      設置輸出行縮進的空格數. 負數取消輸出縮進編排.僅對使用的outputer有效.
--out-file=OUTPUT_FILE, --output-file=OUTPUT_FILE       把顯示輸出到指定的文件
--no-color, --no-colour      關閉字體顏色
--force-color, --force-colour    強制開啟輸出顏色渲染

-l ARG, --list=ARG     打印公鑰key. 可設置下面三個值"pre", "un", and "unaccepted" 會顯示 不許可/未簽名 keys. "acc" or "accepted"會顯示 許可/已簽名 keys. "rej" or "rejected"會顯示拒絕的 keys.  "all" 會顯示所有 keys.
-L, --list-all         會顯示所有公鑰,相當月: "--list all"
-a ACCEPT, --accept=ACCEPT   許可指定的公鑰(使用--include-all選項,可以指定除了掛起的key外的所有reject狀態的公鑰)
-A, --accept-all    許可所有pending的公鑰
-r REJECT, --reject=REJECT    拒絕指定的公鑰 (使用--include-all選項可以指定除了掛起的key外的所有accept狀態的公鑰)
-R, --reject-all    拒接所有pending的公鑰
--include-all       配合 accepting/rejecting 選項使用,指定所有非pending狀態的公鑰
-p PRINT, --print=PRINT    打印指定的公鑰
-P, --print-all      Print all public keys
-d DELETE, --delete=DELETE    根據公鑰的名稱刪除公鑰
-D, --delete-all    刪除所有 keys
-f FINGER, --finger=FINGER      打印指定key的指紋信息
-F, --finger-all    打印所有key的指紋信息

Key 常用選項:
--gen-keys=GEN_KEYS       對生成的key配置設置一個salt使用的名稱。
--gen-keys-dir=GEN_KEYS_DIR     設置生成key對的放置目錄,默認當前目錄。default=.
--keysize=KEYSIZE        為生成key設置位數, 僅跟--gen-keys選項配合時有效,數值大小必須大於2048,否則會被提升至2048位,默認2048default=2048

a)查看當前的salt key信息
[root@linux-node1 ~]# salt-key -L      //或者直接salt-key
Accepted Keys:
minion-192-168-1-102
Unaccepted Keys:
Rejected Keys:

b)測試被控主機的連通性
[root@linux-node1 ~]# salt '*' test.ping
minion-192-168-1-102:
True

c)遠程命令執行(cmd模塊),格式:salt  'client配置的id' 模塊.方法  '命令參數'           (其中'*'表示所有的client)
[root@linux-node1 ~]# salt '*' cmd.run 'uptime'
minion-192-168-1-102:
21:51:44 up 61 days, 16:44, 2 users, load average: 0.79, 0.55, 0.47

[root@linux-node1 ~]# salt 'minion-192-168-1-102' cmd.run 'uptime'
minion-192-168-1-102:
22:11:50 up 61 days, 17:05, 2 users, load average: 0.44, 0.59, 0.63

[root@linux-node1 ~]# salt 'minion-192-168-1-102' cmd.run 'w'
minion-192-168-1-102:
22:14:20 up 61 days, 17:07, 2 users, load average: 0.46, 0.52, 0.59
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 124.165.97.64 04:50 57:20 0.32s 0.32s -bash
root pts/3 124.165.97.64 Mon20 8:46 0.20s 0.20s -bash
[root@linux-node1 ~]# salt 'minion-192-168-1-102' cmd.run 'who'
minion-192-168-1-102:
root pts/0 Feb 7 04:50 (124.165.97.64 )
root pts/3 Feb 6 20:41 (124.165.97.64 )

[root@linux-node1 ~]# salt '*' cmd.run 'df -h'
minion-192-168-1-102:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
8.1G 6.8G 901M 89% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/vda1 190M 67M 113M 38% /boot
[root@linux-node1 ~]# salt '*' cmd.run 'touch /root/test'
minion-192-168-1-102:
[root@linux-node1 ~]# salt '*' cmd.run 'echo "monion-server" >> /root/test'
minion-192-168-1-102:
到monion機器上查看是否有/root/test文件創建及其內容
[root@linux-node2 ~]# ll /root/test
-rw-r--r--. 1 root root 0 Feb 7 21:51 /root/test
[root@linux-node2 ~]# cat /root/test
monion-server

遠程批量傳輸文件(salt-cp命令)
下面表示將master主控端的/mnt/aa文件傳輸到所有minion被控端的/opt下
[root@linux-node1 ~]# salt-cp '*' /mnt/aa /opt/
{'minion-192-168-1-102': {'/opt/aa': True}}

注意上面命令只用於文件的傳輸,目錄的傳輸需要用到cp模塊,模塊用法詳見Saltstack自動化操作記錄(2)-模塊使用

---------------------------------------------------------順便說一下-------------------------------------------------------
minion端的認證

當/etc/salt/master文件里沒有配置auto_accept:True時,需要通過salt-key命令來進行證書認證操作,其中:
salt-key -L:顯示已經或未認證的被控端id,Acceptd Keys為已認證清單,Unaccepted Keys為未認證清單
salt-key -D:刪除所有認證主機id證書
salt-key -d id:刪除單個id證書
salt-key -A:接受所有id證書請求
salt-key -a id:接受單個id證書請求

minion啟動的時候會創建KEY
[root@linux-node2 ~]# ll /etc/salt/pki/minion/
total 12
-rw-r--r--. 1 root root 800 Feb 7 05:16 minion_master.pub
-r--------. 1 root root 3247 Feb 7 05:16 minion.pem
-rw-r--r--. 1 root root 800 Feb 7 05:16 minion.pub

master啟動的時候會創建KEY
[root@linux-node1 ~]# ll /etc/salt/pki/master/
total 28
-r--------. 1 root root 3243 Feb 7 17:39 master.pem
-rw-r--r--. 1 root root 800 Feb 7 17:39 master.pub
drwxr-xr-x. 2 root root 4096 Feb 8 12:02 minions
drwxr-xr-x. 2 root root 4096 Feb 7 17:39 minions_autosign
drwxr-xr-x. 2 root root 4096 Feb 7 17:39 minions_denied
drwxr-xr-x. 2 root root 4096 Feb 7 17:39 minions_pre
drwxr-xr-x. 2 root root 4096 Feb 7 17:39 minions_rejected

先檢查一下所有的key信息,發現沒有等待統一的key(Unaccepted Keys下面沒有信息)
[root@linux-node1 master]# salt-key
Accepted Keys:
minion-192-168-1-102
Unaccepted Keys:
Rejected Keys:

模擬等待同意的Key:把minions目錄下的文件傳輸到minions_pre目錄下
[root@linux-node1 ~]# ll /etc/salt/pki/master/minions
total 4
-rw-r--r--. 1 root root 800 Feb 8 12:02 minion-192-168-1-102
[root@linux-node1 ~]# cp /etc/salt/pki/master/minions/* /etc/salt/pki/master/minions_pre/
[root@linux-node1 ~]# ll /etc/salt/pki/master/minions_pre/
total 4
-rw-r--r--. 1 root root 800 Feb 8 12:07 minion-192-168-1-102

再次查看key,發現有了等待同意的key
[root@linux-node1 ~]# salt-key
Accepted Keys:
minion-192-168-1-102
Unaccepted Keys:
minion-192-168-1-102
Rejected Keys:

執行同意操作:-A選項表示全部同意
[root@linux-node1 ~]# salt-key -A
The following keys are going to be accepted:
Unaccepted Keys:
minion-192-168-1-102
Proceed? [n/Y] y
[root@linux-node1 ~]# salt-key //發現key已經被同意了
Accepted Keys:
minion-192-168-1-102
Unaccepted Keys:

如果不用上面的-A選項,可以使用-a選項,自定義匹配,也可以使用*通配符。上面命令也可以是:
[root@linux-node1 ~]# salt-key -a minion-*
The following keys are going to be accepted:
Unaccepted Keys:
minion-192-168-1-102
Proceed? [n/Y] y

通過認證的主機位置會發生改變,原本在minion_pre下面(yum install -y tree )
[root@linux-node1 ~]# tree /etc/salt/pki/master/
/etc/salt/pki/master/
├── master.pem
├── master.pub
├── minions
│   └── minion-192-168-1-102
├── minions_autosign
├── minions_denied
├── minions_pre
└── minions_rejected

5 directories, 3 files

其實上面的master下面minion中的文件是minion端的公鑰,同時在master認證通過的時候,master也偷偷的把他的公鑰放到了minion端一份。用事實說話,在minion端上查看。
[root@linux-node2 ~]# ll /etc/salt/pki/minion/
總用量 12
-rw-r--r-- 1 root root 451 12月 28 23:11 minion_master.pub
-r-------- 1 root root 1675 12月 28 23:03 minion.pem
-rw-r--r-- 1 root root 451 12月 28 23:03 minion.pub
----------------------------------------------------------------------------------------------------------------------------------------


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM