saltstack

目錄

  • saltstack簡介
  • 安裝saltstack
  • grains&pillar
  • 管理對象Target
  • 配置管理States
  • 自定義module

saltstack簡介

什么是saltstack群叶?

Saltstack開源項目始于2011年躁垛,使用Python開發(fā)的一套C/S架構(gòu)的運維工具察滑,由Master和Minion組成枪蘑,通過ZeroMQ進行通信坐昙。
項目地址: https://github.com/saltstack/salt
官網(wǎng)地址: http://www.saltstack.com
官方文檔: http://docs.saltstack.com OR http://docs.saltstack.cn
開發(fā)語言: Python
運行模式: C/S

基本術(shù)語

說明
master 控制中心亏栈,salt命令運行和資源狀態(tài)管理端
minions 需要管理的客戶端機器,會主動連接master端投放,并從master端得到資源狀態(tài)信息奈泪,同步資源管理信息
states 配置管理的指令集
grains minion端的靜態(tài)變量
pillar minion端的動態(tài)變量
highstate 給minion永久添加狀態(tài),從sls配置文件讀取
salt schedule 自動保持客戶端配置

安裝saltstack

安裝

Installs the latest release. Updating installs the latest release even if it is a new major version.

1.1灸芳、Run the following command to import the SaltStack repository key:

wget -O - https://repo.saltstack.com/apt/ubuntu/16.04/amd64/latest/SALTSTACK-GPG-KEY.pub | sudo apt-key add -

1.2涝桅、Save the following file to /etc/apt/sources.list.d/saltstack.list:

deb http://repo.saltstack.com/apt/ubuntu/16.04/amd64/latest xenial main

1.3、Install

> sudo apt-get update
> sudo apt-get install salt-master
> sudo apt-get install salt-minion
> sudo apt-get install salt-ssh
> sudo apt-get install salt-syndic
> sudo apt-get install salt-cloud
> sudo apt-get install salt-api

1.4烙样、show version

> salt --version
salt 2016.3.3 (Boron)

基本的配置

文件 /etc/salt/master

interface: 192.168.199.86

文件 /etc/salt/minion

master: 192.168.199.86
id: qianlnk # minion的識別ID冯遂,可以是IP,域名谒获,或是可以通過DNS解析的字符串

配置

master:
https://docs.saltstack.com/en/latest/ref/configuration/master.html
http://arlen.blog.51cto.com/7175583/1423997

minion:
https://docs.saltstack.com/en/latest/ref/configuration/minion.html
http://arlen.blog.51cto.com/7175583/1424008

啟動

sudo service salt-master start
sudo service salt-minion start

master接受minion的key

> sudo salt-key -L                
Accepted Keys:
Denied Keys:
Unaccepted Keys:
qianlnk
Rejected Keys:

> sudo salt-key -a qianlnk
The following keys are going to be accepted:
Unaccepted Keys:
qianlnk
Proceed? [n/Y] y
Key for minion qianlnk accepted.

> sudo salt-key -L        
Accepted Keys:
qianlnk
Denied Keys:
Unaccepted Keys:
Rejected Keys:

測試

> sudo salt "qianlnk" test.ping
qianlnk:
  True

> sudo salt "qianlnk" cmd.run 'uptime'
qianlnk:
  13:34:25 up 14 days, 2:37, 1 user, load average: 0.04, 0.18, 0.16

使用幫助

sys.doc 類似于linux的man命令蛤肌,可以顯示minion模塊的詳細使用說明。如:

sudo salt ‘qianlnk’ sys.doc test

查看minion qianlnk上test模塊的更多信息批狱。

grains&pillar

什么是grains裸准?

Grains是服務器的一系列粒子信息,也就是服務器的一系列物理精耐,軟件環(huán)境信息狼速。在執(zhí)行salt的sls時候可以根據(jù)Grains信息的不同對服務器進行匹配分組,例如可以根據(jù)系統(tǒng)是centos服務器跟系統(tǒng)是redhat環(huán)境的安裝不同的軟件包卦停。

查看grains的功能

