场景:以我目前公司使用的jazmin server为例。通过编写sls文件停止jazmin server应用。
创建/srv/salt/top.sls
base:
'*'
- jazmin_stop
然后创建jazmin_stop.sls文件
jazmin_stop:
cmd.script:
- source: salt://test/jazmin_stop.sh
- user: appadmin
cmd.script表示要执行脚本;
source 表示要执行的脚本路径;
user 表示执行的用户;
创建 test目录,以及test/jazmin_stop.sh文件
mkdir test
touch test/jazmin_stop.sh
#!/bin/bash
source /home/appadmin/.bashrc
# curl -s 隐藏输出
# awk -F 截取
public_ip=$$(curl -s http://getip:4584 | awk -F ':' {'print $$2'} | awk -F '"' {'print $$2'})
echo "公网IP: $$public_ip"
# shell 替换字符串
instance_id=$${public_ip//\./a}
echo "应用instance_id: $$instance_id"
jazmin_pid=$$(ps -ef |grep jazmin | grep $$instance_id |grep -v 'grep' |awk {'print $$2'})
if [ ! $$jazmin_pid ]; then
echo "jazmin 应用未启动"
exit 1
fi
echo "当前jazmin应用pid: $$jazmin_pid"
kill -9 $$jazmin_pid
echo "应用已停止"
http://getip:4584 是一个用来获取公网ip的应用,这里为了脱敏隐去具体的网址和ip,返回以下结果:
{"ip":"119.*.*.*"}
执行和调用
将某台服务器的应用停止,ip地址已脱敏
sudo salt '10.*.*.*' state.sls jazmin_stop
输出结果
关于state.sls与state.highstate
state.sls默认的运行环境是base环境,但是并不读取top.sls(top.sls定义了运行环境以及需要运行的sls)。
官方文档上这样描述:
salt.modules.state.sls(mods, saltenv='base', test=None, execlude=None, queue=False, env=None, **kwargs)
默认的saltenv就是base
state.highstate是全局的所有环境,以及所有状态都生效。它会读取每一个环境的top.sls,并且对所有的sls都生效。