saltstack 入門


1、Saltstack是什么?

saltstack 是一個異構平台基礎設施管理工具,具有遠程執行、配置管理、雲管理、只需花費數分鍾就可以運行起來,擴展性足以支撐上萬台服務器,速度快,服務器之間秒級通訊數秒鍾即可完成數據傳遞。

Saltstack三大功能

  • 遠程執行
  • 配置管理(狀態)
  • 雲管理

Saltstack四種運行方式

  local  本地運行

  minion/master 傳統方式運行

  syndic   分布式

  salt SSH

Saltstack常用網址

saltstack官方網站

saltstack官方文檔

2、Saltstack快速安裝

實驗環境

[root@salt0-master yum.repos.d]# uname -a   //內核參數
Linux salt0-master 3.10.0-862.el7.x86_64 #1 SMP Fri Apr 20 16:44:24 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
[root@salt0-master yum.repos.d]# hostname   //主機名
salt0-master
[root@salt0-master yum.repos.d]# hostname -I  //主機ip
10.0.0.51 172.16.1.51 
[root@salt0-master yum.repos.d]# cat /etc/redhat-release  //系統版本
CentOS Linux release 7.5.1804 (Core) 
虛擬機我給了一核一G,好像有點卡,不過不影響。

  1、配置salt官方阿里雲yum倉庫

[root@salt0-master ~]# yum install -y  \
https://mirrors.aliyun.com/saltstack/yum/redhat/salt-repo-latest-2.el7.noarch.rpm

[root@salt0-master ~]# sed -i \
"s/repo.saltstack.com/mirrors.aliyun.com\/saltstack/g" /etc/yum.repos.d/salt-latest.repo
[root@salt0-master ~]# yum makecache

注:要確保主機名與文檔一致  

配置完后,安裝Matser,啟動服務

[root@salt0-master ~]# yum install salt-master -y
[root@salt0-master ~]# systemctl enable salt-master
[root@salt0-master ~]# systemctl start salt-master

查看端口

[root@master yum.repos.d]# systemctl start salt-master
[root@master yum.repos.d]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      938/sshd            
tcp        0      0 0.0.0.0:4505            0.0.0.0:*               LISTEN      1679/python         
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      1022/master         
tcp        0      0 0.0.0.0:4506            0.0.0.0:*               LISTEN      1685/python         
tcp6       0      0 :::3307                 :::*                    LISTEN      933/mysqld          
tcp6       0      0 :::3308                 :::*                    LISTEN      934/mysqld          
tcp6       0      0 :::3309                 :::*                    LISTEN      936/mysqld          
tcp6       0      0 :::3310                 :::*                    LISTEN      940/mysqld          
tcp6       0      0 :::22                   :::*                    LISTEN      938/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      1022/master         

  2、安裝salt-minion指向salt-master 網絡地址  

 新起一台機器,安裝salt-minion

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

#配置master地址或主機名, 建議使用主機名方式
[root@salt1-minion ~]# sed -i '/master: /c\master: salt0-master' /etc/salt/minion
[root@salt1-minion ~]# systemctl enable salt-minion
[root@salt1-minion ~]# systemctl start salt-minion

  安裝時出現的報錯

Error: Package: salt-2018.3.3-1.el7.noarch (salt-latest)
           Requires: systemd-python
Error: Package: salt-master-2018.3.3-1.el7.noarch (salt-latest)
           Requires: systemd-python
Error: Package: python-urllib3-1.10.2-1.el7.noarch (salt-latest)
           Requires: python-backports-ssl_match_hostname
Error: Package: python-tornado-4.2.1-1.el7.x86_64 (salt-latest)
           Requires: python-backports-ssl_match_hostname
 You could try using --skip-broken to work around the problem
 You could try running: rpm -Va --nofiles --nodigest

解決辦法:

  查看本地的/ect/yum.repos.d/目錄下是否有Base源,如果沒有,去阿里雲鏡像網站,下載centos7系統的base源,安裝完成即可解決。

安裝完成salt-minion 查看 進程

[root@salt1-minion ~]# ps aux |  grep salt
root       1733  1.2  1.5 234856 15632 ?        Ss   09:51   0:00 /usr/bin/python /usr/bin/salt-minion
root       1736  4.1  2.6 530784 26416 ?        Sl   09:51   0:00 /usr/bin/python /usr/bin/salt-minion
root       1764  0.0  0.0 112704   968 pts/0    R+   09:51   0:00 grep --color=auto salt

  3、salt-master主機驗證