sudo salt ‘qianlnk’ sys.list_functions grains
qianlnk: 
  - grains.append 
  - grains.delval 
  - grains.fetch 
  - grains.filter_by 
  - grains.get 
  - grains.get_or_set_hash 
  - grains.has_value 
  - grains.item 
  - grains.items 
  - grains.ls 
  - grains.remove 
  - grains.set 
  - grains.setval 
  - grains.setvals 

查看grains信息

sudo salt ‘qianlnk’ grains.items

怎么使用grains向胡?

命令行中使用

對操作系統(tǒng)是Ubuntu的服務器執(zhí)行test.ping 
? salt sudo salt -G "os:Ubuntu" test.ping 
dk1: 
  True 
dk2: 
  True 

顯示cpu架構(gòu)是x86_64的服務器的cpu個數(shù) 
? salt sudo salt -G 'cpuarch:x86_64' grains.item num_cpus 
dk2: 
  ---------- 
  num_cpus: 
  4 
dk1: 
  ---------- 
  num_cpus: 
  4 

sls中使用

#在top.sls中使用 

'os:Ubuntu': 
  - match: grain 
  - webserver 

在top.sls入口中對系統(tǒng)是Ubuntu的服務器執(zhí)行webserver.sls里定義的狀態(tài)信息。 

自定義grains

存在形式:

1惊完、core grains 
2僵芹、在/etc/salt/grains 中自定義 
3、在/etc/salt/minion 中自定義 
4小槐、在_grains目錄中自定義grains拇派,同步到minions 
  • core grains是系統(tǒng)設定的grains,如果自定義的grains的名稱跟core grains中的一樣則會將之覆蓋掉凿跳。
  • 在minion端的/etc/salt/grains中定義:
root@17ca9e9efc8a:/etc/salt# cat grains  
roles: 
  - zookeeper 
  - kafka 

注意件豌!該目錄下不存在grains文件的話自己創(chuàng)建,定義grains后需要重啟salt-minion控嗜。

測試:

sudo salt -G “roles:kafka”  test.ping
cn2: 
  True
  • 在/etc/salt/minion中定義茧彤,類似在/etc/salt/grains中定義。
  • 在master端疆栏,_grains目錄中定義:
?  cd /srv/salt 
?  mkdir _grains 
?  cd _grains  
?  vi my_grain.py 
#添加內(nèi)容 
?  cat my_grain.py  
def my_grains(): 
grains = {'roles' : ['phpserver','webserver']} 
return grains 
  
?  sudo salt -E "dk*" saltutil.sync_grains     #刷新minion的grains 
dk2: 
  - grains.my_grain 
dk1: 
  - grains.my_grain 
?  sudo salt -E "dk*" grains.item roles 
dk2: 
  ---------- 
  roles: 
  - phpserver 
  - webserver 
dk1: 
  ---------- 
  roles: 
  - phpserver 
  - webserver 

? sudo salt -G "roles:webserver" test.ping 
dk2: 
  True 
dk1: 
  True 

什么是pillar曾掂?

跟grains的結(jié)構(gòu)是一樣的惫谤,也是字典格式,數(shù)據(jù)通過key/value的格式進行存儲珠洗。使用獨立的session加密溜歪。Pillar是數(shù)據(jù)中心, 其在Saltstack中主要的作用就是存儲和定義配置管理中需要的一些數(shù)據(jù)许蓖,比如軟件版本號蝴猪、用戶名密碼等信息。

查看grains的功能

? ~ sudo salt "cn1" sys.list_functions pillar 
cn1: 
  - pillar.data 
  - pillar.ext 
  - pillar.fetch 
  - pillar.file_exists 
  - pillar.get 
  - pillar.item 
  - pillar.items 
  - pillar.keys 
  - pillar.ls 
  - pillar.obfuscate 
  - pillar.raw 

Pillar數(shù)據(jù)跟特定的Minion關(guān)聯(lián)蛔糯,可以用來傳遞Minion自己的信息拯腮。管理員也可以自定義自己的pillar來管理minion。

自定義pillar

在master的sls文件中定義蚁飒,master配置需要指定pillar的目錄动壤。

pillar_roots: 
  base: 
  - /srv/pillar 
? pillar git:(master) ? pwd
/srv/pillar

