1. 程式人生 > 實用技巧 >SaltStack配置管理

SaltStack配置管理

目錄

SaltStack配置管理

遠端執行模組的執行是過程式,而狀態是對minion的一種描述和定義,管理人員不需要關係部署任務如何完成的,只需要描述minion的狀態描述。

它的核心是寫sls(Salt State file)檔案,sls檔案預設格式為YAML格式,並預設使用jinja模板,jinja是根據django的模板語言發展而來的語言,簡單並強大,支援for if等迴圈語句。salt state主要用來描述系統,服務,配置檔案的狀態,常常被稱為配置管理。

1. sls檔案

sls呆滯saltstack status,在salt中首先會用到這種型別檔案的結構。僅管它們可以用不同的格式進行渲染,預設的YAML格式是最常用的。多種模板引擎同樣可以生成YAML(或其他資料結構),最常用的且預設的是Jinja

saltstack和資料息息相關。YAML是Python中指代字典型別資料結構的序列化格式。說道sls如何編寫時,只需要記住它們是一組鍵值對:每項都有一個唯一的鍵,引用一個值。值可以是一個單項、一個列表項,也可以是其他鍵值對。

sls檔案中每個小節(stanza)的key稱為ID,如果小節內沒有明顯的宣告name屬性,那麼ID就會作為name。ID必須全域性唯一,不可重複,重複會報錯。

sls檔案可以有多層深度,目錄層級深度沒有限制。當定義多層深度目錄結構是,每一個層級將在sls名後加點(如web/nginx/nginx.ssl對應web.nginx.nginx)

mysql-install: #ID宣告,必須唯一
  pkg.installed: #state狀態宣告
    - pkgs: #選項宣告
      - mariadb: #選項列表
      - mariadb-server

說明:
一個ID只能出現一次
一個ID下相同模組只能使用一次
一個ID下不可以使用多個不同模組

例項

master的配置檔案如下

file_roots:
  base:
    - /srv/salt/base
  test:
    - /srv/salt/test
  dev:
    - /srv/salt/dev
  prod:
    - /srv/salt/prod
[root@salt-master ~]# mkdir -p /srv/salt/{base,test,prod,dev}

編寫sls檔案

[root@salt-master ~]# salt-key -L
Accepted Keys:
192.168.32.130
192.168.32.135
192.168.32.140
Denied Keys:
Unaccepted Keys:
Rejected Keys:

[root@salt-master ~]# cd /srv/salt/base/
[root@salt-master base]# mkdir -p web/nginx
[root@salt-master base]# cd web/nginx/
[root@salt-master nginx]# touch nginx.sls
[root@salt-master nginx]# pwd
/srv/salt/base/web/nginx
[root@salt-master nginx]# vim nginx.sls 
nginx-install:
  pkg.installed:
    - name: nginx
    
    
    
[root@salt-master ~]# salt '192.168.32.135' state.sls web.nginx.nginx saltenv=base
192.168.32.135:
----------
          ID: nginx-install
    Function: pkg.installed
        Name: nginx
      Result: True
     Comment: The following packages were installed/updated: nginx
     Started: 19:55:29.481267
    Duration: 21423.191 ms
     Changes:   
              ----------
              centos-indexhtml:
                  ----------
                  new:
                      7-9.el7.centos
                  old:
...省略...
              nginx-mod-stream:
                  ----------
                  new:
                      1:1.16.1-1.el7
                  old:

Summary for 192.168.32.135
------------
Succeeded: 1 (changed=1)
Failed:    0
------------
Total states run:     1
Total run time:  21.423 s

#minion端檢視是否安裝nginx
[root@node1 ~]# rpm -qa | grep nginx
nginx-mod-stream-1.16.1-1.el7.x86_64
nginx-1.16.1-1.el7.x86_64
nginx-filesystem-1.16.1-1.el7.noarch
nginx-mod-http-perl-1.16.1-1.el7.x86_64
nginx-mod-http-xslt-filter-1.16.1-1.el7.x86_64
nginx-mod-http-image-filter-1.16.1-1.el7.x86_64
nginx-mod-mail-1.16.1-1.el7.x86_64
nginx-all-modules-1.16.1-1.el7.noarch

由以上內容可知apache確實已部署成功。

執行狀態檔案的技巧:

  • 先用test.ping測試需要執行狀態檔案的主機是否能正常通訊,然後再執行狀態檔案

