本文共 12009 字,大约阅读时间需要 40 分钟。
saltstack的salt命令可以用于远程在minion端上执行命令,本节介绍一下salt的常用语法。
1.test.ping用于测试能否ping通minion端,测试已认证的minion端是否存活:
[root@server ~]# salt '*' test.ping # 这里的*表示测试所有已经认证的minion端server: Trueclient: True[root@server ~]# salt 'client' test.ping # 指定测试某一个minion端client: True[root@server ~]#
2.cmd.run可以执行系统的命令,例如我要让所有机器都执行hostname命令:
[root@server ~]# salt '*' cmd.run "hostname" # 但是如果是普通用户的话,只能执行普通用户能够执行的命令server: serverclient: client[root@server ~]#
说明: 这里的必须是在master上已经被接受过认证的客户端,可以通过salt-key查到,通常是我们已经设定的id值。关于这部分内容,它支持通配、列表以及正则。 比如两台客户端test-01,test-02, 那我们可以写成salt 'test-\', salt 'test-0[12]' salt -L 'test-01,test-02' salt -E 'test-(01|02)'等形式,使用列表,即多个机器用逗号分隔,而且需要加-L,使用正则必须要带-E选项。 它还支持grains,加-G选项,pillar 加-I选项。
支持正则表达式:
[root@server ~]# salt 'cli*' test.pingclient: True[root@server ~]# salt 'cli[a-z]*' test.pingclient: True[root@server ~]#
-L选项指定使用的是列表,需要用逗号进行分割:
[root@server ~]# salt -L 'server,client' cmd.run "hostname"client: clientserver: server[root@server ~]#
有些正则表达式的使用需要加上-E来指定,不然不支持:
[root@server ~]# salt -E 'cl(i|e|n|t)*' cmd.run "hostname"client: client[root@server ~]#
grains是在minion启动时收集到的一些信息,比如操作系统类型、网卡IP、内核版本、cpu架构等等。
[root@server ~]# salt "client" grains.ls # 列出所有的grains项目名字[root@server ~]# salt "client" grains.items # 列出所有grains项目以及值
注:grains的信息并不是动态的,并不会实时变更,它是在minion启动时收集到的。我们可以根据grains收集到的一些信息,做配置管理、资产管理等工作。
grains支持自定义信息,示例:
1.在minion端上编辑配置文件:[root@client ~]# vim /etc/salt/grains # 增加自定义信息,格式是 键 : 值 形式的role: nginxenv: test
2.配置完之后需要重启minion服务:
systemctl restart salt-minion
3.配置完成后,就可以回到master上,获取grains:
[root@server ~]# salt '*' grains.item role envclient: ---------- env: test role: nginxserver: ---------- env: role:[root@server ~]# salt '*' grains.item abc efg # 如果我们获取不存在的grains信息,就只会返回空信息server: ---------- abc: efg:client: ---------- abc: efg:[root@server ~]#
可以根据grains获取到的一些属性信息来执行系统命令,可以起到一个匹配的作用:
[root@server ~]# salt -G role:nginx cmd.run 'hostname'client: client[root@server ~]#
pillar和grains不一样,pillar是在master上定义的,并且是针对minion定义的一些信息。像一些比较重要的数据(密码)可以存在pillar里,还可以定义变量等。
pillar也支持自定义信息,配置自定义pillar示例:
[root@server ~]# vim /etc/salt/master # 在文件中搜索pillar_roots,然后去掉这几行的注释,注意保留空格pillar_roots: base: # 键 - /srv/pillar # 值,这值配置的是一个目录
重启salt-master服务:
systemctl restart salt-master.service
接着创建/srv/pillar目录,并且编辑一个子配置文件用于一会的测试:
[root@server ~]# mkdir /srv/pillar[root@server ~]# ls /srv/pillar[root@server ~]# vim /srv/pillar/test.sls # 内容如下,同样的是键值形式conf: /etc/test.conf
编写主配置文件:
[root@server ~]# vim /srv/pillar/top.sls # 内容如下base: # 表示根 'client': # 主机名,缩进两个空格 - test # 加载哪个前缀的配置文件,缩进四个空格
然后重启master:
systemctl restart salt-master
当更改完pillar配置文件后,我们可以通过刷新pillar配置来获取新的pillar状态:
[root@server ~]# salt '*' saltutil.refresh_pillarserver: Trueclient: True[root@server ~]#
验证一下是能否识别到自定义的的pillar信息:
[root@server ~]# salt '*' pillar.item confserver: ---------- conf:client: ---------- conf: /etc/test.conf[root@server ~]#
pillar同样可以用来作为salt的匹配对象。例如:
[root@server ~]# salt -I 'conf:/etc/test.conf' cmd.run "hostname"client: client[root@server ~]#
通过saltstack工具,我们可以在指定的或所有的minion端上,安装某个服务或工具,本节演示如何使用saltstack在minion端安装httpd服务。
1.在master上编辑配置文件:
[root@server ~]# vim /etc/salt/master # 搜索file_roots,去掉以下几行的注释,注意保留空格file_roots: base: - /srv/salt
2.重启服务:
systemctl restart salt-master.service
3.创建目录以及配置文件:
[root@server ~]# mkdir /srv/salt[root@server ~]# vim /srv/salt/top.sls # 主配置文件base: '*': # *表示所有,前面有两个空格 - httpd # 前面有4个空格,表示在所有的客户端上执行httpd模块
4.增加一个子配置文件:
[root@server ~]# vim /srv/salt/httpd.sls # 增加以下内容httpd-service: # 服务的名称 pkg.installed: # saltstack内置模块,用于执行安装命令 - names: # names的值是需要安装的包的名称 - httpd # 安装httpd 包 - httpd-devel # 安装httpd-devel 包 service.running: # saltstack内置模块,用于启动服务 - name: httpd # 启动httpd服务 - enable: True # True表示开机启动
说明: httpd-service是id的名字,自定义的。pkg.installed 为包的安装函数或者说模块,下面是要安装的包的名字。service.running也是一个函数,来保证指定的服务启动,enable表示开机启动。
5.在minion端上进行安装:
[root@server ~]# salt 'client' state.highstate # 执行过程会比较慢,因为minion端上在执行yum安装命令
在minion端上可以看到,的确是在执行yum命令:
[root@client ~]# ps aux |grep yumroot 4582 38.5 2.2 459440 87500 ? D 18:28 0:01 /usr/bin/python /usr/bin/yum -y install httpd-develroot 4599 0.0 0.0 112660 964 pts/0 S+ 18:28 0:00 grep --color=auto yum[root@client ~]#
等master上的命令执行完成之后,到minion端上可以看到已经安装成功:
[root@client ~]# ps aux |grep httpdroot 4704 0.1 0.3 384816 15432 ? Ss 18:28 0:00 /usr/sbin/httpd -DFOREGROUNDapache 4714 0.0 0.2 387036 8084 ? S 18:28 0:00 /usr/sbin/httpd -DFOREGROUNDapache 4715 0.0 0.2 387036 8084 ? S 18:28 0:00 /usr/sbin/httpd -DFOREGROUNDapache 4716 0.0 0.2 387036 8084 ? S 18:28 0:00 /usr/sbin/httpd -DFOREGROUNDapache 4717 0.0 0.2 387036 8084 ? S 18:28 0:00 /usr/sbin/httpd -DFOREGROUNDapache 4718 0.0 0.2 387036 8084 ? S 18:28 0:00 /usr/sbin/httpd -DFOREGROUNDroot 4752 0.0 0.0 112660 964 pts/0 S+ 18:30 0:00 grep --color=auto httpd[root@client ~]# netstat -lntp |grep httpdtcp6 0 0 :::80 :::* LISTEN 4704/httpd [root@client ~]#
saltstack有一个分发文件的功能,可以使用这个功能来批量分发一些文件到minion端上。我们需要在master端准备一个模板文件,并且进行相应的配置后,才能够进行分发。分发功能的好处在于,我们不需要自己一个个的将文件发送到master端上,只需要在master端执行一条命令就完成将文件发送到master端上的任务,减少了很多重复且无谓的工作。
1.在master上编辑配置文件:
[root@server ~]# vim /srv/salt/test.slsfile_test: file.managed: - name: /tmp/example.com - source: salt://test/example/example.txt - user: root - group: root - mode: 600
说明:
2.创建目录以及模板文件:
[root@server ~]# mkdir -p /srv/salt/test/example[root@server ~]# vim /srv/salt/test/example/example.txt # 编辑模板文件,内容如下This is a template file
3.编辑主配置文件:
[root@server ~]# vim /srv/salt/top.sls # 修改为如下内容base: '*': - test
4.执行以下命令,将模板文件分发到minion端上:
[root@server ~]# salt 'client' state.highstateclient:---------- ID: file_test Function: file.managed Name: /tmp/example.com Result: True Comment: File /tmp/example.com updated Started: 18:48:48.652179 Duration: 61.133 ms Changes: ---------- diff: New fileSummary for client------------Succeeded: 1 (changed=1)Failed: 0------------Total states run: 1Total run time: 61.133 ms[root@server ~]#
到minion端上,查看分发过去的文件:
[root@client ~]# ls -l /tmp/example.com -rw------- 1 root root 511 1月 24 18:48 /tmp/example.com[root@client ~]# cat /tmp/example.com This is a template file[root@client ~]#
如上,代表分发成功,当我们需要改动或者分发某个文件到一组机器时,使用这种分发模板文件的方式将省去很多重复的操作。
除了分发文件外,很多情况下我们还需要分发目录,所以 saltstack 也支持配置目录的分发。
1.在master上编辑子配置文件:
[root@server ~]# vim /srv/salt/test_dir.sls # 加入以下内容file_dir: file.recurse: - name: /tmp/testdir - source: salt://test/example - user: root - file_mode: 640 # 文件权限 - dir_mode: 750 # 目录权限 - mkdir: True # 如果没有目录就创建 - clean: True # 加上它之后,源删除文件或目录,目标也会跟着删除,否则不会删除
2.修改主配置文件:
[root@server ~]# vim /srv/salt/top.sls base: '*': - test_dir
3.执行以下命令测试能否正常分发目录:
[root@server ~]# salt 'client' state.highstate
4.到minion端上查看目录是否已分发成功:
[root@client ~]# ls /tmp/testdir/example.txt[root@client ~]# cat /tmp/testdir/example.txt This is a template file[root@client ~]# ll !$ll /tmp/testdir/example.txt-rw-r----- 1 root root 24 1月 25 14:35 /tmp/testdir/example.txt[root@client ~]#
saltstack 有一个特性,如果你要分发的目录下的子目录为空的话,是不会进行分发的:
[root@server ~]# mkdir /srv/salt/test/example/123 # 创建一个空目录[root@server ~]# salt 'client' state.highstate
client上依旧只有一个文件:
[root@client ~]# ls /tmp/testdir/example.txt[root@client ~]#
所以空目录是不会被同步的,这一点需要注意一下。
虽然我们可以使用cmd.run去远程执行命令,但是这样的效率太低,每次只能执行一条命令。所以我们需要批量远程执行命令来提高效率,实现批量远程执行命令我们需要使用到脚本,将这个脚本分发到各个minion端上执行,要执行这个脚本我们还得进行一些相应的配置。
1.在master上编辑一个子配置文件:
[root@server ~]# vim /srv/salt/shell_test.sls # 增加以下内容shell_test: cmd.script: - source: salt://test/example.sh # 脚本文件的路径 - user: root
2.创建模板脚本文件:
[root@server ~]# vim /srv/salt/test/example.sh#!/bin/bashtouch /tmp/test.txt if [ ! -d /tmp/test ]then mkdir /tmp/testfi
3.更改top.sls内容:
[root@server ~]# vim /srv/salt/top.sls base: '*': - shell_test
3.执行以下命令测试一下能否在client上执行该脚本:
[root@server ~]# salt 'client' state.highstate
4.到client上检查是否有test.txt文件和test目录,有则代表测试成功:
[root@client ~]# ls -l /tmp/test.txt -rw-r--r-- 1 root root 0 1月 25 15:15 /tmp/test.txt[root@client ~]# ll /tmp/test总用量 0[root@client ~]#
既然能够远程执行命令了,当然还得配置一下任务计划,毕竟很多场景下,都需要定时地重复去执行脚本或命令。
1.在master上编辑一个子配置文件:
[root@server ~]# vim /srv/salt/cron_test.slscron_test: cron.present: - name: /bin/touch /tmp/test_cron.txt # 需要执行的命令,也可以执行一个脚本 - user: root - minute: '*' # 分 - hour: 20 # 时 - daymonth: '*' # 日 - month: '*' # 月 - dayweek: '*' # 周
用法和crontab是一样的。
**注意:*** 需要用单引号引起来。当然我们还可以使用file.managed模块来管理cron,因为系统的cron都是以配置文件的形式存在的。想要删除该cron,需要增加:
cron.absent: - name: /bin/touch /tmp/test_cron.txt
两者不能共存,要想删除一个cron,那之前的present就得去掉,末尾会演示一下如何删除cron。
2.更改top.sls文件的内容:
[root@server ~]# vim /srv/salt/top.sls base: '*': - cron_test
3.执行以下命令测试一下能否在client上增加相应的任务计划:
[root@server ~]# salt 'client' state.highstate
4.到client上检查一下有没有增加相应的任务计划,如下,则是测试成功:
[root@client ~]# crontab -l# Lines below here are managed by Salt, do not edit# SALT_CRON_IDENTIFIER:/bin/touch /tmp/test_cron.txt* 20 * * * /bin/touch /tmp/test_cron.txt[root@client ~]#
注:生成的那两行注释不能删除或改动,如果删除或改动了就无法被master端管理了,注释上也写明了do not edit。
删除cron,修改/srv/salt/cron_test.sls文件内容如下:
[root@server ~]# vim /srv/salt/cron_test.slscron_test: cron.absent: - name: /bin/touch /tmp/test_cron.txt
执行以下命令:
[root@server ~]# salt 'client' state.highstate
到client上检查一下是否已删除:
[root@client ~]# crontab -l# Lines below here are managed by Salt, do not edit[root@client ~]#
可以看到,client上的cron已经删除。
1.cp.get_file,拷贝master上的文件到客户端:
[root@server ~]# echo "This is test copy file" > /srv/salt/test/cp.txt[root@server ~]# salt 'client' cp.get_file salt://test/cp.txt /tmp/cp.txtclient: /tmp/cp.txt[root@server ~]#
到client上检查一下是否拷贝成功:
[root@client ~]# ls /tmp/cp.txt /tmp/cp.txt[root@client ~]# cat !$cat /tmp/cp.txtThis is test copy file[root@client ~]#
2.cp.get_dir 拷贝目录:
[root@server ~]# salt 'client' cp.get_dir salt://test/ /tmp/ # 会自动在客户端创建test目录,所以后面不要加test,如果写成 /tmp/test/ 则会在/tmp/test/目录下又创建testclient: - /tmp//test/cp.txt - /tmp//test/example.sh - /tmp//test/example/example.txt[root@server ~]#
到client上检查一下是否拷贝成功:
[root@client ~]# ls /tmp/testcp.txt example example.sh[root@client ~]#
3.显示存活的minion:
[root@server ~]# salt-run manage.up- client- server[root@server ~]#
4.命令行下执行master上的shell脚本:
[root@server ~]# salt 'client' cmd.script salt://test/example.shclient: ---------- pid: 10600 retcode: 0 stderr: stdout:[root@server ~]#
salt-ssh不需要对客户端做认证,客户端也不用安装salt-minion或者启动什么服务,它类似ssh/expect。
1.安装salt-ssh:
[root@server ~]# yum install -y https://repo.saltstack.com/yum/redhat/salt-repo-latest-2.el7.noarch.rpm[root@server ~]# yum install -y salt-ssh
2.编辑配置文件:
[root@server ~]# vim /etc/salt/roster # 文件末尾加上以下内容client: # 主机名 host: 192.168.77.128 # 需要登录的ip user: root # 需要登录的用户 passwd: 123456. # 该用户的密码
3.执行以下命令测试一下能否远程执行命令:
[root@server ~]# salt-ssh --key-deploy '*' -r 'w'client: ---------- retcode: 0 stderr: stdout: root@192.168.77.128's password: 16:05:59 up 4:31, 1 user, load average: 0.00, 0.01, 0.05 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 192.168.77.1 11:35 9:35 0.30s 0.30s -bash[root@server ~]#
注:第一次执行的时候会自动把本机的公钥放到对方机器上,在这之后就可以把roster文件里面的密码给去掉了。
本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/2064753,如需转载请自行联系原作者