? pillar git:(master) ? cat top.sls 
base:
  '*':
  - data
  - git

? pillar git:(master) ? cat data/init.sls
roles: webserver
? pillar git:(master) ? cat git.sls
{% if grains[‘os’] == ‘CentOs’ %}
git: git
{% elif grains[‘os’] == ‘Debian’ %}
git: git-core
{% endif %}

默認情況下,master配置文件中的所有數(shù)據(jù)都會添加到pillar中淮逻,且對所有的minion可用琼懊。如果要禁止這一個默認值,可以設置master文件中的選項:
pillar_opts: False

pillar跟sls一樣有自己的top.sls文件作為入口來組織其他的pillar爬早。base中 “×”制定所有minion擁有pillar:mongodb哼丈、zookeeper、kafka筛严、supervisor醉旦, 然后是各個minion組有自己的init.sls。kafka.sls中定義kafka對應的一些信息桨啃。

修改完pillar文件后需要用以下的命令刷新以下minion的信息:

? pillar git:(master) ? sudo salt 'cn1' saltutil.refresh_pillar 
cn1: 
  True 

使用pillar

Target:

#salt使用 -l 選項來使用pillar
? pillar git:(master) ? sudo salt -l ”roles:webserver” test.ping

sls文件中使用:

#如根據(jù)系統(tǒng)環(huán)境安裝git
? salt git:(master) ? cat git_env.sls
git:
  pkg.installed:
    - name: {{pillar[‘git’]}}

#或者:
git:
  pkg.installed:
    - name: {{ salt[‘pillar.get’](‘git’, ‘git’) }}

管理對象Target

在saltstack系統(tǒng)中车胡,我們的管理對象叫作Target。在Master上我們可以采用不同的Target去管理不同的Minion照瘾。這些Target可以是主機名匈棘、系統(tǒng)信息、定義的分組析命、甚至是自定義綁定的對象主卫。

有哪些匹配?

所有操作目標參數(shù):
 
Target Options: 
-E, --pcre                   正則匹配 
-L, --list                   列表匹配 
-G, --grain                  grains 匹配 
--grain-pcre                 grains 加正則匹配 
-N, --nodegroup              組匹配 
-R, --range                  范圍匹配 
-C, --compound               綜合匹配( 指定多個匹配) 
-I, --pillar                 pillar 值匹配 
-S, --ipcidr                 minions網(wǎng)段地址匹配 

各種匹配的詳細說明

  • minion ID
sudo salt ‘cn1’ test.ping
  • 通配符(*)
sudo salt ‘cn1’ test.ping
# 匹配所有的minion 
sudo salt '*' test.ping 

# 匹配ID開頭為cn的minion 
sudo salt 'cn*' test.ping 

# 匹配cn1鹃愤、cn2簇搅、cn3、cn4软吐、cn5 
sudo salt 'cn[1-5]' test.ping 

# 匹配web-x, web-y, web-z 
sudo salt 'web-[x-z]' test.ping 
  • 正則表達式
# 如: 匹配ID為assassin-production馍资,assassin-sandbox 
sudo salt -E 'assassin-[production|sandbox]' test.ping 

# 在state中也可以這么用 
base: 
  'assassin-[production|sandbox]' 
    - match: pcre 
    - webserver 
  • 列表匹配
# 對一些有特殊要求的minion可以手動指定ID作為Target 
sudo salt -L 'cn1, cn2, cn23' test.ping 
  • grains匹配
# 如 測試所有操作系統(tǒng)為ubuntu的為minion 
sudo salt -G 'os:Ubuntu' test.ping 

# 查看CPU架構(gòu)是x86_64的minion的cpu個數(shù) 
sudo salt -G 'cpuarch:x86_64' grains.item numcpus 


# 在top.sls中使用 
'node_type:web' 
  - match: grain 
  - webserver 
'node_type:mysql' 
  - match: grain 
  - database 
  • pillar匹配
  # pillar匹配跟grains差不多, 不過將grains對象換成pillar 
sudo salt -I 'somekey:specialvalue' test.ping 
  • 組匹配
