saltstack 基本命令,模塊,組件詳解

Saltstack 簡介
https://docs.saltstack.com/en/latest/contents.html 官方說明 文檔
Saltstack 是一個服務器基礎設施管理工具,它具有配置管理、遠程執行、監控等功能。Saltstack由Python語言編寫,基於 C/S 架構,即服務端 master 和客戶端 minions,Master和 Minion之間是通過 Zeromq(消息隊列)進行通信的 ;適合大規模批量管理服務器。

Saltstack 常用模塊
(1)pkg模塊:包管理,包括增刪更新

(2)file模塊:管理文件操作,包括同步文件、設置文件權限和所屬用戶組、刪除文件等。

(3)cmd模塊:在Million上執行命令或者腳本。

(4)user模塊:管理系統賬戶操作。

(5)service模塊:管理系統服務操作。

(6)cron模塊:管理cron服務操作。

saltstack安裝
1.準備工作
準備三臺機器,這三臺機器都關閉selinux以及防火牆

setenforcr 0
systemctl stop firewalld.service
systemctl disable firewalld.service

master服務器 (192.168.100.143)

minion服務器 (192.168.100.144 192.168.100.145)

2.編輯hosts文件(三臺都配置)

vim /etc/hosts

192.168.100.143 master.saltstack.com
192.168.100.144 web01.saltstack.com
192.168.100.145 web02.saltstack.com

3.分別修改各自的主機名

vim /etc/hostname

 master.saltstack.com   #master服務器
 web01.saltstack.com    #million服務器1
 web02.saltstack.com    #million服務器1

配置完成,重啓生效,再次關閉selinux。

4.安裝
(1)服務端

yum install -y epel-release  #安裝epel源
yum install -y salt-master 

(2)客戶端

yum install -y epel-release  #安裝epel源
yum install -y salt-minion

5.配置服務端配置文件(/etc/salt/master)

vim /etc/salt/master

interface: 192.168.100.143     #第15行,修改監聽地址爲本機地址

auto_accept: True     #第215行,主服務器會自動認證被控端的認證,只要被控端在設置完主服務器的IP地址後啓動服務,主服務器就會允許被控端自動認證,以避免以後每次都要運行salt-key來確認認證書信任。

file_roots:
  base:
    - /srv/sale
#第416行,去掉註釋。開啓saltstack文件根目錄位置,注意這個目錄默認沒有創建,需要自己手動創建。

nodegroups:   
  group1: 'web01.saltstack.com'
  group2: 'web02.saltstack.com'   #第710行,配置組分類

pillar_opts: True    #第552行,開啓pillar功能,同步文件功能

pillar_roots:
    base:
     - /srv/pillar  #第529行,去掉註釋,pillar的主目錄,需要自己創建

6.創建salt與pillar文件根目錄

mkdir /srv/salt
mkdir /srv/pillar

7.啓動salt-master服務

systemctl start salt-master
systemctl enable salt-master

8.配置million客戶端配置文件(/etc/salt/minion)

vim /etc/salt/minion

master: 192.168.100.143     ##第16行,指定master服務器的IP

id: web01.saltstack.com   #注意冒號要有空格 ##第78行,指定客戶端主機名,另一臺是web02.saltstack.com 

9.分別啓動兩臺客戶端服務

systemctl start salt-minion

10.測試
(1)查看在主服務器上已經被接受過的客戶端

salt-key
salt-key -A 將所有客戶端的加入到 accept keys 下
salt-key -L #顯示已經或未被認證的被控端id
salt-key -D #刪除所有認證主機id證書
salt-key -d id #刪除單個id證書(id爲被控端id名)
salt-key -A #接受所有id證書請求
salt-key -a id #接受單個id證書請求(id爲被控端id名)

(1)測試連接服務端和客戶端的通信狀態

##在主服務器端進行操作

salt '*' test.ping         

web01.saltstack.com:
  True
web02.saltstack.com:
  True

(2)測試遠程執行命令

##在主服務器端進行操作

salt '*' cmd.run 'hostname'    ##遠程執行命令

命令

