1. 命令方式
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 ~]# salt -E 'server[1-4]' cmd.run hostname
server3:
server3
server2:
server2
[root@server1 ~]#
funcation是module提供的功能,Salt内置了大量有效的functions.
注意当执行的函数有参数时,需要引号(单双都可以)引起来:
[root@server1 ~]# salt -E 'server[1-4]' cmd.run 'df -h'
server2:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 17G 1.3G 16G 8% /
devtmpfs 484M 0 484M 0% /dev
tmpfs 496M 100K 496M 1% /dev/shm
tmpfs 496M 13M 483M 3% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 100M 0 100M 0% /run/user/0
server3:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/rhel-root 17G 1.3G 16G 8% /
devtmpfs 484M 0 484M 0% /dev
tmpfs 496M 100K 496M 1% /dev/shm
tmpfs 496M 13M 483M 3% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 100M 0 100M 0% /run/user/0
[root@server1 ~]#
Targets也可以指定列表:
[root@server1 ~]# salt -L 'server2,server3' test.ping
server2:
True
server3:
True
[root@server1 ~]#
arguments通过空格来界定参数:
[root@server1 ~]# salt server2 sys.doc pkg #查看模块文档
[root@server1 ~]# salt '*' pkg.install wget #所有minion安装wget
[root@server1 ~]# salt '*' pkg.remove wget #所有minion卸载wget
2. 文件方式
查看配置文件可以看出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。
查看日志可以看出已经卸载:
3. 编写远程执行模块
我们也可以自定义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.3G 16G 8% /
devtmpfs 484M 0 484M 0% /dev
tmpfs 496M 60K 496M 1% /dev/shm
tmpfs 496M 13M 483M 3% /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.3G 16G 8% /
devtmpfs 484M 0 484M 0% /dev
tmpfs 496M 60K 496M 1% /dev/shm
tmpfs 496M 13M 483M 3% /run
tmpfs 496M 0 496M 0% /sys/fs/cgroup
/dev/sda1 1014M 133M 882M 14% /boot
tmpfs 100M 0 100M 0% /run/user/0
[root@server1 _modules]#
4. 使用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
[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
5. 使用saltstack安装配置httpd
(1)安装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/)
(2)之后我们需要准备配置文件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
(3)启动服务
[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
(4)在修改配置文件后的操作:在更改文件后并没有重启应用,需要进行以下设置
[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
(5)也可以加入设置重载配置文件或者开机自启动
- reload: true
- enable: true
(6)其他的写法
[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
作用完全一样,多种写法而已。