# 節(jié)點分組需要先在top.sls或者master配置文件中定義好关噪。
nodegroups: 
 group1: 'L@foo.domain.com,bar.domain.com,baz.domain.com or bl*.domain.com' 
 group2: 'G@os:Debian and foo.domain.com' 
 group3: 'G@os:Debian and N@group1' 
 group4: 
 - 'G@foo:bar' 
 - 'or' 
 - 'G@foo:baz' 

sudo salt -N group1 test.ping 

# 在top.sls中: 
base: 
  group1: 
  - match: nodegroup 
  - webserver 
  • CIDR匹配
# 指定192.168.1.0/24網(wǎng)段內(nèi)的minion 
sudo salt -S '192.168.1.0/24' test.ping 
  • 復合匹配
salt -C 'G@os:Ubuntu or L@cn1,cn2' test.ping

最后鸟蟹,有時候匹配到的minion會很多,如果直接全部執(zhí)行master可能會掛機使兔。
所以我們可以分批執(zhí)行:

# 一次10個minion執(zhí)行 
sudo salt '*' -b 10 test.ping 

# 一次25%執(zhí)行 
sudo salt -G 'os:Ubuntu' --batch-size 25% test.ping 

針對管理對象Target的操作建钥,Module

  • 查看所有的module列表
sudo salt "cn1" sys.list_modules  
cn1: 
  - aliases 
  - alternatives 
  - archive 
  - artifactory 
... 
  • 查看指定module的所有function
? pillar git:(master) ? sudo salt "cn1" sys.list_functions cmd 
cn1: 
  - cmd.exec_code 
  - cmd.exec_code_all 
  - cmd.has_exec 
  - cmd.powershell 
  - cmd.retcode 
  - cmd.run 
  - cmd.run_all 
  - cmd.run_bg 
  - cmd.run_chroot 
  - cmd.run_stderr 
  - cmd.run_stdout 
  - cmd.script 
  …
  • 查看指定module用法
? pillar git:(master) ? sudo salt "cn1" sys.doc cmd 
cmd.exec_code: 

  Pass in two strings, the first naming the executable language, aka - 
  python2, python3, ruby, perl, lua, etc. the second string containing 
  the code you wish to execute. The stdout will be returned. 

  CLI Example: 

  salt '*' cmd.exec_code ruby 'puts "cheese"' 

配置管理States

salt states是salt模塊的擴展。主系統(tǒng)使用的狀態(tài)系統(tǒng)叫SLS系統(tǒng)虐沥,SLS代表Saltstack State熊经。States是Saltstack中的配置語言,在日常進行配置管理時需要編寫大量的States文件欲险。比如我們需要安裝一個包镐依,然后管理一個配置文件,最后保證某個服務正常運行天试。這里就需要我們編寫一些states sls文件去描述和實現(xiàn)我們想要的功能槐壳。

查看state modules的詳細使用

# 1、查看所有states列表
sudo salt ‘cn1’ sys.list_state_modules

# 2喜每、 查看指定state的所有function
sudo salt ‘cn1’ sys.list_state_functions cmd

# 3务唐、查看指定states的用法
sudo salt ‘cn1’ sys.state_doc cmd

# 4、查看指定state指定function的用法
sudo salt ‘cn1’ sys.state_doc cmd.run

Salt state樹

# 在/etc/salt/master中配置file_roots
file_roots: 
  base: 
  - /srv/salt 

Salt state的top文件

top.sls是state系統(tǒng)的入口文件带兜,它在大規(guī)模配置管理工作中負責指定哪些設備調(diào)用哪些states.sls文件枫笛。top.sls是salt state默認的sls文件,在未做特別制定的時候salt state會默認調(diào)用top.sls來執(zhí)行刚照。如:

sudo salt ‘cn1’ state.hightate

top.sls需要手動創(chuàng)建刑巧,位置則是salt state樹定義的目錄/srv/salt下。

調(diào)試Salt

# 開啟debug日志
salt-minion -l debug

# 設置超時
salt ‘*’ state.highstate -t 60

簡單的例子

cat top.sls
base:                       # 匹配狀態(tài)樹的base目錄配置
  ‘*’:                        # 匹配minion
    - webserver         # 表示執(zhí)行base目錄下的webserver.sls狀態(tài)文件或者webserver/init.sls文件

