说明信息:
ansible软件相关参考链接信息
http://docs.ansible.com/ansible/intro_installation.html
http://www.ansible.com.cn/
http://docs.ansible.com/modules_by_category.html
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
python语言是运维人员必会的语言!
ansible是一个基于Python开发的自动化运维工具
ansible的功能实现基于SSH远程连接服务
ansible可以实现批量系统配置,批量软件部署,批量文件拷贝,批量运行命令等功能
特点:
1)不需要单独安装客户端,基于系统自带的sshd服务,sshd就相当于ansible的客户端
2)不需要服务端
3)需要依靠大量的模块实现批量管理
4)配置文件/etc/ansible/ansible.cfg
服务器说明 |
外网 IP |
内网 IP |
主机名 |
nginx web |
10.0.0.7/24 |
172.16.1.7/24 |
web01 |
NFS 存储服务器 |
10.0.0.31/24 |
172.16.1.31/24 |
nfs01 |
rsync 备份服务器 |
10.0.0.41/24 |
172.16.1.41/24 |
backup |
管理服务器 |
10.0.0.61/24 |
172.16.1.61/24 |
m01 |
实现从管理机m01到其他机器的秘钥认证关系:
需要epel.repo源
[root@m01 ~]# wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
[root@m01 ~]# yum -y install ansible
[root@nfs01 ~]# yum -y install libselinux-python
ansible的配置文件:
[root@m01 ~]# tree /etc/ansible
/etc/ansible
├── ansible.cfg ##ansible配置文件
├── hosts ##被ansible管理的主机名单(分组)
└── roles
1 directory, 2 files
编辑ansible的主机配置文件hosts,添加主机组dong
[root@m01 ~]# cp /etc/ansible/hosts{,.bak} ##改前备份
[root@m01 ~]# tail -4 /etc/ansible/hosts
[dong]
172.16.1.31
172.16.1.41
172.168.1.7
如果设置了ssh秘钥连接的话,hosts文件到这里就算配置完毕了。但是我们还没有设置,因此还需要对ansible的主机映射文件/etc/ansible/hosts继续加工:
[root@m01 ~]# tail -4 /etc/ansible/hosts
[dong]
172.16.1.31 ansible_ssh_user=root ansible_ssh_pass=123456
172.16.1.41 ansible_ssh_user=root ansible_ssh_pass=123456
172.16.1.7 ansible_ssh_user=root ansible_ssh_pass=123456
命令说明:
ansible_ssh_user= ##ssh连接的用户名
ansible_ssh_pass= ##ssh 连接的密码
如果没有做秘钥认证,hosts又没有如上配置的话,ansible进行远程连接是会失败的。
语法:
[root@m01 ~]# ansible dong -m command -a 'uptime'
172.16.1.41 | SUCCESS | rc=0 >>
22:11:10 up 13:18, 2 users, load average: 0.00, 0.01, 0.05
172.16.1.7 | SUCCESS | rc=0 >>
22:11:10 up 13:19, 2 users, load average: 0.00, 0.01, 0.05
172.16.1.31 | SUCCESS | rc=0 >>
22:11:10 up 13:19, 2 users, load average: 0.00, 0.01, 0.05
ansible 主机组 -m ansible内置功能模块名 -a 命令
ansible命令测试
例1:获取172.16.1.7的主机的w信息
[root@m01 ~]# ansible 172.16.1.7 -m command -a 'w'
172.16.1.7 | SUCCESS | rc=0 >>
22:17:08 up 13:25, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.253 08:54 2:43m 0.02s 0.02s -bash
root pts/1 172.16.1.61 22:17 0.00s 0.08s 0.00s /bin/sh -c /usr
例2:获取整个dong主机组的对应的“w”信息
[root@m01 ~]# ansible dong -m command -a 'w'
172.16.1.7 | SUCCESS | rc=0 >>
22:18:53 up 13:27, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.253 08:54 2:45m 0.02s 0.02s -bash
root pts/1 172.16.1.61 22:18 0.00s 0.12s 0.00s /bin/sh -c /usr
172.16.1.41 | SUCCESS | rc=0 >>
22:18:53 up 13:26, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.253 08:54 1:55m 0.13s 0.09s -bash
root pts/1 172.16.1.61 22:18 0.00s 0.15s 0.00s /bin/sh -c /usr
172.16.1.31 | SUCCESS | rc=0 >>
22:18:53 up 13:26, 2 users, load average: 0.00, 0.01, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.253 08:54 50:32 0.07s 0.07s -bash
root pts/1 172.16.1.61 22:18 0.00s 0.15s 0.00s /bin/sh -c /usr
[root@m01 ~]#
例3:调用ansible内置的copy模块
[root@m01 ~]# ansible 172.16.1.7 -m copy -a "src=/etc/hosts dest=/tmp"
172.16.1.7 | SUCCESS => {
"changed": true,
"checksum": "ff4b5d4ed5cbafb5a040fc373380b1ec41c587ea",
"dest": "/tmp/hosts",
"gid": 0,
"group": "root", ##复制过得的属组
"md5sum": "ea559d6091b0912670656b94cad67340",
"mode": "0644", ##复制过去的权限
"owner": "root", ##复制过去的属主
"size": 325,
"src": "/root/.ansible/tmp/ansible-tmp-1494858256.42-180402520361666/source",
"state": "file",
"uid": 0
}
[root@m01 ~]# ansible 172.16.1.7 -m command -a "ls /tmp"
172.16.1.7 | SUCCESS | rc=0 >>
ansible_KSKdZG
figer_check.txt
hosts #拷贝成功
[root@m01 ~]# ssh root@172.16.1.7 "ls /tmp" ##用ssh再查看
root@172.16.1.7's password:
figer_check.txt
hosts
命令说明:
-m:调用ansible内置模块 copy 拷贝模块
-a:接命令。由于调用了copy模块,命令格式发生改变。src=本地文件路径 dest=目的地所在路径
例4:调用copy模块实现保存文件的属性改变
[root@m01 ~]# ansible 172.16.1.7 -m copy -a "src=/etc/hosts dest=/tmp owner=dong group=dong mode=600"
172.16.1.7 | SUCCESS => {
"changed": true,
"checksum": "ff4b5d4ed5cbafb5a040fc373380b1ec41c587ea",
"dest": "/tmp/hosts",
"gid": 500,
"group": "dong",
"mode": "0600",
"owner": "dong",
"path": "/tmp/hosts",
"size": 325,
"state": "file",
"uid": 500
}
看这里:
[root@m01 ~]# ssh root@172.16.1.7 "ls -l /tmp/hosts"
root@172.16.1.7's password:
-rw------- 1 dong dong 325 May 15 22:24 /tmp/hosts
备注:
copy模块,如果复制的对方主机路径下没有目录,那么会递归创建
特别提示:
ansible的部分模块并不支持
1) 管道符“|”
2) 重定向“>、<、>>、<<”
3) 类似top,tail -f这种不能即刻返回明确信息的命令
[root@m01 ~]# echo "echo '测试成功'" >> /server/scripts/test.sh
[root@m01 ~]# ansible dong -m copy -a "src=/server/scripts/test.sh dest=/server/scripts/ mode=0755 backup=yes"
172.16.1.31 | SUCCESS => {
"changed": true,
"checksum": "8bdb3d9c3c13bf63fc0e228f9ab327ad83132a22",
"dest": "/server/scripts/test.sh",
"gid": 0,
"group": "root",
"md5sum": "f104259eae2b3edf55af0fa8bd80bb02",
"mode": "0755",
"owner": "root",
"size": 20,
"src": "/root/.ansible/tmp/ansible-tmp-1494860141.48-129922012369000/source",
"state": "file",
"uid": 0
}
172.16.1.7 | SUCCESS => {
"changed": true,
"checksum": "8bdb3d9c3c13bf63fc0e228f9ab327ad83132a22",
"dest": "/server/scripts/test.sh",
"gid": 0,
"group": "root",
"md5sum": "f104259eae2b3edf55af0fa8bd80bb02",
"mode": "0755",
"owner": "root",
"size": 20,
"src": "/root/.ansible/tmp/ansible-tmp-1494860141.58-207376611936153/source",
"state": "file",
"uid": 0
}
172.16.1.41 | SUCCESS => {
"changed": true,
"checksum": "8bdb3d9c3c13bf63fc0e228f9ab327ad83132a22",
"dest": "/server/scripts/test.sh",
"gid": 0,
"group": "root",
"md5sum": "f104259eae2b3edf55af0fa8bd80bb02",
"mode": "0755",
"owner": "root",
"size": 20,
"src": "/root/.ansible/tmp/ansible-tmp-1494860141.51-186244559952898/source",
"state": "file",
"uid": 0
}
[root@m01 ~]#
注意:dest路径的写法,若是不存在的目录,结尾要加斜线(/server/scripts/),否则默认不会创建目标目录
[root@m01 ~]# ansible dong -m command -a "sh /server/scripts/test.sh"
172.16.1.7 | SUCCESS | rc=0 >>
测试成功
172.16.1.31 | SUCCESS | rc=0 >>
测试成功
172.16.1.41 | SUCCESS | rc=0 >>
测试成功
[root@m01 ~]# ansible dong -m shell -a "/server/scripts/test.sh"
172.16.1.41 | SUCCESS | rc=0 >>
测试成功
172.16.1.31 | SUCCESS | rc=0 >>
测试成功
172.16.1.7 | SUCCESS | rc=0 >>
测试成功
模块名 |
作用 |
command |
执行命令模块(重要) |
copy |
文件拷贝模块(重要) |
shell |
执行 shell 脚本模块(重要) |
script |
执行 shell 脚本模块(重要) |
file |
设定文件属性模块 |
service |
系统服务管理模块 |
cron |
计划任务管理模块 |
yum |
yum 软件包安装管理模块 |
synchronize |
使用 rsync 同步文件模块 |
ansible-doc -l 查看所有的模块
ansible-doc -s service 查看指定模块用法
①. 最简单/最常用/最强大的选择是ssh key+shell/pssh方案,一般中小型企业会用(50-100台以下规模企业)
a. 利用ssh key执行命令,并将命令放在脚本里面
ssh 172.16.1.31 $1
ssh 172.16.1.41 $1
ssh 172.16.1.7 $1
b. 利用ssh key执行命令,将命令放在脚本里面,并加上相应循环语句或判断语句
for ip in $*
do
done
②. sina cfengine/puppet 较早的批量管理工具;现在基本上没有企业用
③. 门户级别比较流行的,puppet批量管理工具(复杂/笨重)
④. saltstack 批量管理工具;特点:简单,功能强大(配置复杂)---赶集网/小米/一些CDN公司
批量管理路线:ssh key-->cfengine-->puppet-->saltstack/ansible
PS: 使用ansible软件的前提是ssh key公钥分发完成
①. 5台服务器先配置好(kickstart,cobbler无人值守安装)。高级实现云计算(按需分配,动态调整)(openstack,kvm)
②. linux基本优化,包括ssh服务(可以自动化实现)。
③. 创建密钥信息(自动化免交互创建)
ssh-keygen -t dsa -P '' -f ~/.ssh/id_dsa >/dev/null 2>&1
④. 进行批量分发密钥(sshpass,expect自动化实现)
⑤. ansible软件安装(可以自动化实现)
⑥. 网络服务自动化安装(ansible实现)
(搭建yum仓库,定制rpm包)
1) ansible软件特点:
· 可以实现批量管理
· 可以实现批量部署
· ad-hoc(批量执行命令)---针对临时性的操作
ansible dong -m command -a "hostname" <- 批量执行命令举例
· 编写剧本-脚本(playbook)---针对重复性的操作 (非常重要)
2) ansible核心功能:
· pyYAML-----用于ansible编写剧本所使用的语言格式
· paramiko---远程连接与数据传输
· Jinjia2----
说明:很多ansible的报错都是和python有关,因为ansible的底层开发是利用python编写的
①. ansible实现检查被管理服务器端网络连接是否通畅(检查道路是否通畅)
# ansible dong -m command -a "hostname" <-- 最开始检查道路是否通畅方法
# ansible dong -m ping <-- 专业检查道路是否通畅方法
172.16.1.31 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.16.1.7 | SUCCESS => {
"changed": false,
"ping": "pong"
}
172.16.1.41 | SUCCESS => {
"changed": false,
"ping": "pong"
}
以上信息不清楚,可以通过利用ansible查看帮助信息方法获取新模块功能说明
# ansible-doc -s ping
- name: Try to connect to host, verify a usable python and return `pong' on success.
action: ping
说明:尝试连接到主机,验证网络连接是否通畅,如果通畅返回pong信息表示成功
激活验证功能,利用ping模块
②. ansible实现定时任务功能执行相应的操作(定时任务)
回顾传统的定时任务为:
# crontab -l
#time sync by dong at 2010-2-1
*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
说明:日期格式为 分钟:minute,小时:hour,日期:day,月:month,周:weekday
日期格式后面接需要执行的命令或脚本文件
获取ansible定时任务模块说明信息:
# ansible-doc -s cron
- name: Manage cron.d and crontab entries.
cron模块主要管理cron.d和crontab条目信息;即实现配置定时任务
action: cron 激活定时任务功能,利用cron模块
backup # If set, create a backup of the crontab before it is modified. The location of the backup is returned in the `backup_file' variable by this module.
cron_file # If specified, uses this file instead of an individual user's crontab. If this is a relative path, it is interpreted with respect to /etc/cron.d. (If it is absolute, it will
typically be /etc/crontab). To use the `cron_file' parameter you must specify the `user' as well.
day # Day of the month the job should run ( 1-31, *, */2, etc )
运行job任务的日期时间信息(编写方式1-31,*, */2, 等)
disabled # If the job should be disabled (commented out) in the crontab. Only has effect if state=present
如果job应该关闭(被注释掉)。只能影响状态是开启状态的定时任务条目
env # If set, manages a crontab's environment variable. New variables are added on top of crontab. "name" and "value" parameters are the name and the value of environment variable.
如果设置,管理crontab的环境变量信息。新的环境变量信息会被增加到定时任务表顶部。描述或数值会被环境变得的名称或数值所定义
hour # Hour when the job should run ( 0-23, *, */2, etc )
运行job任务的小时时间信息(编写方式0-23,*, */2, 等)
insertafter # Used with `state=present' and `env'. If specified, the environment variable will be inserted after the declaration of specified environment variable.
insertbefore # Used with `state=present' and `env'. If specified, the environment variable will be inserted before the declaration of specified environment variable.
job # The command to execute or, if env is set, the value of environment variable. Required if state=present.
执行相应的命令,如果env被设置,将作为环境变量的值,但前提是state=present
minute # Minute when the job should run ( 0-59, *, */2, etc )
运行job任务的分钟时间信息(编写方式0-59,*,*/2,等等)
month # Month of the year the job should run ( 1-12, *, */2, etc )
运行job任务的月份时间信息(编写方式1-12,*, */2, 等)
name # Description of a crontab entry or, if env is set, the name of environment variable. Required if state=absent. Note that if name is not set and state=present, then a new crontab
entry will always be created, regardless of existing ones.
定时任务条目的描述信息;如果env被设定了,描述信息将为环境变量信息。前提是定时任务状态为关闭状态
注意:如果名称没有被指定并且定时任务状态为开启,那么新的定时任务将总被创建,不管这个定时任务是否存在
reboot # If the job should be run at reboot. This option is deprecated. Users should use special_time.
special_time # Special time specification nickname.
指定时间规格绰号
state # Whether to ensure the job or environment variable is present or absent.
确认job或环境变量是开启或是关闭
user # The specific user whose crontab should be modified.
指定修改与编写定时任务的用户信息
weekday # Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )
job任务应该在一周的哪天进行运行(编写方式0-6表示周日到周六,以及用*符号等)
# ansible 172.16.1.7 -a "crontab -l" <- 查看当前被管理服务器定时任务文件信息
172.16.1.7 | SUCCESS | rc=0 >>
#crond-id-001:time sync by hq
*/5 * * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
参考下面编写的定时任务条目,进行编写ansible定时任务命令
# restart network
00 00 * * * /etc/init.d/network restart >/dev/null 2>&1
# ansible 172.16.1.7 -m cron -a "minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'"
172.16.1.7 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"None"
]
}
# ansible 172.16.1.7 -a "crontab -l"
172.16.1.7 | SUCCESS | rc=0 >>
#Ansible: None
00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
如果没有定义定时任务描述信息,每次执行ansible创建定时任务,都会被反复创建
# ansible 172.16.1.7 -m cron -a "name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'"
172.16.1.7 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"None",
"restart network"
]
}
# ansible 172.16.1.7 -a "crontab -l"
172.16.1.7 | SUCCESS | rc=0 >>
#Ansible: None
00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
#Ansible: restart network
00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
利用ansible的模拟检查参数-C,实现模拟检查ansible命令语法格式是否正确,但命令并不会执行产生效果
# ansible 172.16.1.7 -C -m cron -a "name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'"
172.16.1.7 | SUCCESS => {
"changed": false,
"envs": [],
"jobs": [
"None",
"restart network"
]
}
删除无用的定时任务信息
# ansible 172.16.1.7 -C -m cron -a "name='None' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' state=absent" <- 先进行测试,测试成功后再进行删除
# ansible 172.16.1.7 -m cron -a "name='None' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' state=absent"
172.16.1.7 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"restart network"
]
}
# ansible 172.16.1.7 -m cron -a "name='None' state=absent" <- 指定当前任务名称,即可进行删除操作
临时关闭与开启指定定时任务效果,但不删除定时任务条目
# ansible 172.16.1.7 -m cron -a "name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' disabled=yes"
172.16.1.7 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"restart network"
]
}
[root@m01 ~]# ansible 172.16.1.7 -a "crontab -l"
172.16.1.7 | SUCCESS | rc=0 >>
#Ansible: restart network
#00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
# ansible 172.16.1.7 -m cron -a "name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1' disabled=no"
172.16.1.7 | SUCCESS => {
"changed": true,
"envs": [],
"jobs": [
"restart network"
]
}
[root@m01 ~]# ansible 172.16.1.7 -a "crontab -l"
172.16.1.7 | SUCCESS | rc=0 >>
#Ansible: restart network
00 00 * * * /usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1
command (重要模块) 执行命令模块,ansible命令执行默认模块
shell (重要模块) 执行shell脚本模块
script (重要模块) 把脚本发到客户端,然后执行;执行脚本命令在远端服务器上
copy (重要模块) 把本地文件发送到远端
cron (重要模块) 编写定时任务的模块
ping 测试主机连通性的模块;如果同返回 pong
规则一:缩进
yaml使用一个固定的缩进风格表示数据层结构关系,Saltstack/ansible需要每个缩进级别由两个空格组成。一定不能使用tab键
规则二:冒号
yaml:
mykey: my_value
每个冒号后面一定要有一个空格(以冒号结尾不需要空格,表示文件路径的模版可以不需要空格)
规则三:短横线
想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分 - hosts
核心规则:有效的利用空格进行剧本的编写,剧本编写是不支持tab的
---
### 剧本的开头,可以不写
- hosts: all ##处理所有服务器,找到所有服务器; -(空格)hosts:(空格)all
tasks: ##剧本所要干的事情; (空格)(空格)task:
- command: echo hello dong linux.
## (空格)(空格)空格)(空格)-(空格)模块名称:(空格)模块中对应的功能
剧本编写内容扩展:剧本任务定义名称
- hosts: 172.16.1.7 ##处理指定服务器 -(空格)hosts:(空格)all
tasks: ##剧本所要干的事情; (空格)(空格)task:
- name:
command: echo hello dong linux. (空格)(空格)空格)(空格)-(空格)模块名称:(空格)模块中对应的功能
# ansible all -m cron -a "name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'"
- hosts: all
tasks:
- name: restart-network
cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
# ansible-playbook -C /etc/ansible/network-restart.yml -vvvx
说明:测试剧本命令后面可以跟多个-v进行调试检查
剧本编写内容扩展:剧本任务编写多个任务
- hosts: all
tasks:
- name: restart-network
cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
- name: sync time
cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"
剧本编写内容扩展:剧本任务编写多个主机
- hosts: 172.16.1.7
tasks:
- name: restart-network
cron: name='restart network' minute=00 hour=00 job='/usr/sbin/ntpdate time.nist.gov >/dev/null 2>&1'
- name: sync time
cron: name='sync time' minute=*/5 job="/usr/sbin/ntpdate pool.ntp.com >/dev/null 2>&1"
- hosts: 172.16.1.31
tasks:
- name: show ip addr to file
shell: echo $(hostname -i) >> /tmp/ip.txt
**************************************************************************************
扩展知识说明:vim编辑器使用说明
01:复制当前行到最后一行的内容,然后粘贴到最后一行的后面
:/172.16.1.31/,$copy$
:.,$copy$
**************************************************************************************
08: ansible剧本编写总结说明
找什么服务器,让服务器干写什么
多使用检查命令-C
=========================================
原文:http://liang3391.blog.51cto.com/178205/732100
参考:http://www.ibm.com/developerworks/cn/aix/library/au-spunix_remoteserver/index.html
01:pssh命令使用场景说明
假如同时给上千台服务器执行一个命令,拷贝一个文件,杀一个进程等,有什么简化运维管理的工具呢?
在小型企业中通常使用for循环,但是数量巨大时:
· 一方面不确定操作是否成功一方面不确定操作是否成功
· 一方面for循环语句性能不好估计且是不是同步并行执行。
因此需要使用批量并行执行的命令,这类工具比如 pdsh,mussh,cssh,dsh等还有下面说明提到的pssh
02:pssh软件安装部署方式
①. 通过yum安装pssh软件
yum install -y pssh <- pssh软件下载需要依靠epel源
说明:pssh是一个软件大礼包,里面有很多软件命令
# rpm -ql pssh
/usr/bin/pnuke
/usr/bin/prsync
/usr/bin/pscp.pssh
/usr/bin/pslurp
/usr/bin/pssh
....省略部分信息....
①. 通过编译方式安装pssh软件
wget http://peak.telecommunity.com/dist/ez_setup.py
python ez_setup.py
wget http://parallel-ssh.googlecode.com/files/pssh-2.2.2.tar.gz
tar zxvf pssh-2.2.2.tar.gz
cd pssh-2.2.2
python setup.py install
03:pssh软件使用操作说明(ssh key认证密钥配置完毕)
pssh工具包主要有5个程序:
①. pssh 多主机并行运行命令
[root@server pssh-2.2.2]# vim hosts_info.txt
172.16.1.31:22
172.16.1.41:22
172.16.1.7:22 //注意我的端口号不仅是默认的22
[root@m01 tmp]# pssh -P -h /tmp/hosts_info.txt uptime
172.16.1.31: 00:05:58 up 3 days, 18:34, 2 users, load average: 0.00, 0.01, 0.05
[1] 00:05:58 [SUCCESS] 172.16.1.31:22
172.16.1.41: 00:05:58 up 9 days, 22:39, 2 users, load average: 0.00, 0.01, 0.05
[2] 00:05:58 [SUCCESS] 172.16.1.41:22
172.16.1.7: 00:05:58 up 9 days, 22:39, 2 users, load average: 0.00, 0.01, 0.05
[3] 00:05:58 [SUCCESS] 172.16.1.41:22
说明:如果想将执行命令的批量输出信息重定向到一个文件 加-o 目录 选项
-h HOST_FILE, --hosts=HOST_FILE hosts file (each line "[user@]host[:port]")
-o OUTDIR, --outdir=OUTDIR output directory for stdout files (OPTIONAL)
-P, --print print output as we get it
②. pscp 把文件并行地复制到多个主机上
注意 是从服务器端给客户端传送文件:
[root@server pssh-2.2.2]# pscp -h test.txt /etc/sysconfig/network /tmp/network
//标示将本地的/etc/sysconfig/network传到目标服务器的/tmp/network
③. prsync 使用rsync协议从本地计算机同步到远程主机
[root@server ~]# pssh -h test.txt -P mkdir /tmp/etc
[root@server ~]# prsync -h test.txt -l dongwm -a -r /etc/sysconfig /tmp/etc
//标示将本地的/etc/sysconfig目录递归同步到目标服务器的 /tmp/etc目录下,并保持原来的时间戳,使用用户 dongwm
④. pslurp 将文件从远程主机复制到本地,和pscp方向相反:
[root@server ~]# pslurp -h test.txt -L /tmp/test -l root /tmp/network test
//标示将目标服务器的/tmp/network文件复制到本地的/tmp/test目录下,并更名为test
[1] 14:53:54 [SUCCESS] 192.168.9.102 9922
[2] 14:53:54 [SUCCESS] 192.168.9.104 9922
[root@server ~]# ll /tmp/test/192.168.9.10
192.168.9.102/ 192.168.9.104/
[root@server ~]# ll /tmp/test/192.168.9.102/
总计 4.0K
-rw-r--r-- 1 root root 60 2011-04-22 14:53 test
[root@server ~]# ll /tmp/test/192.168.9.104/
总计 4.0K
-rw-r--r-- 1 root root 60 2011-04-22 14:53 test
⑤. pnuke 并行在远程主机杀进程:
[root@server ~]# pnuke -h test.txt syslog
//杀死目标服务器的syslog进程,只要ps进程中出现相关词语 都能杀死
[1] 15:05:14 [SUCCESS] 192.168.9.102 9922
[2] 15:05:14 [SUCCESS] 192.168.9.104 9922
=========================================