SaltStack快速瞭解

1. 介紹

基於Python開發的一套C/S架構配置管理工具,底層使用ZeroMQ消息隊列pub/sub方式通訊,使用SSL證書籤發的方式進行認證管理。html

2. 環境準備

2.1 安裝

本文采用salt-bootstrap方式安裝。salt-bootstrap是SaltStack的一個單獨項目,主要用於解決多平臺一鍵部署SaltStack環境node

下載安裝腳本python

curl -L https://bootstrap.saltstack.com -o install_salt.sh

 

安裝salt-masternginx

sh install_salt.sh -M #安裝最新stable版本的salt-master和salt-minion

 

安裝salt-minionapache

sh install_salt.sh #安裝最新stable版本的salt-minion

 

2.2 配置

(1) 全部master和minion節點配置hosts文件(生產環境使用DNS)bootstrap

主機名 IP 說明
node1 172.16.37.23 Master
node2 172.16.37.35 Minion
node3 172.16.37.41 Minion
node4 172.16.37.39 Minion
node5 172.16.37.43 Minion

 

 

 

 

 

 

 

(2) Master防火牆規則安全

salt master啓動後默認會監聽兩個端口:架構

4505/tcp,publish_port,提供遠程執行命令發送功能app

4506/tcp,ret_port,用於文件服務、認證、結果蒐集等功能接口curl

 

(3) Minion配置

修改/etc/salt/minion

    a) 修改minion的master

        找到以下行’#master: salt’,取消註釋,修改成實際master主機名

        master: node1

    b) 爲minion指定id

        找到以下行’#id:’,取消註釋,並設置爲minion的主機名(不必定要和主機名同樣),如

        id: node2

 

重啓salt master和salt minion

systemctl restart salt-master salt-minion # Master
systemctl restart salt-minion             # Minion

 

2.3 證書管理

SaltStack使用SSL簽證的方式進行安全認證、通訊加密

Minion第一次啓動後會在/etc/salt/pki/minion生成公鑰祕鑰,而後將公鑰發送給Master,等待Master接受

Master爲其簽發證書後才能與該Minion創建通訊

 

相關命令

#查看證書籤髮狀況
salt-key -L

#爲node2簽發證書
salt-key -a node2

#爲全部等待接受的Minion簽發證書
salt-key -A

3. 遠程執行命令

salt ‘目標機器’ 函數 [參數](詳細用法見’salt -h’)

在全部Minion遠程執行test模塊中的ping函數( /usr/lib/python2.7/site-packages/salt/modules/test.py ,該函數直接返回True)

salt ‘*’ test.ping

 

查看函數說明

salt ‘node2’ sys.doc test.ping

 

遠程命令執行模塊cmd( /usr/lib/python2.7/site-packages/salt/modules/cmdmod.py )

salt ‘*’ cmd.run 「hostname

 

列出cmd模塊的函數

salt 'node2' sys.list_functions cmd

 

查看函數說明

salt 'node2' sys.doc cmd.run

 

原理都是在匹配的目標機器執行python模塊中的函數,能夠編寫自定義的python模塊推送到Minion上按上述方式執行

4. 狀態系統

4.1 狀態系統說明

經過SLS(SaLt State)文件描述Minion要達到什麼狀態,底層由SaltStack的狀態模塊保證Minion處於該狀態

以安裝httpd服務爲例,採用執行遠程命令的方式以下:

salt ‘node2’ pkg.install httpd

 

而採用狀態文件進行描述以下:

而後經過狀態模塊確保目標機器中httpd服務處於pkg.installed的狀態:

salt ‘node2’ state.apply apache

 

二者都達到了在目標機器部署httpd服務的目的,可是執行遠程命令的方式每次都會執行相同的邏輯和指令,而狀態文件則是根據描述讓Minion處於指定狀態,當前狀態和所需狀態不一樣時才執行相關操做

執行遠程命令的方式屬於執行模塊。查看全部執行模塊

salt 'node2' sys.list_modules

 

查看pkg執行模塊中的全部函數

salt 'node2' sys.list_functions pkg

 

狀態文件的方式屬於狀態模塊。查看全部狀態模塊

salt 'node2' sys.list_state_modules

 

查看pkg狀態模塊中的全部函數

salt 'node2' sys.list_state_functions pkg

 

4.2 Highstate