命令格式:

salt '<操作目標>'  <方法>  [參數]

例:

salt 'backup' cmd.run 'free -m' #查看被控主機內存使用情況

常用參數
針對<操作目標>,Saltstack提供了多種方法對被控主機(id)進行過濾。下面列舉出常用具體參數:
-E,--pcre,通過正則表達式進行匹配:

salt -E '^SN2013.*' test.ping #探測SN2013開頭的主機id名是否連通

-L,--list,以主機id名列表的形式進行過濾,格式與Python的列表相似,即不同主機id名稱使用逗號分離。

salt -L 'SN2013-08-021,SN2013-08-021' grains.item osfullname #獲取主機id爲:SN2013-08-021,SN2013-08-021完整操作系統發行版名稱

-G,--grain,根據被控主機的grains信息進行匹配過濾,格式爲:<grain value>:<grain expression>

salt -G 'osrelease:6.4' cmd.run 'python -V' #獲取發行版本號爲6.4的python版本號

-I,--pillar,根據被控主機的pillar信息進行匹配過濾,格式爲:"對象名稱":"對象值"

salt -I 'nginx:root:/data' test.ping #探測具有'nginx:root:/data'信息的連通性。
#pillar屬性配置文件如下:
nginx:
  root: /data

-N,--nodegroup,根據主控端master配置文件中的分組名稱進行過濾。

#分組配置:【/etc/salt/master】
nodegroups:
web1group: 'L@wx,SN2013-08-21'
web2group: 'L@SN2013-08-22,SN2014'
#其中L@表示後面的主機id格式爲列表,即主機id以逗號分隔:G@表示以grain格式描述:S@表示以IP子網或地址格式描述

salt -N web2group test.ping #探測web2group被控主機的連通性

-C,--compound,根據條件運算符not、and、or去匹配不同規則的主機信息

salt -C 'E@^SN2013.* and G@os:Centos' test.ping #探測SN2013開頭並且操作系統版本爲CentOS的主機的連通性

-S,--ipcidr,根據被控主機的IP地址或IP子網進行匹配

salt -S 192.168.0.0/16 test.ping
salt -S 192.168.1.10 test.ping

常用模塊

Archive模塊

功能:實現系統層面的壓縮包調用,支持gzip、gunzip、rar、tar、unrar、unzip等

示例:

#採用gunzip解壓sourcefile.txt.gz包
salt '*' archive.gunzip sourcefile.txt.gz

#採用gzip壓縮sourcefile.txt文件
salt '*' archive.gzip sourcefile.txt

API調用:

client.cmd('*','archive.gunzip',['sourcefile.txt.gz'])

cmd模塊

功能:實現遠程的命令行調用執行(默認具備root操作權限,使用時需評估風險)

示例:

#獲取所欲被控主機的內存使用情況
salt '*' cmd.run 'free -m'

