更多關(guān)注:http://www.mknight.cn/
安裝
yum install salt-master
or
yum install salt-minion
啟動
systemctl start salt-master
or
/etc/init.d/salt-master start
基本命令
salt-key
salt-key命令用來管理master上所有的密鑰的;列出master上的密鑰:
salt-key -L
salt-key -a 接受一個minion的認(rèn)證
salt-key -a minion.saltstack.com
接受所有未驗證的鑰匙
salt-key -A
test.ping確認(rèn)一個minion是否連接正常
salt '*' test.ping
是指向所有minions的目標(biāo)。
test.ping告訴minion運行test.ping函數(shù)。
運行這條命令的結(jié)果將會是master指示所有的minions并行執(zhí)行test.ping并返回結(jié)果。
這不是真正的ICMP ping,而是一個簡單的函數(shù)返回True。使用test.ping是確認(rèn)一個minion是否連接正常
disk.usage
salt '*' disk.usage
network.interfaces
salt '*' network.interfaces
cmd.run
使用cmd.run遠(yuǎn)程執(zhí)行命令,cmd是模塊,run是cmd模塊的一個方法
salt '*' cmd.run 'df -h'
查看hosts
salt '*' cmd.run "grep salt /etc/hosts"
mq:
192.168.1.31 salt
owncloud:
192.168.1.31 salt
docker:
192.168.1.31 salt
dev.db:
192.168.1.31 salt
批量修改hosts
salt '*' cmd.run "sed -i 's/192.168.1.30/192.168.1.31/' /etc/hosts"
pkg
pkg 函數(shù)會自動將本地系統(tǒng)包管理器映射到相同的salt函數(shù)。這意味著 pkg.install 在基于Red Hat系統(tǒng)上將使用 yum 而在Debian系統(tǒng)上則使用 apt 來安裝包,等等。
salt 'salt-minion' pkg.install vim
匹配主機(jī)
- 普通匹配
匹配所有 '*'
匹配單個 'minion_id'
- 正則匹配
使用-E ,--pcre 進(jìn)行正則匹配
salt -E '^stack-node\w+' cmd.run "free -m"
返回結(jié)果:
stack-node01:
total used free shared buffers cached
Mem: 1877 377 1499 0 27 223
-/+ buffers/cache: 126 1751
Swap: 4095 0 4095
stack-node02:
total used free shared buffers cached
Mem: 1877 377 1499 0 28 223
-/+ buffers/cache: 125 1751
Swap: 4095 0 4095
- 列表匹配
-L,--list,以主機(jī)id名列表的形式進(jìn)行過濾,格式與Python的列表相似,即不同主機(jī)id 名稱使用逗號分隔
[root@stack-master ~]# salt -L 'stack-node01,stack-node02' cmd.run "free -m"
stack-node02:
total used free shared buffers cached
Mem: 1877 376 1501 0 28 223
-/+ buffers/cache: 123 1753
Swap: 4095 0 4095
stack-node01:
total used free shared buffers cached
Mem: 1877 378 1499 0 28 223
-/+ buffers/cache: 126 1751
Swap: 4095 0 4095
- IP匹配
-S,--ipcidr,根據(jù)被控主機(jī)的IP地址或IP子網(wǎng)進(jìn)行匹配
[root@stack-master ~]# salt -S 172.16.202.0/24 cmd.run "free -m"
stack-master:
total used free shared buffers cached
Mem: 1877 676 1201 0 30 225
-/+ buffers/cache: 420 1457
Swap: 4095 0 4095
stack-node01:
total used free shared buffers cached
Mem: 1877 378 1498 0 28 223
-/+ buffers/cache: 126 1751
Swap: 4095 0 4095
stack-node02:
total used free shared buffers cached
Mem: 1877 376 1500 0 28 223
-/+ buffers/cache: 123 1753
Swap: 4095 0 4095
配置管理
SLS(代表SaLt State文件)是Salt State系統(tǒng)的核心。SLS描述了系統(tǒng)的目標(biāo)狀態(tài),由格式簡單的數(shù)據(jù)構(gòu)成。這經(jīng)常被稱作配置管理。
top.sls
top.sls 是配置管理的入口文件,一切都是從這里開始,在master 主機(jī)上,默認(rèn)存放在/srv/salt/目錄.
top.sls 默認(rèn)從 base 標(biāo)簽開始解析執(zhí)行,下一級是操作的目標(biāo),可以通過正則,grain模塊,或分組名,來進(jìn)行匹配,再下一級是要執(zhí)行的state文件,不包換擴(kuò)展名。
創(chuàng)建 /srv/salt/top.sls
#正則匹配
base:
'*':
- webserver
#組匹配
base:
group1:
- match: nodegroup
- webserver
#grain匹配,必須要有- match: grain
base:
'os:Fedora':
- match: grain
- webserver
準(zhǔn)備好top.sls文件后,編寫一個state文件
#/srv/salt/webserver.sls
apache: # 標(biāo)簽定義
pkg: # state declaration
- installed # function declaration
- 第一行被稱為(ID declaration) 標(biāo)簽定義,在這里被定義為安裝包的名。注意:在不同發(fā)行版軟件包命名不同,比如 fedora 中叫httpd的包 Debian/Ubuntu中叫apache2
- 第二行被稱為(state declaration)狀態(tài)定義, 在這里定義使用(pkg state module)
- 第三行被稱為(function declaration)函數(shù)定義, 在這里定義使用(pkg state module)調(diào)用 installed 函數(shù)
最后可以在終端中執(zhí)行命令來查看結(jié)果:
salt '*' state.highstate
或附件 test=True參數(shù) 測試執(zhí)行
salt '*' state.highstate -v test=True
主控端對目標(biāo)主機(jī)(targeted minions)發(fā)出指令運行state.highstatem模塊,目標(biāo)主機(jī)首先會對top.sls下載,解析,然后按照top.sls內(nèi)匹配規(guī)則內(nèi)的定義的模塊將被下載,解析,執(zhí)行,然后結(jié)果反饋給 master.
SLS文件
注意在以上的例子中,SLS文件 webserver.sls 被簡稱為webserver. SLS文件命名空間有如下幾條基本的規(guī)則:
1、SLS文件的擴(kuò)展名 .sls 被省略。 (例如. webserver.sls 變成 webserver)
2、子目錄可以更好的組織,每個子目錄都由一個點來表示.(例如 webserver/dev.sls 可以簡稱為 webserver.dev)
3、如果子目錄創(chuàng)建一個init.sls的文件,引用的時候僅指定該目錄即可. (例如 webserver/init.sls 可以簡稱為 webserver)
4、如果一個目錄下同時存在webserver.sls 和 webserver/init.sls,那么 webserver/init.sls 將被忽略,SLS文件引用的webserver將只引用webserver.sls
示例:
apache/init.sls
apache/httpd.conf
ssh/init.sls
ssh/server.sls
ssh/banner
ssh/ssh_config
ssh/sshd_config
創(chuàng)建一個引用這些目錄的 server.sls
server:
- apache
- ssh
- ...
state的層級關(guān)系
include
include 包含某個state文件
/srv/salt/apache.sls
apache:
pkg:
- installed
service:
- running
- require:
- pkg: apache
使用 include 可以包換有state文件而不必重新寫
/srv/salt/apache-custom.sls
include:
apache
extend
extend 與include配合使用,作用是 修改,或擴(kuò)展引用的state文件的某個字段
/srv/salt/apache.sls
apache:
pkg:
- installed
service:
- running
- require:
- pkg: apache
extend默認(rèn)是替換引用文件的某個字段的屬性,簡單說就是先加載,再修改部分字段。如例
/srv/salt/apache-change.sls
include:
- apache
extend:
apache
pkg:
- name: vim
- installed
當(dāng)extend與watch,或require結(jié)合使用的時候,則是擴(kuò)展某個字段的屬性。如例:
/srv/salt/apache-custom.sls
include:
- apache
extend:
apache
service:
- watch:
- file: /etc/redis.conf
state的邏輯關(guān)系列表
match: 配模某個模塊,比如 match: grain match: nodegroup
require: 依賴某個state,在運行此state前,先運行依賴的state,依賴可以有多個
watch: 在某個state變化時運行此模塊
order: 優(yōu)先級比require和watch低,有order指定的state比沒有order指定的優(yōu)先級高
state的邏輯關(guān)系實例
require:依賴某個state,在運行此state前,先運行依賴的state,依賴可以有多個.
先檢查依賴,再運行其他。
httpd: # maps to "name"
pkg:
- installed
file: # maps to State module filename
- managed: # maps to the managed function in the file State module
- name: /etc/httpd/conf/httpd.conf # one of many options passed to the manage function
- source: salt://httpd/httpd.conf
- require:
- pkg: httpd
watch:在某個state變化時運行此模塊,watch除具備require功能外,還增了關(guān)注狀態(tài)的功能。檢查是否有變化為前提條件。
redis:
pkg:
- latest
file.managed:
- source: salt://redis/redis.conf
- name: /etc/redis.conf
- require:
- pkg: redis
service.running:
- enable: True
- watch:
- file: /etc/redis.conf
- pkg: redis
order:優(yōu)先級比require和watch低,有order指定的state比沒有order指定的優(yōu)先級高
vim:
pkg.installed:
- order: 1
想讓某個state最后一個運行,可以用last.
環(huán)境變量
示例:
file_roots:
base:
- /srv/salt/
dev:
- /srv/salt/dev/services
- /srv/salt/dev/states
prod:
- /srv/salt/prod/services
- /srv/salt/prod/states
state.sls默認(rèn)的運行環(huán)境是base環(huán)境,但是它并不讀取top.sls(top.sls定義了運行環(huán)境以及需要運行的sls)。關(guān)于state.sls的官方文檔說明如下:
salt.modules.state.sls(mods, saltenv='base', test=None, exclude=None, queue=False, env=None,**kwargs)
這里saltenv指的是運行環(huán)境,默認(rèn)是base環(huán)境。
state.highstate: 這個是全局的所有環(huán)境,以及所有狀態(tài)都生效。它會讀取每一個環(huán)境的top.sls,并且對所有sls都生效。
state.sls也可以指定讀取哪個環(huán)境:
state.sls salt_env='prod' xxxx.sls
這個xxxx.sls可以不在top.sls中記錄。
模板
使用模板可以精簡sls,使sls文件可以使用Python的循環(huán),判斷等邏輯。
示例:
{% for item in ['tmp','test'] %}
/opt/{{ item }}:
file.directory:
- user: root
- group: root
- mode: 755
- makedirs: True
{% endfor %}
httpd:
pkg.managed:
{% if grains['os'] == 'Ubuntu' %}
- name: apache2
{% elif grains['os'] == 'CentOS' %}
- name: httpd
{% endif %}
- installed
使用的步驟比較簡單:
1.File狀態(tài)使用template參數(shù) - template: jiaja
2.模板文件里面使用{{名稱}}
3.File狀態(tài)模塊要指定變量列表
- defaults:
PORT:8080
示例:
[root@linux-node1 base]# cd /srv/salt/base/
[root@linux-node1 base]# vim dns.sls
/etc/resolv.conf:
file.managed:
- source: salt://files/resolv.conf
- user: root
- group: root
- mode: 644
- template: jinja
- defaults:
DNS_SERVER: 10.0.0.2
[root@linux-node1 base]# vim files/resolv.conf
###hehe
nameserver {{ DNS_SERVER }}
[root@linux-node1 base]# salt '*' state.highstate
語法
YAML語法
規(guī)則一:縮進(jìn)
YAML使用一個固定的縮進(jìn)風(fēng)格表示數(shù)據(jù)層結(jié)構(gòu)關(guān)系,Saltstack需要每個縮進(jìn)級別由兩個空格組成。一定不能使用tab鍵
規(guī)則二:冒號
YAML:
mykey: my_value
每個冒號后面一定要有一個空格(以冒號結(jié)尾不需要空格,表示文件路徑的模版可以不需要空格)
規(guī)則三:短橫線
想要表示列表項,使用一個短橫杠加一個空格。多個項使用同樣的縮進(jìn)級別作為同一個列表的一部分。
my_dictionary:
- list_value_one
- list_value_two
- list_value_three
更多關(guān)注:http://www.mknight.cn/