[root@salt0-master yum.repos.d]# salt-key
Accepted Keys:
Denied Keys:
Unaccepted Keys:
salt1-minion
Rejected Keys:

 如啟動發生故障,查看saltstack相關日志:

#服務端日志
[root@salt0-master ~]# tail -f /var/log/salt/master
#客戶端日志
[root@salt1-minion ~]# tail -f /var/log/salt/minion

3、Saltstack的認證方式

saltstack是如何進行master主機和minion連接控制的呢?首先,salt的數據傳輸是通過AES加密的,master和minion之間在通信之前,需要進行認證操作。

salt通過認證的方式保證安全性,完成一次認證后,master就可以控制minion來完成各項工作了。

  1、在Minion第一次啟動時,會在/etc/salt/pli/minion/下自動生成 minion.pem (也就是private key 私鑰)和 minion.pub (public key 公鑰)然后將 minion.pub 發送給master

[root@salt1-minion ~]# tree /etc/salt/
/etc/salt/
├── minion
├── minion.d
├── minion_id
└── pki
    └── minion
 ├── minion.pem └── minion.pub

  2、在master第一次啟動時,會在 /etc/salt/pki/master/ 下自動生成 master.pemmaster.pub 接收到 minion 的 public key ,會在 master 的 /ect/salt/pki/master/minions 目錄下 存放以 minion id 命名的 public key 同時 minion 會保存一份 master public key 在 /etc/salt/pki/minion_master.pub

[root@salt1-minion ~]# tree /etc/salt/
/etc/salt/
├── minion
├── minion.d
│   └── _schedule.conf
├── minion_id
└── pki
    └── minion
 ├── minion_master.pub ├── minion.pem └── minion.pub

salt認證原理的小結:

minion 將 自己的公鑰 發送給 master

master 認證 之后將自己的公鑰 也放置在minion 端

 

4、Master端key認證示例

[root@linux-node1 ~]# salt-key -L
Accepted Keys:   #已經接受的key
Denied Keys:     #拒絕的key
Unaccepted Keys: #未加入的key
Rejected Keys:   #吊銷的key

#常用參數
-L  #查看KEY狀態
-A  #允許所有
-D  #刪除所有
-a  #認證指定的key
-d  #刪除指定的key
-r  #注銷掉指定key(該狀態為未被認證)

#在master端/etc/salt/master配置
auto_accept: True   #如果對Minion信任,可以配置master自動接受請求

#添加指定minion的key [root@salt0-master ~]# salt-key -a salt1-minion.example.com -y #添加所有minion的key [root@salt0-master ~]# salt-key -A -y #刪除指定的key [root@salt0-master ~]# salt-key -d salt1-minion.example.com -y #刪除所有的key [root@salt0-master ~]# salt-key -D -y

salt-key 的使用

[root@salt0-master ~]# salt-key -a salt1-minion  -y   //添加 salt1-minion 到accepted key
The following keys are going to be accepted:
Unaccepted Keys:
salt1-minion
Key for minion salt1-minion accepted.
[root@salt0
-master ~]# salt-key -L //如下表示添加成功 Accepted Keys: salt1-minion Denied Keys: Unaccepted Keys: Rejected Keys:

查看公鑰是否添加

[root@salt0-master ~]# tree /etc/salt/
/etc/salt/
├── cloud
├── cloud.conf.d
├── cloud.deploy.d
├── cloud.maps.d
├── cloud.profiles.d
├── cloud.providers.d
├── master
├── master.d
├── minion
├── minion.d
├── pki
│   ├── master
│   │   ├── master.pem
│   │   ├── master.pub
│   │   ├── minions │   │   │   └── salt1-minion
│   │   ├── minions_autosign
│   │   ├── minions_denied
│   │   ├── minions_pre
│   │   └── minions_rejected
│   └── minion
├── proxy
├── proxy.d
└── roster

5、Saltstack遠程執行初識

判斷salt的minion 主機是否存活

[root@salt0-master ~]# salt '*' test.ping
salt1-minion:
    True
# salt 是一個命令 # * 表示目標主機, 在這里代表所有目標主機 # test.ping是salt遠程執行的一個模塊下面的方法。

saltstack可以使用cmd.run 模塊 遠程執行 shell命令

//讓指定目標Minion節點運行uptime命令
[root@salt0-master ~]# salt 'salt1-minion' cmd.run 'uptime'
salt1-minion:
     11:00:15 up  1:41,  1 user,  load average: 0.00, 0.01, 0.05
# Salt提供了大量的模塊執行不同的操作, 不建議生產頻繁使用cmd.run