highstate經過top.sls文件做爲入口對模塊和主機進行管理

使用highstate,能夠用top.sls組織多個狀態文件,對模塊進行拆分和複用,實現多環境的配置和管理等

 

以下舉例對highstate進行說明

file_roots默認只有一個base環境,位於/srv/salt,top.sls就在base環境的根目錄下。目錄結構以下:

 

在top.sls中指定狀態文件或狀態文件子目錄

 

top.sls中引用了myapp,它會按以下順序引用:若是存在myapp.sls則引用myapp.sls,若是不存在,則引用myapp目錄下的init.sls。咱們採用子目錄的方式對目錄進行規劃

 

在myapp/init.sls中include與myapp相關的各個狀態文件(能夠把狀態文件拆分紅多個,在此處include)

 

.myconf對應與init.sls同目錄的myconf.sls狀態文件,在該文件中對Minion的/tmp/myconf.txt狀態進行描述

 

在files/myconf.txt中寫入任意內容,執行以下命令讓Minion處於描述的狀態

salt 'node2' state.apply

 

參考:

(1) https://docs.saltstack.com/en/latest/topics/tutorials/states_pt1.html

(2) https://docs.saltstack.com/en/latest/topics/tutorials/starting_states.html

5. Grains

SaltStack中記錄Minion靜態信息的組件(OS類型、CPU核數、內存大小、IP地址等),在Minion啓動時採集彙報給Master,所以Grains一般存儲的是靜態、不常變化的數據,存儲在Minion本地

Minion能夠操做本身的Grains數據(增刪改)

 

可經過以下命令查看每項Grains數據:

salt 'node2' grains.items

6. Pillar

與Grains相似,但Pillar存儲的是相對常常變化的數據,存儲在Master本地

Minion只能查看本身的Pillar數據

 

可經過以下命令查看每項Pillar數據:

salt 'node2' pillar.items

7. Jinja

Python模板引擎,經過與Grains和Pillar的結合定義動態的配置

好比,不一樣的Minion經過fqdn能夠獲取各自不一樣的主機名

 

接下來咱們能夠經過Grains建立動態配置,讓每一個目標機器中的/tmp/myconf.txt顯示本身的主機名

修改狀態文件中的file描述,指定template爲jinja

#cat dev/myapp/myconf.sls
conf1:
  file.managed:
    - name: /tmp/myconf.txt
    - source: salt://nginx/files/myconf.txt
    - user: root
    - group: root
    - mode: 644
    - template: jinja

 

在source對應的文件中經過 {{ grains[‘ITEM’] }} 的方式引用Grains數據

#cat dev/myapp/files/myconf.txt
[BASE] /srv/salt/dev
My hostname is {{ grains['fqdn'] }}

 

讓全部Minion處於描述的狀態

salt '*' state.apply

 

參考:

(1)    https://docs.saltstack.com/en/latest/topics/tutorials/states_pt3.html

 

8. 多環境的配置和管理

以下以在不一樣環境的主機中放置不一樣內容的/tmp/myconf.txt文件爲例進行說明

爲了便於區分不一樣環境,先修改各Minion的id加入環境標識

 

修改master的file_root配置( /etc/salt/master )

file_roots:
  base:
   - /srv/salt/base
  dev:
    - /srv/salt/dev
  prod:
    - /srv/salt/prod

 

在多環境下,每一個環境的根目錄下維護各自的top.sls

 

top.sls中指明本身的環境,匹配的目標機器,包含的狀態文件/子目錄等

 

top.sls中引用了myapp,它會按以下順序引用:若是存在myapp.sls則引用myapp.sls,若是不存在,則引用myapp目錄下的init.sls。咱們採用子目錄的方式對目錄進行規劃。在init.sls中指定該子目錄中的狀態文件

 

.myconf對應與init.sls同目錄的myconf.sls狀態文件,在該文件中對Minion的/tmp/myconf.txt狀態進行描述

 

分別在base、dev、prod環境的myconf.txt中寫入不一樣內容,執行以下命令讓不一樣環境的Minion處於對應的描述狀態

salt '*' state.apply  # 默認base環境

salt '*' state.apply saltenv=dev # dev環境

salt '*' state.apply saltenv=prod # prod環境

 

參考:

(1)    https://docs.saltstack.com/en/latest/topics/tutorials/states_pt4.html

相關文章
相關標籤/搜索