ansible非root用户批量修改root密码

摘要:
Salt的在线版本之前已经部署过,但由于各种因素,它尚未正常使用。使用自动化工具批量修改的计划搁浅了。后来,领导给出了一个python多线程密码修改脚本。然而,实际测试效果并不理想,会出现干扰#/Usr/bin/pythonimportparamiko#ssh连接模块importtime,sys,re,osimportsocketthreading,Queue#thread模块root_Cmd=r''在此处输入您要执行的命令'user_Cmd=r''echo''''issu=1root_Pwd='您要修改的根密码'login_user='Common-user'key_file='/home/。ssh/id_Rsa'#普通用户密钥shport=22#端口time_ Out=60#超时数_线程=300#最大线程数q=队列。Queue()#线程队列套接字。setdefaulttimeoutlock=线程。RLock()#线程锁onlydir=dir()defsshgo:rtn=[]key=paramiko.RSAK。from_private_key_filesh=paramiko.SSHClient()ssh。设置缺少主机密钥策略ssh。load_system_host_keys()rtn.appendtry:ssh.connectexceptException,e:rtn。appendreturnnif'user_cmd'仅目录:stdin,stdout,stderr=ssh。exec_commandrtn.append#rtn.appendfnotissu:#return-return“”,shell=ssh。invoke_shell(),其中lenotshell.recv.endswith:time.sleep(0.1)buff='shell.sendshell.send(''),而lenotbuff.endswith:time.sleep(0.1)resp=shell.recfbuff+=respibuff.endswitchorbuff.end swith:rtn.appendreturnrnbuff='shell.sendshell.sensend(''”),而renotbuff-endswith:time.sleep(0.1)resp=shell/recvbuff+=respibuff.sendswithorbuff.nendswith:rn.appendreturnnshell.send shell.send(“”)buff=“whilenotbuff.以:时间结束。sleep(0.1)resp=shell.recvbuff+=respibuff.endswith:rtn.appendbreakelifbuff.endswith('?

前言:

由于线上服务器密码长久没有更新,现领导要求批量更换密码。线上的之前部署过salt,但由于各种因素没有正常使用。

使用自动化工具批量修改的计划搁浅了,后来领导给了个python多线程修改密码脚本。但实际测试效果并不理想,会出现卡住情况

ansible非root用户批量修改root密码第1张ansible非root用户批量修改root密码第2张
#!/usr/bin/python
import paramiko#ssh连接模块
import time,sys,re,os
import socket
import threading,Queue#线程模块

root_cmd = r'''
这里输入你要执行的命令
'''
user_cmd = r''' echo ''  '''
issu = 1 
root_pwd='你要修改的root密码'
login_user = '普通用户名'
key_file = '/home/.ssh/id_rsa'#普通用户key
sshport = 22#端口
time_out = 60 #超时时间
Numer_Thread = 300#最大线程数(根据主机数量修改)


q = Queue.Queue()#线程队列
socket.setdefaulttimeout(time_out)
lock = threading.RLock()#线程锁(同时只允许一个线程执行动作)
onlydir = dir()