2. top file檔案

2.1 top file介紹

top file 檔案用於將sls檔案拉在一起並指定在哪個環境下應該為哪個minion提供sls檔案。

top.sls 檔案中的每個key都定義一個環境,一般情況下,定義一個叫base的環境,此環境包含基礎設定中的所有minion,定義其他環境包含minion的子集。每個環境包含一組sls檔案。

top file一定要放在指定環境下,如base就放在base/top.sls

例如下面的官方示例

在這個top.sls中,聲明瞭一個base環境,base環境指定了所有minion執行vim、scripts、users state,ID包含web的minion執行apache、python、django state,ID包含db的minion執行mysql state

2.2 高階狀態highstate的使用

3.2 高階狀態highstate的使用

管理SaltStack時一般最常用的管理操作就是執行高階狀態

[root@salt-master ~]# salt '*' state.highstate   //生產環境禁止這樣使用salt命令

注意:
上面讓所有人執行高階狀態,但實際工作當中,一般不會這麼用,工作當中一般都是通知某臺或某些臺目標主機來執行高階狀態,具體是否執行則是由top file來決定的。

若在執行高階狀態時加上引數test=True,則它會告訴我們它將會做什麼,但是它不會真的去執行這個操作。

[root@salt-master nginx]# pwd
/srv/salt/base/web/nginx
[root@salt-master nginx]# cat nginx.sls 
nginx-install:
  pkg.installed:
    - name: nginx

ngins-server:
  service.running:
    - name: nginx
    - enable: Ture

#測試執行
[root@salt-master nginx]# cat /srv/salt/base/top.sls 
base:
  '*':
    - web.nginx.nginx
[root@salt-master nginx]# salt '192.168.32.140' state.highstate test=Ture
192.168.32.140:
----------
          ID: nginx-install
    Function: pkg.installed
        Name: nginx
      Result: None
     Comment: The following packages would be installed/updated: nginx
     Started: 10:29:46.551950
    Duration: 548.208 ms
     Changes:   
----------
          ID: ngins-service
    Function: service.running
        Name: nginx
      Result: None
     Comment: Service nginx not present; if created in this state run, it would have been started
     Started: 10:29:47.101215
    Duration: 11.729 ms
     Changes:   

Summary for 192.168.32.140
------------
Succeeded: 2 (unchanged=2)
Failed:    0
------------
Total states run:     2
Total run time: 559.937 ms

#正式執行
......
......
----------
          ID: ngins-service
    Function: service.running
        Name: nginx
      Result: True
     Comment: Service nginx is already disabled, and is running
     Started: 10:30:56.680746
    Duration: 93.024 ms
     Changes:   
              ----------
              nginx:
                  True

Summary for 192.168.32.140
------------
Succeeded: 2 (changed=2)
Failed:    0
------------
Total states run:     2
Total run time:  10.732 s




#在minion端檢視
[root@node2 ~]# ss -tanl
State       Recv-Q Send-Q     Local Address:Port                    Peer Address:Port              
LISTEN      0      100            127.0.0.1:25                                 *:*                  
LISTEN      0      128                    *:80                                 *:*                  
LISTEN      0      128                    *:22                                 *:*                  
LISTEN      0      100                [::1]:25                              [::]:*                  
LISTEN      0      128                 [::]:80                              [::]:*                  
LISTEN      0      128                 [::]:22                              [::]:*                  
[root@node2 ~]# systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)
   Active: active (running) since Mon 2020-08-17 10:30:56 EDT; 1min 1s ago
  Process: 10528 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 10523 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 10521 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nginx.service
           ├─10532 nginx: master process /usr/sbin/nginx
           └─10536 nginx: worker process

Aug 17 10:30:56 node2 systemd[1]: Starting The nginx HTTP and reverse proxy server...
Aug 17 10:30:56 node2 nginx[10523]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Aug 17 10:30:56 node2 nginx[10523]: nginx: configuration file /etc/nginx/nginx.conf test is su...sful
Aug 17 10:30:56 node2 systemd[1]: Failed to parse PID from file /run/nginx.pid: Success
Aug 17 10:30:56 node2 systemd[1]: Started The nginx HTTP and reverse proxy server.
Hint: Some lines were ellipsized, use -l to show in full.