一:安装并配置ansible
#安装
yum -y install ansible sshpass
或
apt -y install ansible sshpass
#跳过第一次连接检测询问是否登陆的提示(YES/NO)
sed -i "/host_key_checking = False/a\host_key_checking=False" /etc/ansible/ansible.cfg
#sshpass作用:ssh 登陆不能在命令行中指定密码,sshpass 的出现则解决了这一问题。它允许你用 -p 参数指定明文密码,然后直接登录远程服务器,它支持密码从命令行、文件、环境变量中读取。
二:配置hosts主机组(可选择任意当前主机登录用户有权限执行的文件创建hosts)
[all]
all主机组所有ip
#192.168.1.2
#192.168.1.3
#....
[all:vars]
ansible_user=user
ansible_ssh_pass=123456
ansible_sudo_pass=123456
ansible_python_interpreter=/usr/bin/python3
ansible_ssh_port=22
三:ansible基本模块的使用(包括ping,shell,script,copy,fetch五个常用模块)
- ping模块的使用
- 作用:测试当前主机与hosts文件all组中的网络连通性
ansible all -m ping -i hosts -f 400
#参数详解 all:指定主机组
-m:指定ansible所使用的的模块
-i:指定hosts文件路径(可为绝对路径)
-f: 并发量(是主机性能或all组中主机数指定)
- shell模块的使用
作用:在all主机组中执行普通shell命令
#批量安装软件
ansible all -m shell -a ‘apt -y install vim’ -i hosts -b -f 400
#参数详解 -a shell模块支持的命令(大多数命令)
-b 以root权限在远程主机执行该shell命令
#多命令执行
ansible all -m shell -a ‘apt -y install vim;ip a’ -i hosts -b -f 400
#测试远程主机与某主机的联通性(百度对运维来讲就是用来ping的)
ansible all -m shell -a ‘ping baidu.com -c 4’ -i hosts -b -f 400
#注意:shell命令中 -c 即ping命令的执行次数一定要制定下,因为linux系统默认会一直ping,不然会误以为是卡死的现象
#与ping模块的区别可理解为ping模块是由ansible主机向all主机组发送数据包,
#而shell是将ping命令通过shell模块发送到all主机组中执行
- script模块的使用
作用:将本地脚本文件在远程主机上执行(在使用中对系统环境不同的主机组不是太友好,建议使用copy+shell模块相结合的方式执行脚本文件)
#将某软件的安装脚本在all组中的主机中执行
ansible all -m script -a ‘install.sh’ -i hosts -b -f 400
- copy模块的使用
作用:将ansible主机中的文件copy到all组中主机的指定目录下
#将本地的某软件的安装脚本copy到远程主机的/tmp/路径下
ansible all -m copy -a 'src=./install.sh dest=/tmp/' -i hosts -b -f 400
- fetch模块的使用
作用:将all组中的指定文件拷贝到ansible主机中的
#将远程主机中的临时文件copy到ansible主机的/tmp/路径下
ansible all -m fetch -a 'src=/root/tmp.txt dest=/tmp/' -i host -b -f 400
四:自以为是小技巧
- 当all组中中的主机较多是,返回结果往往一个较多,导致命令行无法查看全部内容可选择将输出结果输出到临时文件(列:tmp.sh)中,通过筛选关键字来查看各类问题主机,
ansible all -m shell -a ‘ping baidu.com -c 4’ -i hosts -b -f 400 >tmp.sh
#查看执行成功的主机ip
cat tmp.sh |grep rc=0 |awk -F ' ' '{print $1}'
或
cat tmp.sh |grep SUCCESS |awk -F ' ' '{print $1}'
#查看执行成功但无返回值的主机
cat tmp.sh |grep “rc=0” |awk -F ' ' '{print $1}'
#查看端口拒绝链接导致超时或主机不存在
cat tmp.sh |grep -B 3 port |grep = |awk -F ' ' '{print $1}'
#查看用户密码错误机器
cat tmp.sh |grep -B 3 Authentication |grep = |awk -F ' ' '{print $1}'
#查看需首次连接检测询问是否登陆的提示(YES/NO)--改变若安装时已配置那就换台ansible主机重试下
cat tmp.sh |grep -B 3 Permiss |grep UN |awk -F ' ' '{print $1}'
辅助代码:测试多个网段中的存活机器
from multiping import MultiPing
#需要检测那先网段中的机器连通性,在hosts中的主机列表为网络中存在的主机
networks=['172.28.101','172.28.105']
ips = []
ping_connects = []
no__ping_connects = []
#或取network中所有ip
for network in networks:
for i in range(2,254):
ip = network+'.' + str(i)
ips.append(ip)
mp=MultiPing(ips)
mp.send()
responses = mp.receive(2)
for key in responses[0].keys():
ping_connects.append(key)
file_path = 'hosts'
with open(file_path, mode='a', encoding='utf-8') as file_obj:
file_obj.write(key + '\n')
print('本机能够ping的通的主机数:'+len(ping_connects))
no_ping_connects=responses[1]
print('本机不能够ping的通的主机数'+en(no_ping_connects))