写在前面的话
远程执行可以说是我们使用 Saltstack 最为基础的目的。所以在这里专门作为单独的一篇来详细的聊聊。
远程执行命令
示例命令:
salt '*' cmd.run 'w'
命令分析:
salt 是命令本身,* 是执行目标,cmd.run 是 Saltstack 自带的模块,目前几百个。
其中一个重要的组成就是执行目标,这是我们执行命令的目的。关于目标,一般有两种选择方式:
1. 基于 Minion ID 的选择方式。
2. 基于 Minion 属性的选择方式。
和 Minion ID 相关的选择方式:
1. 直接使用 Minion ID:
salt 'saltstack-node-01' cmd.run 'w'
2. 使用通配符选择 Minion ID:
# * 选择所有 salt '*' cmd.run 'w' # 选择某个开头的 salt 'saltstack*' cmd.run 'w' # 选择1或者2 salt 'saltstack-node-0[1|2]' cmd.run 'w' # ? 代表一个字符 salt 'saltstack-node-0?' cmd.run 'w' # 选择范围 salt 'saltstack-node-0[1-2]' cmd.run 'w' # 选择非 salt 'saltstack-node-0[!2]' cmd.run 'w'
3. 使用列表选择 Minion ID:-L 参数
salt -L 'saltstack-node-01,saltstack-node-02' cmd.run 'w'
4. 正则表达式:-E 参数
salt -E 'saltstack-node-(01|02)' cmd.run 'w'
匹配方式还有很多,这些都是常用的,而且,这里用到的所有方式,在 top.sls 中同样可以使用。
另外,主机名设置建议,例如:erp-service-01-aliyun-oa.example.com
说明:erp-service 是服务,01 是节点,aliyun 是机房,oa 是业务线
5. 使用 IP 或者子网方式:-S 参数
# IP 地址 salt -S '192.168.100.112' cmd.run 'w' # 子网 salt -S '192.168.100.0/24' cmd.run 'w'
6. 对 Minion 进行分组:
在 /etc/salt/master 当前版本的 1192 行,有 nodegroup 配置,可以修改为如下:
nodegroups: app: 'L@saltstack-node-01,saltstack-node-02'
L@ 其实就相当于 -L 参数,同意还可以 G@ 这些样式,选择 group 使用 -N 参数:
salt -N app test.ping
7. 还要混合匹配:-C
salt -C 'saltstack-node-01 and G@os:centos or E@saltstack-node-0(2|3)' test.ping
具体可以看官方文档,不推荐这种,太麻烦了。
同时,我们得提一下一个重要得参数,-b:
这个参数指定一次执行多少台,可以是数字,也可以是百分比。这样不至于一执行机器全挂。
salt '*' -b 1 test.ping
效果如下:
想了解更多可以查看文档:
https://www.unixhot.com/docs/saltstack/topics/targeting/index.html
远程执行模块
详细文档地址:
https://www.unixhot.com/docs/saltstack/ref/modules/all/index.html
这些模块都是 python 文件,被保存在服务器的:/usr/lib/python2.7/site-packages/salt/modules 目录下。
我们只需要关注一下常用的,如:network / service / state / cp 等等。
另外可以简单做了解的就是执行返回,我们可以将执行的记录和结果都保存到 MySQL 或者 Redis 等服务中,这里就不过多解释,具体可以查看文档:
https://www.unixhot.com/docs/saltstack/ref/returners/index.html
自己编写模块
自己编写简单的脚本模块方法:
1. 在 Master 新建脚本目录和文件:
# 新建目录 cd /srv/salt/ && mkdir _modules && cd _modules # 新建文件 vim get_disk.py
内容如下:
def list(): cmd = 'df -h' ret = __salt__['cmd.run'](cmd) return ret
其实就是直接调用 salt 本身的 cmd.run 方法执行命令,返回结果,当然更复制的需求也可以使用其他模块。
2. 将模块同步到 Minion:
salt '*' saltutil.sync_modules
结果如下:
可以查看 Minion 上的情况 /var/cache/salt/ 目录,结果如下:
3. 直接执行我们写的模块:
salt '*' get_disk.list
结果如下:
小结
远程执行其实最主要的就是能够正确的选择到我们真的想执行的机器,这里面有包括我们自己在定义 Minion ID 时候的设计。一个良好的设计规范才能让我们更轻松的完成工作的需求。
另外 salt 的执行模块特别多,我们只需要记住几个常用的,如果不知道可查文档。
自己写模块是我们最后的解决思路,在我们实在没法找到合适的模块的时候,我们可以自己手写满足我们需求的模块。这里面会使用到 Python 脚本。当然,会 Python 最佳,如果不会也没有关系,因为我们写的内容一般还是相对于比较简单的功能。
最后,我们需要发现一个规律。这种自己定义 Grains,自己定义 modules,我们都是在 Master 端,然后通过 saltutil 里面的各种 sync 的方法推送到指定的 Minion 端。了解了这一点,能够更好的帮助我们了解 saltstack 的执行思路。