cmd.run 這個模塊很強大,什么命令都可以執行,比如說創建一個/backup目錄

[root@salt0-master ~]# salt 'salt1-minion' cmd.run 'mkdir /backup'   //第一次創建
salt1-minion:
    mkdir: cannot create directory '/backup': File exists   //提示目錄已存在
ERROR: Minions returned with non-zero exit code
[root@salt0-master ~]# salt 'salt1-minion' cmd.run 'mkdir /test'  //什么都不提示,則代表創建成功
salt1-minion:
[root@salt0-master ~]# salt 'salt1-minion' cmd.run 'll /test'   //如果命令輸入錯誤,提示報錯
salt1-minion:
    /bin/sh: ll: command not found
ERROR: Minions returned with non-zero exit code
[root@salt0-master ~]# salt 'salt1-minion' cmd.run 'ls -l  /test'  //查看成功
salt1-minion:
    total 0

所以,在生產中,盡量不要用cmd.run這個命令以防誤刪除等。

6、Saltstack 配置管理

salt 通過狀態模塊來識別配置描述文件 state 狀態文件,格式是 YAML  擴展名后綴是 .sls

1.YAML 基礎語法

YAML:
    1.縮進(層級關系)  2個空格,不能試用Tab。
    2.冒號  key: value
    3.短橫線 - list1
            - list2

1.縮進
  YAML使用一個固定的縮進風格表示數據層級結構關系,每個縮進由兩個空格組成, 不要使用tabs。
2.冒號
  以冒號結尾, 以冒號為路徑的除外,其他所有冒號后面所有必須有空格。
3.短橫線
  表示列表項,使用一個短橫杠加一個空格。
  多個項使用同樣的縮進級別作為同一列表。

2.YAML 配置,設置 base 環境

#定義基礎環境目錄位置
[root@salt0-master ~]# vim /etc/salt/master

663 # Example:
664 # file_roots:
665 # base:      //基礎環境目錄
666 # - /srv/salt/      
667 # dev:      //開發環境目錄
668 # - /srv/salt/dev/services
669 # - /srv/salt/dev/states
670 # prod:        //生產環境目錄
671 # - /srv/salt/prod/services
672 # - /srv/salt/prod/states
673 #


674 file_roots:    //練習的話只需配置基礎環境目錄
675   base:      //空 2 格
676     - /srv/salt    //空 4 格


#修改配置必須重啟服務
[root@salt0-master ~]# systemctl restart salt-master

3.編寫 YAML 語法文件

[root@salt0-master ~]# mkdir -p /srv/salt/app    //創建分類目錄,用於生產中,區分業務
[root@salt0-master ~]# cd /srv/salt/app
 
#編寫sls文件, apache安裝並啟動
[root@salt0-master app]# cat apache.sls       //書寫時,注意YAML語法格式
apache-install: 
  pkg.installed:
    - name: httpd

apache-systemctl:
  service.running:
    - name: httpd
    - enable: True

其他的 sls 文件,練習 vsftpd

#編寫sls文件, vsftpd安裝並啟動
[root@salt0-master app]# cat vsftpd.sls 
vsftpd_install:
  pkg.installed:
    - names:
      - vsftpd
      - httpd-tools

vsftpd_systemctl:
  service.running:
    - name: vsftpd
    - enable: True

練習 nginx 安裝啟動

#編寫sls文件, nginx安裝並啟動
[root@salt0-master app]# cat nginx.sls
nginx-install:
  pkg.installed:
    - name: nginx

nginx-systemctl:
  service.running:
    - name: nginx

4.使用 salt 命令的 state 狀態模塊 讓所有的 minion 都應用該配置

[root@salt0-master app]# salt '*' state.sls app.apache

 注: salt 是命令, * 是指 全部主機, state.sls  是狀態模塊 , app.apache 是文件名字

 溫馨提示:

在操作之前可以加上 test=True ,這個是驗證操作,比如說 sed 和 sed -i  的意思。不會真的執行,模擬執行一遍,會出現黃色的字體,屬於正常現象。

 

5.查看是否運行成功,如下則成功

