salt-ssh批量操作记录
根据以往运维工作中操作经验来说,当管理上百台上千台服务器时,选择一款批量操作工具是及其有必要的。 早期习惯于在ssh信任关系的前提下做fo;do;done循环语句的批量操作,后来逐渐趋于使用批量工具操作: 1)pssh工具,它需要提前做好key关联的ssh信任关系,比起for循环语句,我之前还是比较喜欢用pssh。 具体用法见于:http://www.cnblogs.com/kevingrace/p/6378719.html 2)expect 最大的有点就是交互,但是要成高性能的话,需要自己写多线程的。 参考:http://www.cnblogs.com/kevingrace/p/5900303.html 3)python利器,用过一段时间,该有的都有的,很是强大。
from fabric import env
env.hosts = ['user1@host1:port1', 'user2@host2.port2']
env.passwords = {'user1@host1:port1': 'password1', 'user2@host2.port2': 'password2'}
4)最后,还是比较看好salt-ssh。 salt-ssh可以独立运行的,不需要minion端。salt-ssh可以代替expect之类的密码推送脚本,看起来功能不比expect差 。 salt-ssh 用的是sshpass进行密码交互的。
下面就对salt-ssh的使用做一简单梳理: 1)安装 根据Saltstack自动化操作记录(1)-环境部署安装saltstack后,就有了salt-ssh命令 或者根据下面的操作进行单独安装 [root@bastion-IDC ~]# git clone https://github.com/saltstack/salt.git [root@bastion-IDC ~]# cd salt [root@bastion-IDC ~]# ./setup.py install
2)配置使用 可以把要执行的信息,比如ip,帐号,密码,端口等都放到一个文件里面。当然文件路径是可以随便定义的,官方是指定到了/etc/salt/roster。如下: [root@linux-node1 ~]# cat /etc/salt/roster
web1:
host: 192.168.1.118 //前面留四个空格,冒号后空一格
user: root //前面留四个空格,冒号后空一格
password: PASSWORD //前面留四个空格,冒号后空一格
port: 22 //前面留四个空格,冒号后空一格
web2:
host: 192.168.1.105
user: root
password: PASSWORD
port: 22
web3:
host: 192.168.1.19
user: root
password: K46u@!kB9G
port: 25791
然后执行批量操作命令: [第一次执行的时候,有的机器可能会提醒输入密码验证,这个只需按照提示输入对应密码即可!] [root@linux-node1 ~]# /usr/local/bin/salt-ssh "*" -r 'free -m'
web3:
----------
retcode:
254
stderr:
stdout:
The host key needs to be accepted, to auto accept run salt-ssh with the -i flag:
The authenticity of host '192.168.1.109 (192.168.1.109)' can't be established.
RSA key fingerprint is 7d:83:12:5d:85:c4:36:c9:21:41:c2:90:89:5b:0a:f5.
Are you sure you want to continue connecting (yes/no)?
web2:
----------
retcode:
0
stderr:
stdout:
total used free shared buff/cache available
Mem: 3951 52 2524 20 1374 3610
Swap: 534 0 534
web1:
----------
retcode:
0
stderr:
stdout:
total used free shared buffers cached
Mem: 3832 3617 215 0 174 1930
-/+ buffers/cache: 1511 2320
Swap: 1535 36 1499
特别注意: salt-ssh第一次执行是根据roster文件里配置的账号密码推送密码,来实现自动交互的。 执行完了后会在目标服务器里面,追加master端(即源机器)的key。 然后就可以删除roster里面的passwd密码条目了,删除roster文件里的密码条目后,不影响后批量操作的执行。 如下: 把roster文件里的password条目删除后,还是可以运行,这里就不是用sshpass推送密码了,而是直接通过key了 !!! [root@linux-node1 ~]# cat /etc/salt/roster
web1:
host: 192.168.1.118
user: root
port: 22
web2:
host: 192.168.1.105
user: root
port: 22
web3:
host: 192.168.1.19
user: root
port: 25791
[root@linux-node1 ~]# salt-ssh "*" -r 'df -h'
web3:
----------
retcode:
0
stderr:
stdout:
Filesystem Size Used Avail Use% Mounted on
udev 2.0G 0 2.0G 0% /dev
tmpfs 396M 21M 375M 6% /run
/dev/vda1 3.9G 2.3G 1.5G 61% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/vda6 11G 26M 9.6G 1% /home
cgmfs 100K 0 100K 0% /run/cgmanager/fs
tmpfs 396M 0 396M 0% /run/user/0
web1:
----------
retcode:
0
stderr:
stdout:
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/VolGroup00-LogVol00
8.1G 4.8G 2.9G 63% /
tmpfs 1.9G 0 1.9G 0% /dev/shm
/dev/vda1 190M 37M 143M 21% /boot
web2:
----------
retcode:
0
stderr:
stdout:
Filesystem Size Used Avail Use% Mounted on
udev 2.0G 0 2.0G 0% /dev
tmpfs 396M 21M 375M 6% /run
/dev/vda1 3.9G 2.1G 1.7G 56% /
tmpfs 2.0G 0 2.0G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 2.0G 0 2.0G 0% /sys/fs/cgroup
/dev/vda6 11G 26M 9.6G 1% /home
cgmfs 100K 0 100K 0% /run/cgmanager/fs
tmpfs 396M 0 396M 0% /run/user/0
如下:--roster-file参数后面跟的是配置文件,如果是官方指定的配置文件/etc/salt/roster,则可以省略。 如果是自己自定义的文件,则需要用这个参数指定 [root@linux-node1 ~]# salt-ssh "*" --roster-file /etc/salt/roster -r 'uptime'
web2:
----------
retcode:
0
stderr:
stdout:
04:41:49 up 79 days, 15:22, 1 user, load average: 0.00, 0.00, 0.00
web1:
----------
retcode:
0
stderr:
stdout:
04:41:57 up 75 days, 17:05, 3 users, load average: 0.02, 0.16, 0.20
web3:
----------
retcode:
0
stderr:
stdout:
04:41:42 up 79 days, 6:42, 1 user, load average: 0.00, 0.00, 0.00
- 洛谷P3178 [HAOI2015]树上操作
- Numpy 修炼之道 (6)—— 复制和视图
- 事务日志已满,原因为“ACTIVE_TRANSACTION”
- 【 关关的刷题日记46】Leetcode 28. Implement strStr()
- Python的机器学习库之Sklearn快速入门1.基本概述2.入门实践3.部分结果
- 再论 ASP.NET 中获取客户端IP地址
- 洛谷P3038 [USACO11DEC]牧草种植Grass Planting
- 【 关关的刷题日记47】Leetcode 38. Count and Say
- 《Python自然语言处理》答案第一、二章
- 【 关关的刷题日记49】 Leetcode 434. Number of Segments in a String
- 自然语言处理构建文本向量空间1.百科2.源代码3.参考:
- 小爬虫之爬取豆瓣电影排行榜1.技术路线2.任务3.分析4.运行结果5.源码
- Numpy 修炼之道 (5)—— 索引和切片
- 深入理解final关键字
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- pytorch SENet实现案例
- python如何安装下载后的模块
- Python爬虫如何应对Cloudflare邮箱加密
- 如何使用Python处理HDF格式数据及可视化问题
- tp5框架使用composer实现日志记录功能示例
- python 图像插值 最近邻、双线性、双三次实例
- tp5(thinkPHP5)框架实现多数据库查询的方法
- Python-openCV开运算实例
- php curl获取https页面内容,不直接输出返回结果的设置方法
- 详解php中curl返回false的解决办法
- Pytorch mask-rcnn 实现细节分享
- pytorch中的weight-initilzation用法
- python安装读取grib库总结(推荐)
- PHP5.5新特性之yield理解与用法实例分析
- php如何利用pecl安装mongodb扩展详解