cat webserver.sls
apache:                   # ID聲明无畔,跟yum install apache指定的名稱一樣
  pkg:                      # 狀態(tài)聲明啊楚,說明要做什么狀態(tài)操作,pkg使用系統(tǒng)本地的軟件包管理工具
    - installed           # 函數(shù)聲明,說明該sls文件指定的執(zhí)行操作函數(shù)
  service:                #管理系統(tǒng)守護進程
    - running
    - require:
      - pkg: apache

# 更新所有minion的狀態(tài)
sudo salt “*” state.highstate

注:這樣就可以在所有的minion中安裝apache了檩互。

當然也可以不要top.sls特幔,直接指定sls文件來執(zhí)行
sudo salt ‘cn1’ state.sls webserver

或者使用apply function,apply會根據(jù)后面的參數(shù)來決定調(diào)用state.highstate還是state.sls
sudo salt ‘cn1’ state.apply webserver

簡單的擴展

添加配置文件和用戶
部署apache這樣的服務還需要添加其他的內(nèi)容,比如apache的配置文件闸昨,運行apache服務的用戶和組蚯斯。

# 目錄結(jié)構(gòu):
ls /srv/salt/apache
init.sls
http.conf
cat init.sls
apache:                   
 pkg:                     
    - installed          
  service:               
    - running
    - watch:
      - pkg: apache
      - file: /etc/httpd/conf/httpd.conf
      - user: apache
  user.present:
    - did: 87
    - gid: 87
    - home: /var/www/html
    - shell: /bin/nologin
    - require:
      - group: apache
group.present:
  - gid: 87
  - require:
    - pkg: apache
/etc/httpd/conf/httpd.conf
  file.managed:
    - source: salt://apache/httpd.conf
    - user: root
    - group: root
    - mode: 644

自定義module

根據(jù)官網(wǎng)的說法,自定義module應該存放在/srv/salt/_modules/目錄下饵较。同步到minion的方法有三種:

state.apply
saltutil.sync_modules
saltutil.sync_all

例子:

#encoding = utf8

def test():
    return 'this is a test'

def get_target():
    return __grains__['target']

def get_domain(service):
    dom = __pillar__[service]['domain']
    return dom

def deploy(service,version):
    target = get_target()
    domain = get_domain(service)
    cmd = "gover -s "+service+" -t "+target+" -v "+str(version)+" -d "+ domain
    return __salt__['cmd.run'](cmd)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末拍嵌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子循诉,更是在濱河造成了極大的恐慌横辆,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件茄猫,死亡現(xiàn)場離奇詭異狈蚤,居然都是意外死亡困肩,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門脆侮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锌畸,“玉大人,你說我怎么就攤上這事靖避√对妫” “怎么了?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵幻捏,是天一觀的道長盆犁。 經(jīng)常有香客問我,道長篡九,這世上最難降的妖魔是什么谐岁? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮瓮下,結(jié)果婚禮上翰铡,老公的妹妹穿的比我還像新娘。我一直安慰自己讽坏,他們只是感情好锭魔,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著路呜,像睡著了一般迷捧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上胀葱,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天漠秋,我揣著相機與錄音,去河邊找鬼抵屿。 笑死庆锦,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的轧葛。 我是一名探鬼主播搂抒,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼尿扯!你這毒婦竟也來了求晶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤衷笋,失蹤者是張志新(化名)和其女友劉穎芳杏,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡爵赵,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年吝秕,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亚再。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡郭膛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出氛悬,到底是詐尸還是另有隱情,我是刑警寧澤耘柱,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布如捅,位于F島的核電站,受9級特大地震影響调煎,放射性物質(zhì)發(fā)生泄漏镜遣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一士袄、第九天 我趴在偏房一處隱蔽的房頂上張望悲关。 院中可真熱鬧,春花似錦娄柳、人聲如沸寓辱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽秫筏。三九已至,卻和暖如春挎挖,著一層夾襖步出監(jiān)牢的瞬間这敬,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工蕉朵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留崔涂,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓始衅,卻偏偏與公主長得像冷蚂,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子觅闽,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容