[root@salt0-master app]# salt '*' state.sls app.apache
salt1-minion:
----------
         ID: apache-install Function: pkg.installed Name: httpd Result: True Comment: The following packages were installed/updated: httpd Started: 13:15:37.094711 Duration: 15305.052 ms Changes: ---------- apr: ---------- new: 1.4.8-3.el7_4.1 old: apr-util: ---------- new: 1.5.2-6.el7 old: httpd: ---------- new:  2.4.6-80.el7.centos.1 old: httpd-tools: ---------- new:  2.4.6-80.el7.centos.1 old: mailcap: ---------- new:  2.1.41-2.el7 old: ---------- ID: apache-systemctl Function: service.running Name: httpd Result: True Comment: Service httpd has been enabled, and is running Started: 13:15:52.420757 Duration: 732.984 ms Changes: ---------- httpd: True Summary for salt1-minion ------------ Succeeded: 2 (changed=2) Failed: 0 ------------ Total states run: 2 Total run time: 16.038 s oldboy.com: ---------- ID: apache-install Function: pkg.installed Name: httpd Result: True Comment: The following packages were installed/updated: httpd Started: 13:15:40.262922 Duration: 19089.429 ms Changes: ---------- apr: ---------- new: 1.4.8-3.el7_4.1 old: apr-util: ---------- new: 1.5.2-6.el7 old: httpd: ---------- new: 2.4.6-80.el7.centos.1 old: httpd-tools: ---------- new: 2.4.6-80.el7.centos.1 old: mailcap: ---------- new:  2.1.41-2.el7 old: ---------- ID: apache-systemctl Function: service.running Name: httpd Result: True Comment: Service httpd has been enabled, and is running Started: 13:15:59.465455 Duration: 1764.248 ms Changes: ---------- httpd:  True  Summary for oldboy.com ------------ Succeeded: 2 (changed=2) Failed: 0 ------------ Total states run: 2 Total run time: 20.854 s

注:其實在 master 主機上執行 salt 命令就是在 minion 上調用 服務,比如下載nginx ,我們在minion 上可以用 ps aux | grep yum  查看到  正在用 yum install nginx 下載。 

查看 minion 主機 80端口是否開啟

[root@salt1-minion ~]# netstat -lntup
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      911/sshd            
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      992/master          
tcp6 0      0 :::80                   :::*                    LISTEN      3597/httpd       
tcp6       0      0 :::22                   :::*                    LISTEN      911/sshd            
tcp6       0      0 ::1:25                  :::*                    LISTEN      992/master          

7、Saltstack 高級狀態模塊

如果想不同的主機應用不同的配置, 則需要使用到   salt 高級狀態模塊

 687 #top_file_merging_strategy: merge
 688 
 689 # To specify the order in which environments are merged, set the ordering
 690 # in the env_order option. Given a conflict, the last matching value will
 691 # win.
 692 #env_order: ['base', 'dev', 'prod']
 693 
 694 # If top_file_merging_strategy is set to 'same' and an environment does not
 695 # contain a top file, the top file in the environment specified by default_top
 696 # will be used instead.
 697 #default_top: base      //默認的是base

當使用salt命令執行高級狀態, 會將topfile當做入口文件,進行調用

編寫 topfile 文件

# topfile入口文件只能放置在base環境

[root@salt0-master salt]# cat top.sls
base:
  'salt1-minion':    //第一台機器執行app.nginx
    - app.nginx
  'oldboy.com':     //第二台機器執行app.nginx 和 app.apache  
    - app.nginx
    - app.apache

執行命令將應用發送給所有主機

[root@salt0-master salt]# salt '*' state.highstate    //高級狀態調用的是 state.highstate ,字面意思就是 高級狀態  

然后我們就會看到,每台主機都是按照當時設定的安裝不同的服務。

小結:

   1.首先確定 top 文件和 top 文件里執行的那些文件 都是在base環境下的。

   2.使用state.highstate 就會第一個先找到top.sls。

8、Saltstack 消息隊列

 Saltstack 可以支撐數以千計,甚至更多的服務器,這些性能主要來自於ZeroMq ,因為saltstack的底層是基於 zeromq 進行高效的網絡通信。zeromq是一個簡單好用的傳輸層,像框架一樣的一個套接字庫,他使得socket 編程更加簡單,簡潔 和性能更高。

發布與訂閱

zeromq 支持 publish 和 subscribe 即 發布與訂閱模式,

Salt Master運行兩個網絡服務
一個是 ZeroMQ PUB 消息發布與訂閱系統,默認監聽 4505 端口, 主要用於 Master 對 Minion 下發指令

#所有的Minion連接到Master的4505端口TCP狀態持續保持為ESTABLISHED
[root@linux-node1]# yum install lsof -y

[root@salt0-master salt]# lsof -i :4505
COMMAND    PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
salt-mast 1342 root   16u  IPv4  21583      0t0  TCP *:4505 (LISTEN)
salt-mast 1342 root   18u  IPv4  25484      0t0  TCP db01:4505->db02:49986 (ESTABLISHED)
salt-mast 1342 root   19u  IPv4  25489      0t0  TCP db01:4505->172.16.1.53:33990 (ESTABLISHED)
注意: 可以修改/etc/salt/master配置文件的publish_port參數設置端口。

