安裝
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的認證
salt-key -a minion.saltstack.com
接受所有未驗證的鑰匙
salt-key -A
test.ping確認一個minion是否連接正常
salt '*' test.ping
是指向所有minions的目標。
test.ping告訴minion運行test.ping函數。
運行這條命令的結果將會是master指示所有的minions并行執行test.ping并返回結果。
這不是真正的ICMP ping,而是一個簡單的函數返回True。使用test.ping是確認一個minion是否連接正常
disk.usage
salt '*' disk.usage
network.interfaces
salt '*' network.interfaces
cmd.run
使用cmd.run遠程執行命令,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 函數會自動將本地系統包管理器映射到相同的salt函數。這意味著 pkg.install 在基于Red Hat系統上將使用 yum 而在Debian系統上則使用 apt 來安裝包,等等。
salt 'salt-minion' pkg.install vim
匹配主機
- 普通匹配
匹配所有 '*'
匹配單個 'minion_id'
- 正則匹配
使用-E ,--pcre 進行正則匹配
salt -E '^stack-node\w+' cmd.run "free -m"
返回結果:
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,以主機id名列表的形式進行過濾,格式與Python的列表相似,即不同主機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,根據被控主機的IP地址或IP子網進行匹配
[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系統的核心。SLS描述了系統的目標狀態,由格式簡單的數據構成。這經常被稱作配置管理。
top.sls
top.sls 是配置管理的入口文件,一切都是從這里開始,在master 主機上,默認存放在/srv/salt/目錄.
top.sls 默認從 base 標簽開始解析執行,下一級是操作的目標,可以通過正則,grain模塊,或分組名,來進行匹配,再下一級是要執行的state文件,不包換擴展名。
創建 /srv/salt/top.sls
#正則匹配
base:
'*':
- webserver
#組匹配
base:
group1:
- match: nodegroup
- webserver
#grain匹配,必須要有- match: grain
base:
'os:Fedora':
- match: grain
- webserver
準備好top.sls文件后,編寫一個state文件
#/srv/salt/webserver.sls
apache: # 標簽定義
pkg: # state declaration
- installed # function declaration
- 第一行被稱為(ID declaration) 標簽定義,在這里被定義為安裝包的名。注意:在不同發行版軟件包命名不同,比如 fedora 中叫httpd的包 Debian/Ubuntu中叫apache2
- 第二行被稱為(state declaration)狀態定義, 在這里定義使用(pkg state module)
- 第三行被稱為(function declaration)函數定義, 在這里定義使用(pkg state module)調用 installed 函數
最后可以在終端中執行命令來查看結果:
salt '*' state.highstate
或附件 test=True參數 測試執行
salt '*' state.highstate -v test=True
主控端對目標主機(targeted minions)發出指令運行state.highstatem模塊,目標主機首先會對top.sls下載,解析,然后按照top.sls內匹配規則內的定義的模塊將被下載,解析,執行,然后結果反饋給 master.
SLS文件
注意在以上的例子中,SLS文件 webserver.sls 被簡稱為webserver. SLS文件命名空間有如下幾條基本的規則:
1、SLS文件的擴展名 .sls 被省略。 (例如. webserver.sls 變成 webserver)
2、子目錄可以更好的組織,每個子目錄都由一個點來表示.(例如 webserver/dev.sls 可以簡稱為 webserver.dev)
3、如果子目錄創建一個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
創建一個引用這些目錄的 server.sls
server:
- apache
- ssh
- ...
state的層級關系
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配合使用,作用是 修改,或擴展引用的state文件的某個字段
/srv/salt/apache.sls
apache:
pkg:
- installed
service:
- running
- require:
- pkg: apache
extend默認是替換引用文件的某個字段的屬性,簡單說就是先加載,再修改部分字段。如例
/srv/salt/apache-change.sls
include:
- apache
extend:
apache
pkg:
- name: vim
- installed
當extend與watch,或require結合使用的時候,則是擴展某個字段的屬性。如例:
/srv/salt/apache-custom.sls
include:
- apache
extend:
apache
service:
- watch:
- file: /etc/redis.conf
state的邏輯關系列表
match: 配模某個模塊,比如 match: grain match: nodegroup
require: 依賴某個state,在運行此state前,先運行依賴的state,依賴可以有多個
watch: 在某個state變化時運行此模塊
order: 優先級比require和watch低,有order指定的state比沒有order指定的優先級高
state的邏輯關系實例
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功能外,還增了關注狀態的功能。檢查是否有變化為前提條件。
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:優先級比require和watch低,有order指定的state比沒有order指定的優先級高
vim:
pkg.installed:
- order: 1
想讓某個state最后一個運行,可以用last.
環境變量
示例:
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默認的運行環境是base環境,但是它并不讀取top.sls(top.sls定義了運行環境以及需要運行的sls)。關于state.sls的官方文檔說明如下:
salt.modules.state.sls(mods, saltenv='base', test=None, exclude=None, queue=False, env=None,**kwargs)
這里saltenv指的是運行環境,默認是base環境。
state.highstate: 這個是全局的所有環境,以及所有狀態都生效。它會讀取每一個環境的top.sls,并且對所有sls都生效。
state.sls也可以指定讀取哪個環境:
state.sls salt_env='prod' xxxx.sls
這個xxxx.sls可以不在top.sls中記錄。
模板
使用模板可以精簡sls,使sls文件可以使用Python的循環,判斷等邏輯。
示例:
{% 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狀態使用template參數 - template: jiaja
2.模板文件里面使用{{名稱}}
3.File狀態模塊要指定變量列表
- 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語法
規則一:縮進
YAML使用一個固定的縮進風格表示數據層結構關系,Saltstack需要每個縮進級別由兩個空格組成。一定不能使用tab鍵
規則二:冒號
YAML:
mykey: my_value
每個冒號后面一定要有一個空格(以冒號結尾不需要空格,表示文件路徑的模版可以不需要空格)
規則三:短橫線
想要表示列表項,使用一個短橫杠加一個空格。多個項使用同樣的縮進級別作為同一個列表的一部分。
my_dictionary:
- list_value_one
- list_value_two
- list_value_three