目錄
- 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)