請求與響應

ZeroMQ支持Request-Reply請求與響應模式,簡稱REQ/REP

 

 

 

 

 

 

 

 

 Salt Master運行的第二個網絡服務就是ZeroMQ REP系統,默認監聽4506端口salt客戶端與服務端通信的端口
同時也主要用於Master接收Minion執行某個命令后的返回值

注意: 可以修改/etc/salt/master配置文件的ret_port參數設置。

顯示SaltStack進程名稱方式

[root@linux-node1]# yum install -y python-setproctitle
[root@linux-node1]# ps aux | grep salt
/usr/bin/salt-master -d ProcessManager  #中心進程管理器
/usr/bin/salt-master -d _clear_old_jobs  #清除舊的Jobs文件及更新fileserver
/usr/bin/salt-master -d Publisher       #將任務PUB到Minion端
/usr/bin/salt-master -d EventPublisher  #Event Publisher進程
/usr/bin/salt-master -d ReqServer_ProcessManager #ReqServer進程管理器
/usr/bin/salt-master -d MWorker  #工作進程
/usr/bin/salt-master -d MWorker  #工作進程
/usr/bin/salt-master -d MWorker  #工作進程
/usr/bin/salt-master -d MWorker  #工作進程
/usr/bin/salt-master -d MWorker  #工作進程
/usr/bin/salt-master -d MWorkerQueue #將Ret接口(ROUTER)數據轉發到Worker(DEALER)

9、Saltstack 常用配置

salt master 配置

Salt Master端的配置是修改/etc/salt下master配置文件。以下是Master端常用的配置。

interface: //指定bind 的地址(默認為0.0.0.0)
publish_port: //指定發布端⼝(默認為4505)
ret_port: //指定結果返回端⼝,  與minion配置⽂件中的master_port對應(默認為4506)
user: //指定master進程的運⾏⽤戶,如果調整, 則需要調整部分目錄的權限(默認為root)
timeout: //指定timeout時間,  如果minion規模龐⼤或⺴絡狀況不好,建議增⼤該值(默認5s)
keep_jobs: //minion執⾏結果返回master, master會緩存到本地的cachedir目錄,該參數指定緩存多⻓時間,可查看之間執行結果會占⽤磁盤空間(默認為24h)
job_cache: //master是否緩存執⾏結果,如果規模龐⼤(超過5000台),建議使⽤其他⽅式來存儲jobs,關閉本選項(默認為True)
file_recv : //是否允許minion傳送⽂件到master 上(默認是Flase)
file_roots: //指定file server目錄,  默認為:
    file_roots:    
       base:    
        - /srv/salt  
pillar_roots : //指定pillar ⺫錄,  默認為:
    pillar_roots:     
      base:     
        - /srv/pillar     
log_level: //⽇志級別
⽀持的⽇志級別有'garbage', 'trace', 'debug', info', 'warning', 'error', ‘critical ’ ( 默認為’warning’)

Salt Minion配置
Minion端配置非常簡單,一般只需要修改兩個配置即可。

[root@minion ~]# vim /etc/salt/minion
master: 192.168.56.11 //修改master為master的IP地址
id: //客戶端的id,默認不設置會取客戶端的完整主機名

Salt Minion端常用配置

master: //指定master 主機(默認為salt)
master_port: //指定認證和執⾏結果發送到master的哪個端⼝,  與master配置⽂件中的ret_port對應(默認為4506)
id: //指定本minion的標識, salt內部使⽤id作為標識(默認為主機名)
user: //指定運⾏minion的⽤戶.由於安裝包,啟動服務等操作需要特權⽤戶, 推薦使⽤root( 默認為root)
cache_jobs : //minion是否緩存執⾏結果(默認為False)
backup_mode: //在⽂件操作(file.managed 或file.recurse) 時,  如果⽂件發⽣變更,指定備份目錄.當前有效
providers : //指定模塊對應的providers, 如在RHEL系列中, pkg對應的providers 是yumpkg5
renderer: //指定配置管理系統中的渲染器(默認值為:yaml_jinja )
file_client : //指定file clinet 默認去哪⾥(remote 或local) 尋找⽂件(默認值為remote)
loglevel: //指定⽇志級別(默認為warning)
tcp_keepalive : //minion 是否與master 保持keepalive 檢查, zeromq3(默認為True)

 


免責聲明!

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



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