def sshgo(host,rootuser,rootpwd):
    rtn = []
    key = paramiko.RSAKey.from_private_key_file(key_file)
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.load_system_host_keys()

    rtn.append('________________________________%s'%host)
    try:
        ssh.connect(host,sshport,login_user,pkey=key)
    except Exception,e:
        rtn.append('%s__ERROR_________________________%s'%(e,host))
        return rtn
    if 'user_cmd' in onlydir:
        stdin, stdout, stderr = ssh.exec_command('LANG=en_US.UTF-8;LANGUAGE=en_US.UTF-8; %s'%user_cmd)
        rtn.append(stdout.read() + stdout.read())
        #rtn.append(stdout.read() + stderr.read())
    if not issu:
            #return rtn
            return "",(rtn)
    shell = ssh.invoke_shell()
    while not shell.recv(4096).endswith(']$ '):
        time.sleep(0.1)

    buff  =''
    shell.send('LANG=en_US.UTF-8;LANGUAGE=en_US.UTF-8;su - %s'%rootuser)
    shell.send('
')
    while not buff.endswith('Password: '):
        time.sleep(0.1)
        resp = shell.recv(4096)
        buff += resp
        if buff.endswith('exist') or buff.endswith(']$ '):
            rtn.append('ERROR_SSH.RECV_____1________________%s'% resp)
            return rtn
    buff  =''
    shell.send(root_pwd)
    shell.send('
')
    while not buff.endswith(']# '):
        time.sleep(0.1)
        resp = shell.recv(4096)
        buff += resp
        if buff.endswith('password') or buff.endswith(']$ '):
            rtn.append('ERROR_SSH.RECV_____2________________%s'% resp)
            return rtn
    shell.send('LANG=en_US.UTF-8;LANGUAGE=en_US.UTF-8; %s '%root_cmd)
    shell.send('
')
    buff = ''
    while not buff.endswith(']# '):
        time.sleep(0.1)
        resp = shell.recv(4096)
        buff += resp
        if buff.endswith(']$ '):
            rtn.append('ERROR_SSH.RECV_____3________________%s'% resp)
            break
        elif buff.endswith('? '):
            rtn.append('ERROR_SSH.RECV_____4________________??')
            break
    #print buff
    #rtn= (''.join(rtn)).strip()+"  "+host
    rtn.append('
'.join(buff.split('
')[1:-1]))
    ssh.close()
     return "",(rtn)    
    #return rtn

def do_echo(host,rootuser,rootpwd):
    result = sshgo(host,rootuser,rootpwd)
    lock.acquire()
    for pp in result:
        print pp
    print
    sys.stdout.flush()
    lock.release()

def working():
    while 1:
        args = q.get()
        do_echo(args[0],args[1],args[2])
        q.task_done()

for i in range (Numer_Thread):
    t = threading.Thread(target=working)
    t.setDaemon(1)
    t.start()
print "Begin......" 
fn = open("/var/tmp/169" ,"r")
#fn = open("/tmp/1.log" ,"r")
for i in fn:
    if not re.match('#',i) and re.search('.',i):
        c = i.split()
        q_args = [c[0],'','']
        #q_args = [c[0],c[1],c[2]]
        q.put(q_args)
fn.close()
q.join()
python多线程修改root密码脚本
后来想到了不需要安装客户端的自动化管理工具:ansible 好吧那就查下相关资料吧

1.安装ansible

yum -y install ansible

2.修改主机配置文件

vim /etc/ansible/hosts
[web]#主机组
10.18.111.123 ansible_ssh_user=usernam ansible_ssh_private_key_file=/home/maintain/username/.ssh/id_rsa
ansible非root用户批量修改root密码第3张
192.168.1.1 ansible_become_pass='password' ansible_ssh_user=username  ansible_ssh_private_key_file=/home/maintain/username/.ssh/id_rsa

配置得了root密码,及普通用户和相应的key,这样做其实并不理想,1:不安全2:配置复杂点。后续可以使用ansible的playbook实现

2.切换普通用户执行命令

ansible web -S -R root -m raw -a 'echo '需要修改的root密码' | passwd --stdin root'
ansible非root用户批量修改root密码第4张
 

3.playbook版本

 ansible非root用户批量修改root密码第5张

这脚本参照网上的脚本修改的,但没生效。期待大牛的完善。

参考链接:

http://zylhz.com/?p=107

免责声明:文章转载自《ansible非root用户批量修改root密码》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Postgresql 物理备份冷备份 与 热备份tomcat假死 (原因及解决办法)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

如何解决ssh登陆,不久会自动断开的问题

很多新手在使用SSH Secure Shell Client的过程中,肯定经常会遇到当用SSH Secure Shell连接Linux时,如果几分钟没有任何操作,连接就会断开,提示server responded "connection closed" 。必须重新登陆才行,每次都重复相同的操作,很是烦人。 一般修改两个地方可将这烦人的问题解决 1、echo...

centos7 openfiles问题

集群环境有几台新增的机器,尝试修改open files的时候,按照平常的操作就是修改/etc/security/limits.conf和/etc/security/limits.d/90-nproc.conf使得重启后永久生效,然后执行ulimit -n 65536这种使得当前生效。这样大多数情况是OK的,但是这里要注意有坑,首先是否真正的生效,需要通过其...

Git的常用命令

Git常用命令汇总以及其它相关操作 一、常用的git命令 --文件目录操作命令 1 mkdir * 创建一个空目录 *指目录名 2 pwd 显示当前目录的路径。 3 cat * 查看*文件内容 4 git rm * 删除**文件 --git初始化操作 1 git init 把当前的目录变成git...

使用ssh登录windows10

希望windows操作系统能如Linux一般用于被其他电脑登录,今天实操一下。 所有的操作过程均使用windows自带的软件即可完成。 首先新建一台windows10虚拟机,物理机无法ping通这台虚拟机的地址。 打开虚拟机windows设置->应用->管理可选功能:默认只有“OpenSSH 客户端”。 点击“添加功能”,找到“OpenSSH...

ansible 安装发现问题及解决方法

一、安装Ansible 步骤    1、命令行查看Python     #Python --vesion    python 版本需要是2.4以上版本(Python 3.0是不同语言)        2、centos7 用户需先配置 EPEL    #yum install https://dl.fedoraproject.org/pub/epel/epe...

Linux Shell远程执行命令(命令行与脚本方式)

shell远程执行: 经常需要远程到其他节点上执行一些shell命令,如果分别ssh到每台主机上再去执行很麻烦,因此能有个集中管理的方式就好了。一下介绍两种shell命令远程执行的方法。 前提条件: 配置ssh免密码登陆 对于简单的命令: 如果是简单执行几个命令,则: ssh user@remoteNode "cd /home ; ls" 基本能完成常用的...