在wx主機上運行test.py腳本,其中script/test.py存放在file_roots指定的目錄(默認是在/srv/salt,自定義在/etc/salt/master文件中定義,
該命令會做2個動作:首先同步test.py到minion的cache目錄;然後運行該腳本

salt 'wx' cmd.script salt://script/test.py

API調用:

client.cmd('*','cmd.run',['free -m'])

cp模塊

功能:實現遠程文件、目錄的複製,以及下載URL文件等操作

示例:

#將被控主機的/etc/hosts文件複製到被控主機本地的salt cache目錄(/var/cache/salt/minion/localfiles/)
salt '*' cp.cache_local_file /etc/hosts

#將主控端file_roots指定位置下的目錄複製到被控主機/minion/目錄下
salt '*' cp.get_dir salt://script/ /minion/

#將主控端file_roots指定位置下的文件複製到被控主機/minion/test.py文件(file爲文件名)
salt '*' cp.get_dir salt://script/test.py /minion/test.py

#下載URL內容到被控主機指定位置(/tmp/index.html)
salt '*' cp.get_url http://www.slashdot.ort /tmp/index.html

API調用:

client.cmd('*','cp.get_file',['salt://script/test.py','/minion/test.py'])

cron模塊

功能:實現被控主機的crontab操作

示例:


#查看指定被控主機、root用戶的crontab操作
salt 'wx' cron.raw_cron root

#爲指定被控主機、root用戶添加/usr/local/weekly任務zuoye
salt 'wx' cron.set_job root '*' '*' '*' '*' 1 /usr/local/weekly 

#刪除指定被控主機、root用戶crontab的/usr/local/weekly任務zuoye
salt 'wx' cron.rm_job root /usr/local/weekly 

API調用:

client.cmd('wx','cron.set_job',['root','','','','',1,'/usr/local/weekly'])

dnsutil模塊

功能:實現被控主機通用DNS操作

示例:

#添加指定被控主機hosts的主機配置項
salt 'wx' dnsutil.hosts_append /etc/hosts 127.0.0.1 adl.yuk.com,ad2.yuk.com

#刪除指定被控主機的hosts的主機配置項
salt 'wx' dnsutil.hosts_remove /etc/hosts ad1.yuk.com

API調用:

clietn.cmd('wx','dnsutil.hosts_append',['/etc/hosts','127.0.0.1','ad1.yuk.com','ad2.yuk.com'])

file模塊

功能:被控主機常見的文件操作,包括文件讀寫、權限、查找、校驗

示例:

#校驗所有被控主機/etc/fstab文件的md5值是否爲xxxxxxxxxxxxx,一致則返回True值
salt '*' file.check_hash /etc/fstab md5=xxxxxxxxxxxxxxxxxxxxx
#校驗所有被控主機文件的加密信息,支持md5、sha1、sha224、shs256、sha384、sha512加密算法
salt '*' file.get_sum /etc/passwd md5
#修改所有被控主機/etc/passwd文件的屬組、用戶權限、等價於chown root:root /etc/passwd
salt '*' file.chown /etc/passwd root root
#複製所有被控主機/path/to/src文件到本地的/path/to/dst文件
salt '*' file.copy /path/to/src /path/to/dst
#檢查所有被控主機/etc目錄是否存在,存在則返回True,檢查文件是否存在使用file.file_exists方法
salt '*' file.directory_exists /etc
#獲取所有被控主機/etc/passwd的stats信息
salt '*' file.stats /etc/passwd
#獲取所有被控主機/etc/passwd的權限mode,如755,644
salt '*' file.get_mode /etc/passwd
#修改所有被控主機/etc/passwd的權限mode爲0644
salt '*' file.set_mode /etc/passwd 0644
#在所有被控主機創建/opt/test目錄
salt '*' file.mkdir /opt/test
#將所有被控主機/etc/httpd/httpd.conf文件的LogLevel參數的warn值修改爲info
salt '*' file.sed /etc/httpd/httpd.conf 'LogLevel warn' 'LogLevel info'
#給所有被控主機的/tmp/test/test.conf文件追加內容‘maxclient 100’
salt '*' file.append /tmp/test/test.conf 'maxclient 100'
#刪除所有被控主機的/tmp/foo文件
salt '*' file.remove /tmp/foo

API調用:

client.cmd('*','file.remove',['/tmp/foo'])

iptables模塊

功能:被控主機的iptables支持

示例:

#在所有被控主機端追加(append)、插入(insert)iptables規則,其中INPUT爲輸入鏈
salt '*' iptables.append filter INPUT rule='-m state --state RELATED,ESTABLISHED -j ACCEPT'
salt '*' iptables.insert filter INPUT position=3 rule='-m state --state RELATED,ESTABLISHED -j ACCEPT'
#在所有被控主機刪除指定鏈編號爲3(position=3)或指定存在的規則
salt '*' iptalbes.delete filter INPUT position=3
salt '*' iptables.delete filter INPUT rule='-m state --state RELATEC,ESTABLISHED -j ACCEPT'
#保存所有被控主機端主機規則到本地硬盤(/etc/sysconfig/iptables)
salt '*' iptables.save /etc/sysconfig/iptables

API調用:

client.cmd('*','iptables.append',['filter','INPUT','rule=\'-p tcp --sport 80 -j ACCEPT\''])

network模塊

功能:返回被控主機的網絡信息

示例:

#在指定被控主機獲取dig、ping、traceroute目錄域名信息
salt 'wx' network.dig www.qq.com
salt 'wx' network.ping www.qq.com
salt 'wx' network.traceroute www.qq.com
#獲取指定被控主機的mac地址
salt 'wx' network.hwaddr eth0
#檢測指定被控主機是否屬於10.0.0.0/16子網範圍,屬於則返回True
salt 'wx' network.in_subnet 10.0.0.0/16
#獲取指定被控主機的網卡配置信息
salt 'wx' network.interfaces
#獲取指定被控主機的IP地址配置信息
salt 'wx' network.ip_addrs
#獲取指定被控主機的子網信息
salt 'wx' network.subnets

API調用:

client.cmd('wx','network.ip_addrs')

pkg包管理模塊

功能:被控主機程序包管理,如:yum、apt-getdegn

示例:

#爲所有被控主機安裝PHP環境,根據不同系統發行版調用不同安裝工具進行部署,如redhat平臺的yum,等價於yum -y install php
salt '*' pkg.install php
#卸載所有被控主機的PHP環境
salt '*' pkg.remove php
#升級所有被控主機的軟件包
salt '*' pkg.upgrade

API調用:

client.cmd('*','pkg.remove',['php'])

service服務模塊

功能:被控主機程序包服務管理

示例:

#開啓(enable)、禁用(disable)nginx開機自啓動腳本
salt '*' service.enable nginx
salt '*' service.disable nginx
#針對nginx服務的reload、restart、start、stop、status操作
salt '*' service.reload nginx
salt '*' service.restart nginx
salt '*' service.start nginx
salt '*' service.stop nginx
salt '*' service.status nginx

API調用:

client.cmd('*','service.stop',['nginx'])

其他模塊

除了上述模塊外,saltstack還提供了user(系統用戶模塊)、group(系統組模塊)、partition(系統分區模塊)、puppet(puppet管理模塊)、system(系統重啓、關機模塊)、timezone(時區管理模塊)、nginx(nginx管理模塊)、mount(文件系統掛載模塊)等等。當然我們也可以通過Python擴展模塊來滿足需求。

grains pillar state 三大組件

grains說明

grains是Saltstack最重要的組件之一,grains的作用是手機被控主機的基本信息,這些信息通常都是一些靜態類的數據,包括CPU、內核、操作系統、虛擬化等,在服務器端可以根據這些信息進行靈活定製,管理員可以利用這些信息對不同業務進行個性化定製。

例:(janja模板)

{% if grains['os'] == 'Ubuntu' %}
host: {{ grains['host'] }}
{% elif grains['os'] == 'CentOS' %}
host: {{ grains['fqdn] }}
{% endif %}

grains常用操作命令

匹配內核版本爲2.6.32-358.14.1.el6.x86_64的主機
salt -G 'kernelrelease:2.6.32-358.14.1.el6.x86_64' cmd.run 'uname -a'
獲取所有主機的grains項信息
salt '*' grains.ls

定義grains數據

定義grains數據的方法有兩種一種爲在被控主機定製配置文件另一種是通過主控端擴展模塊API實現。區別是模塊更靈活,可以通過Python編程動態定義,而
配置文件只適合相對固定的鍵與值。下面分別進行說明:

1、被控端主機定製grains數據

【/etc/salt/minion】

default_include:minion.d/*.conf #自定義grains配置文件路徑
grains配置文件:【/etc/salt/minion.d/hostinfo.conf】

grains:
  roles:
    - webserver
    - memcache
  deployment: datacenter4
  cabinet: 13

重啓salt-minion使之生效:service salt-minion restart
驗證:

salt 'wx' grains.item roles deployment cabinet

結果:

wx:
----------
  cabinet:
      13
  deployment:
  datacenter4
  roles:
    - webserver
    - memcache

2、主控端擴展模塊定製grains數據

首先在主控端編寫python代碼,然後將該python文件同步到被控端主機,最後刷新生效(即編譯Python源碼文件成字節碼pyc)。

在主控端base目錄(在/etc/salt/master中配置的file_roots項,默認在/srv/salt)下生成_grains目錄執行install -d /srv/salt/_grains開始編寫代碼,實現獲取被控主機系統允許最大打開文件數(ulimit -n)的grains數據

【/srv/salt/_grains/grains_openfile.py】

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import os,sys,commands
#定義一個獲取最大打開文件數的函數,函數名稱沒有要求,符合python函數命名規則即可
def Grains_openfile():
    '''
        return os max open file of grains value
    '''
    grains = {} #初始化一個字典,變量名一定要用grains,以便Saltstack識別
    _open_file=65535 #初始化一個默認值
    try:
        getulimit = commands.getstatusoutput('source /etc/profile;ulimit -n')
    except Exception,e:
        pass
    if getulimit[0]==0:
        _open_file=int(getulimit[1])
    grains['max_open_file'] = _open_file #將獲取的ulimit -n的結果進行賦值,其中'max_open_file'就是grains項,——open_file就是grains的值
    return grains            

最後同步模塊到指定被控主機並刷新生效,grains比較適合採集靜態類的數據,比如硬件、內核信息等,當有動態類的功能需求時,需要進行刷新。
同步操作

salt 'wx' saltutil.sync_all

結果:文件同步到被控端的cache目錄中

/var/cache/salt/minion/extmods/grains/grains_openfile.py
/var/cache/salt/minion/files/base/_grains/grains_openfile.py

#注:/var/cache/salt/minion/extmods/grains/爲擴展模塊文件最終存放位置,刷新模塊後將在同路徑下生產字節碼pyc;/var/cache/salt/minion/files/base/_grains/爲臨時存放位置。
刷新模塊

salt 'wx' sys.reload_modules

#生成pyc字節碼
/var/cache/salt/minion/extmods/grains/grains_openfile.py
/var/cache/salt/minion/extmods/grains/grains_openfile.pyc
/var/cache/salt/minion/files/base/_grains/grains_openfile.py

驗證:

salt 'wx' grains.item max_open_file

結果:

wx:
----------
  max_open_file:
    1024

pillar組件

pillar也是Saltstack最重要的組件之一,其作用是定義與被控主機相關的任何數據,定義好的數據可以被其他組件使用,如模板、state、API等。

在pillar中定義的數據與不同業務特性的被控主機相關聯,這樣不同被控主機只能看到自己匹配的數據,因此pillar安全性很高,適用於一些比較敏感的數據,這也是區別於grains最關鍵的一點,如定義不同業務組主機的用戶id、組id、讀寫權限、程序包等信息,定義的規範是採用Python字典形式,即鍵/值,最上層的鍵一般爲主機的id或組的名稱。

pillar的定義

主配置文件定義
Saltstack默認將主控端配置文件中的所有數據都定義到pillar中,而對所有被控主機開放,可通過修改/etc/salt/master配置來定義是否開啓或關閉這項功能。

【/etc/salt/master】

pillar_opts: True/False

修改後執行命令來觀察效果:

salt '*' pillar.data

SLS文件定義
pillar支持在sls文件中定義數據,格式須符合YAML規範,與Saltstack的state組件十分相似,新人容易將兩者混淆,兩者文件的配置格式、入口文件top.sls都是一致的。

定義pillar的主目錄
【/etc/salt/master】

pillar_roots:
  base:
    - /srv/pillar

同時創建pillar目錄,執行命令:

install -d /srv/pillar

定義入口文件top.sls

入口文件的作用一般是定義pillar的數據覆蓋被控主機的有效範圍,'*'代表任意主機,其中包括了一個data.sls文件具體內容如下:

【/srv/pillar/top.sls】

base:
  '*':
    - data #指代的是data.sls文件
【/srv/pillar/data.sls】

appname: website
flow:
  maxconn: 3000
  maxmem: 6G

校驗pillar

刷新被控主機的pillar信息
salt '*' saltutil.refresh_pillar
查看上面定義的data.sls數據項
salt 'wx' pillar.data appname flow

pillar的使用
完成pillar配置後接下來介紹使用方法。我們可以在state、模板文件中引用,模板格式爲:{{ pillar變量 }}

例:

{{ pillar['appname'] }}(一級字典)
{{ pillar['flow']['maxconn'] }}(二級字典) 或 {{ salt['pillar.get']('flow:maxconn',{}) }}
#Python API格式如下:
pillar['flow']['maxconn']
pillar.get('flow:appname',{})

操作目標主機

salt -I 'appname:website' test.ping

結果:

wx:
  True

結合grains處理數據的差異性
首先通過結合grains的id信息來區分不同的id的maxcpu的值,其次進行引用觀察匹配的信息,將data.sls修改成如下形式:

appname: website
flow:
  maxconn: 3000
  maxmem: 6G
  {% if grains['id'] == 'wx' %} #jinjia2模板語法
  maxcpu: 8
  {% else %}
  maxcpu: 4
  {% endif %}

結果:

wx:
    ----------
    flow:
        ----------
        maxconn:
            3000
        maxcpu:
            8
        maxmem:
            6G

state組件

state是Saltstack最核心的功能,通過預先定製好的sls(salt state file)文件對被控制主機進行狀態管理,支持包括程序包(pkg)、文件(file)、網絡配置(network)、系統服務(service)、系統用戶(user)等。

state的定義
state的定義是通過sls文件進行描述的,支持YAML語法,定義規則如下:

$ID: #定義state名稱,通常採用與描述對象保存一致的方法,如apache、nginx等 
  $state: #須管理對象的類型
    - $state: states #定製對象的狀態

示例:

# 自定義的名字 ,只要保證實際 文件名與 top.sls對應即可
apache: #state名稱:apache
  pkg: #管理對象類型:pkg,進行軟件安裝(yum、apt)
    - installed #pkg要執行的方法:install,如未安裝就進行安裝
  service: #管理對象類型:service,管理系統守護進程
    - running #service要執行的方法:running,如未運行就進行啓動
    - require: #關鍵字require,確保apache服務只有在成功安裝軟件包後纔會啓動
      - pkg: apache

注:---關鍵字說明

require:在運行此state之前,先運行依賴的state關係檢查,可配置多個state依賴對象;
watch:在檢查摸個state發生變化時運行此模塊。

state的使用
state的入口文件與pillar一樣,文件名都是top.sls,但state要求sls文件必須存放在Saltstack base定義的目錄下(默認爲/srv/salt)。

state描述配置*.sls支持jinjia模板、grains及pillar引用等,在state的邏輯層次定義完成後,再*通過salt '' state.highstate執行生效**。

示例:
結合grains與pillar,實現一個根據不同操作系統類型部署apache環境的任務

定義pillar
【/srv/pillar/top.sls】

base:
  '*':
    - apache

在top.sls中引用二級配置有兩種方式,一種是直接引用,如本例中直接引用apache.sls;另一種是創建apache目錄,再引用目錄中的init.sls文件,兩者效果是一樣的。

【/srv/pillar/apache.sls】或【/srv/pillar/apache/init.sls】

pkgs:
{% if grains['os_family'] == 'Debian' %}
  apache: apache2
  {% elif grains['os_family'] == 'RedHat' %}
  apache: httpd
  {% elif grains['os'] == 'Arch' %}
  apache: apache
{% endif %}

測試:

salt '*' saltutil.refresh_pillar #刷新pillar
salt '*' pillar.data pkgs #獲取pkgs信息

定義state
【/srv/salt/top.sls】

base:
  '*':
    - apache

【/srv/salt/apache.sls】或【/srv/salt/apache/init.sls】

apache:
  pkg:
    - installed
    - name: {{ pillar['pkgs']['apache'] }} #pillar['pkgs']['apache']引用的是pillar定義的數據
  service.running:
    - name: {{ pillar['pkgs']['apache'] }}
    - require:
      - pkg: {{ pillar['pkgs']['apache'] }}

執行state

salt '*' state.highstate
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章