Saltstack简介及部署可以参考:https://blog.csdn.net/qq_35887546/article/details/106172282
一、命令方式
Salt命令由三个主要部分构成:
salt '<target>' <function> [arguments]
target
: 指定哪些minion, 默认的规则是使用globe匹配minion id.
salt内置的执行模块列表:http://docs.saltstack.cn/ref/modules/all/index.html
[root@server1 minions]# salt '*' test.ping
server2:
True
server3:
True
Targets也可以使用正则表达式:
[root@server1 minions]# salt -E 'server[1-4]' cmd.run hostname
server2:
server2
server3:
server3
funcation是module提供的功能,Salt内置了大量有效的functions.
注意当执行的函数有参数时,需要引号(单双都可以)引起来:
[root@server1 minions]# salt -E 'server[1-4]' cmd.run 'df -h'
server3:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 17G 1.2G 16G 8% /
devtmpfs 484M 0 484M 0% /dev
tmpfs 496M 80K 496M 1% /dev/shm
tmpfs 496M 6.7M 489M 2% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 100M 0 100M 0% /run/user/0
server2:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 17G 1.2G 16G 8% /
devtmpfs 484M 0 484M 0% /dev
tmpfs 496M 120K 496M 1% /dev/shm
tmpfs 496M 6.7M 489M 2% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 100M 0 100M 0% /run/user/0
Targets也可以指定列表:
[root@server1 minions]# salt -L 'server2,server3' test.ping
server2:
True
server3:
True
arguments通过空格来界定参数:
[root@server1 ~]# salt server2 sys.doc pkg #查看模块文档
[root@server1 ~]# salt '*' pkg.install wget #所有minion安装wget
[root@server1 ~]# salt '*' pkg.remove wget #所有minion卸载wget
二、文件方式
编辑远程执行文件
查看配置文件可以看出slatstack默认的base文件目录为/srv/salt
,其中salt
目录需要我们自己新建:
[root@server1 ~]# mkdir /srv/salt
[root@server1 ~]# cd /srv/salt/
Salt 状态系统的核心是SLS,或者叫SaLt State 文件。
SLS表示系统将会是什么样的一种状态,而且是以一种很简单的格式来包含这些数据,常被叫做配置管理。
sls文件命名:
- sls文件以”.sls”后缀结尾,但在调用是不用写此后缀。
- 使用子目录来做组织是个很好的选择。
- init.sls 在一个子目录里面表示引导文件,也就表示子目录本身, 所以
apache/init.sls
就是表示apache
. - 如果同时存在apache.sls 和 apache/init.sls,则 apache/init.sls
被忽略,apache.sls将被用来表示 apache.
接下来我们就可以编辑文件了,编辑的文件使用yaml语法:
规则一: 缩进 Salt需要每个缩进级别由两个空格组成,不要使用tabs。
规则二: 冒号 字典的keys在YAML中的表现形式是一个以冒号结尾的字符串。 my_key: my_value
规则三: 短横杠
想要表示列表项,使用一个短横杠加一个空格。
- list_value_one
- list_value_two
示例,编辑文件:
[root@server1 salt]# vim install.sls
[root@server1 salt]# cat install.sls
httpd: ## ID声明
pkg.installed ##状态声明.函数声明
指定server2执行以上文件:
[root@server1 salt]# salt server2 state.sls install
注意,指定文件时不需要加后缀sls。
查看server2的日志可以看出已经安装:
可以看出还安装了很多依赖性的包。
也可以安装多个包:
[root@server1 salt]# vim install.sls
[root@server1 salt]# cat install.sls
httpd:
pkg.installed
wget:
pkg.installed
[root@server1 salt]# salt server3 state.sls install
查看server3日志可以看出已经安装成功:
再执行一次
salt server3 state.sls install
命令时状态将不会改变,这里与ansible类似:
也可以使用以下这种写法:
[root@server1 salt]# vim install.sls
[root@server1 salt]# cat install.sls
apache:
pkg.installed:
- pkgs:
- httpd
- wget
- php
卸载应用可以使用pkg.removed
:
[root@server1 salt]# vim install.sls
[root@server1 salt]# cat install.sls
apache:
pkg.removed:
- pkgs:
- httpd
- wget
- php
[root@server1 salt]# salt '*' state.sls install
以上表示再所有节点卸载httpd,wget,php。
查看日志可以看出已经卸载:
编写远程执行模块
我们也可以自定义saltstack模块,自定义的模块需要在/srv/salt/_modules
目录中:
创建模块目录:
[root@server1 salt]# mkdir /srv/salt/_modules
[root@server1 salt]# ls
install.sls _modules
编写模块文件:
[root@server1 salt]# cd _modules/
[root@server1 _modules]# vim mydisk.py
[root@server1 _modules]# cat mydisk.py
def df():
return __salt__['cmd.run']('df -h')
以上文件表示定义了一个名为mydisk
的模块,且模块内有一个函数df
,函数的作用是运行df -h
命令。
同步模块:
[root@server1 _modules]# salt '*' saltutil.sync_modules
server2:
- modules.mydisk
server3:
- modules.mydisk
同步后salt-master会将模块信息发送到指定的salt-minion,salt-minion将信息保存到/var/cache/salt/minion/
目录下:
调用模块:
[root@server1 _modules]# salt '*' mydisk.df
server3:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 17G 1.2G 16G 8% /
devtmpfs 484M 0 484M 0% /dev
tmpfs 496M 80K 496M 1% /dev/shm
tmpfs 496M 6.7M 489M 2% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 100M 0 100M 0% /run/user/0
server2:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 17G 1.2G 16G 8% /
devtmpfs 484M 0 484M 0% /dev
tmpfs 496M 120K 496M 1% /dev/shm
tmpfs 496M 6.7M 489M 2% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 100M 0 100M 0% /run/user/0
使用top文件
如果我们想要在不同的节点安装不一样的包,可以用以下这种方式实现:
[root@server1 salt]# vim apache.sls
[root@server1 salt]# cat apache.sls
apache:
pkg.installed:
- pkgs:
- httpd
[root@server1 salt]# vim nfs.sls
[root@server1 salt]# cat nfs.sls
nfs:
pkg.installed:
- pkgs:
- nfs-utils
[root@server1 salt]# ls
apache.sls _modules nfs.sls
现在我们要求在server2安装apache文件,在server3安装nfs文件,原来的方法是分两次指定节点执行指定文件,也可以使用top文件的方式:
[root@server1 salt]# vim top.sls
[root@server1 salt]# cat top.sls
base:
'server2':
- apache
'server3':
- nfs
执行top文件:
[root@server1 salt]# salt '*' state.highstate
在日常使用中,我们最好使用子目录来做组织:
[root@server1 salt]# ls
apache.sls _modules nfs.sls top.sls
[root@server1 salt]# mkdir apache
[root@server1 salt]# mkdir nfs
[root@server1 salt]# mv apache.sls apache
[root@server1 salt]# mv nfs.sls nfs
[root@server1 salt]# ls
apache _modules nfs top.sls
这时目录已经发生变化,我们现在需要调用apahce目录下的apache.sls文件时需要使用以下方式:
[root@server1 salt]# salt server2 state.sls apache.apache
同样sls后缀不需要加。
那么此时上面的nfs文件就需要这么写:
[root@server1 salt]# vim top.sls
[root@server1 salt]# cat top.sls
base:
'server2':
- apache.apache
'server3':
- nfs.nfs
[root@server1 salt]# salt '*' state.highstate
使用入口文件init.sls
也可以使用入口文件init.sls
:
[root@server1 salt]# cd apache/
[root@server1 apache]# mv install.sls init.sls
当有入口文件时,我们不需要再指定文件,只需指定目录名称即可:
[root@server1 salt]# vim top.sls
[root@server1 salt]# cat top.sls
base:
'server2':
- apache
'server3':
- nfs.nfs
[root@server1 salt]# salt '*' state.highstate
三、使用saltstack安装配置httpd
安装httpd并准备配置文件:
[root@server1 apache]# vim init.sls
[root@server1 apache]# cat init.sls
apache:
pkg.installed:
- pkgs:
- httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/httpd.conf
其中file.managed
中的name
表示的是minion
端的文件路径,source
表示master
端的文件路径,salt://
表示saltstack的base路径(即/srv/salt/
)
之后我们需要准备配置文件httpd.conf
:
[root@server1 apache]# scp server3:/etc/httpd/conf/httpd.conf .
[root@server1 apache]# ls
httpd.conf init.sls
[root@server1 apache]# pwd
/srv/salt/apache
现在可以直接进行推送:
[root@server1 apache]# salt server2 state.sls apache
可以看出先进行的是包的安装,再进行配置文件的更改,由于我们没有更改配置文件,因此状态也没有改变,saltstack通过对比文件的md5值来判断文件是否更改。
[root@server1 apache]# md5sum httpd.conf #查看文件的md5值
f5e7449c0f17bc856e86011cb5d152ba httpd.conf
[root@server1 apache]# vim httpd.conf
[root@server1 apache]# cat httpd.conf | grep 8080
更改端口为8080:
Listen 8080
再次查看文件的md5值发现已经改变:
[root@server1 apache]# md5sum httpd.conf
04e9239e7bd5d5b9b85864226d60eee5 httpd.conf
进行推送:
[root@server1 apache]# salt server2 state.sls apache
在server2可以看出文件的md5值和salt-master是同步的:
推送前:
[root@server2 salt]# md5sum /etc/httpd/conf/httpd.conf
f5e7449c0f17bc856e86011cb5d152ba /etc/httpd/conf/httpd.conf
推送后:
[root@server2 salt]# md5sum /etc/httpd/conf/httpd.conf
04e9239e7bd5d5b9b85864226d60eee5 /etc/httpd/conf/httpd.conf
启动服务:
[root@server1 apache]# vim init.sls
[root@server1 apache]# cat init.sls
apache:
pkg.installed:
- pkgs:
- httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/httpd.conf
service.running:
- httpd
启动服务使用了service
模块中的running
函数。
推送:
[root@server1 apache]# salt server2 state.sls apache
在server2查看:
[root@server2 salt]# netstat -antlp
.....
tcp6 0 0 :::8080 :::* LISTEN 14862/httpd
.....
但是此时是8080端口,我们更改为80:
[root@server1 apache]# vim httpd.conf
[root@server1 apache]# cat httpd.conf | grep 80
Listen 80
[root@server1 apache]# salt server2 state.sls apache
推送后可以发现推送成功但是端口并没有更改:
[root@server2 salt]# netstat -antlp
......
tcp6 0 0 :::8080 :::* LISTEN 14862/httpd
......
原因就是我们在更改文件后并没有重启应用,需要进行以下设置:
[root@server1 apache]# vim init.sls
[root@server1 apache]# cat init.sls
apache:
pkg.installed:
- pkgs:
- httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/httpd.conf
service.running:
- name: httpd
- watch:
- file: apache
watch表示监控唯一性声明apache下的文件(即salt://apache/httpd.conf
),当文件有更改时即重启服务。
更改文件后推送:
[root@server1 apache]# vim httpd.conf
[root@server1 apache]# cat httpd.conf | grep 8000
Listen 8000
[root@server1 apache]# salt server2 state.sls apache
从返回状态可以看出服务已经重启,在server2查看:
[root@server2 salt]# netstat -antlp
......
tcp6 0 0 :::8000 :::* LISTEN 14944/httpd
更改成功。
默认的触发方式为restart,我们也可以让它以reload的触发方式:
[root@server1 apache]# vim init.sls
[root@server1 apache]# cat init.sls
apache:
pkg.installed:
- pkgs:
- httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/httpd.conf
service.running:
- name: httpd
- reload: true
- watch:
- file: apache
即加一个- reload: true
更改并推送:
[root@server1 apache]# vim httpd.conf
[root@server1 apache]# cat httpd.conf | grep 8888
Listen 8888
[root@server1 apache]# salt server2 state.sls apache
也可以加
enable: true
设置开即自启:
[root@server1 apache]# vim init.sls
[root@server1 apache]# cat init.sls
apache:
pkg.installed:
- pkgs:
- httpd
file.managed:
- name: /etc/httpd/conf/httpd.conf
- source: salt://apache/httpd.conf
service.running:
- name: httpd
- reload: true
- enable: true
- watch:
- file: apache
[root@server1 apache]#
[root@server1 apache]# salt server2 state.sls apache
也可以使用其他的写法:
[root@server1 apache]# vim init.sls
[root@server1 apache]# cat init.sls
apache:
pkg.installed:
- pkgs:
- httpd
service.running:
- name: httpd
- reload: true
- enable: true
- watch:
- file: /etc/httpd/conf/httpd.conf
/etc/httpd/conf/httpd.conf:
file.managed:
- source: salt://apache/httpd.conf
以上的作用与上面的写法是相同的。