作为一个系统管理员,有时候常常批量修改远程主机配置,当然这里有很多选择,可以选择最近比较热门的自动化工具ansible、saltstack等。

以下介绍使用python实现,当然留心的小伙伴已经知道前面我写过一篇:ssh批量登录并执行命令(python实现)

以下是通过python批量更改centos系统密码

由于考虑到小伙伴们并不是每一台主机都是使用相同密码,导致以前文章上写的方法并不适用,故写了份修改版供大家参考。

  • 注意执行脚本服务器需要提前安装paramiko模块.
  • 官网链接: http://www.paramiko.org/
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    #-*- coding: utf-8 -*-
    #!/usr/bin/python
    import paramiko
    import threading
    def IP_list(ip_list):
    with open(ip_list, 'r') as f:
    ip_list = f.readlines()
    for ip in ip_list:
    cmd="echo '{0}' | passwd --stdin {1}".format(ip.strip('\n').split(' ')[3],ip.strip('\n').split(' ')[1])
    a = threading.Thread(target=ssh2, args=(ip.strip('\n').split(' ')[0], ip.strip('\n').split(' ')[1], ip.strip('\n').split(' ')[2], cmd))
    a.start()

    def ssh2(ip,username,passwd,cmd):
    try:
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(ip, 22, username, passwd, timeout=15)
    stdin, stdout, stderr = ssh.exec_command(cmd)
    stdin.write("Y")
    out = stderr.readlines()
    if out:
    print '========' + ip + "==================>ERROR"
    for o in out:
    print o[:-1]
    else:
    out = stdout.readlines()
    print '========' + ip + "==================>OK"
    for o in out:
    print o[:-1]
    except Exception, e:
    print '%s\tError\n' % (e)

    if __name__=='__main__':
    IP_list('ip.list')
    threads = [2]



    ===================================================
    ip_list格式
    ip username 更改前密码 更改后密码

    ===================================================
    新增日志版本

    #-*- coding: utf-8 -*-
    #!/usr/bin/python
    import os,sys
    import paramiko
    import threading
    def IP_list(ip_list):
    with open(ip_list, 'r') as f:
    ip_list = f.readlines()
    for ip in ip_list:
    cmd="echo '{0}' | passwd --stdin {1}".format(ip.strip('\n').split(' ')[3],ip.strip('\n').split(' ')[1])
    a = threading.Thread(target=ssh2, args=(ip.strip('\n').split(' ')[0], ip.strip('\n').split(' ')[1], ip.strip('\n').split(' ')[2], cmd))
    a.start()

    def Write_log(log):
    pwd = os.getcwd()
    with open(pwd+'/'+sys.argv[0] + '_log','a') as f_log:
    f_log.write(log)

    def ssh2(ip,username,passwd,cmd):
    try:
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(ip, 22, username, passwd, timeout=15)
    stdin, stdout, stderr = ssh.exec_command(cmd)
    stdin.write("Y")
    out = stderr.readlines()
    if out:
    print '========' + ip + "==================>ERROR"
    Write_log( '========' + ip + "==================>ERROR\n")
    for o in out:
    print o[:-1]
    Write_log(o[:-1]+'\n')
    else:
    out = stdout.readlines()
    print '========' + ip + "==================>OK"
    Write_log('========' + ip + "==================>OK\n")
    for o in out:
    print o[:-1]
    Write_log(o[:-1]+'\n')
    except Exception, e:
    print '%s\tError\n' % (e)
    Write_log('%s\tError\n' % (e))
    if __name__=='__main__':
    IP_list('ip.list')
    threads = [2]

简单感概:

Python是日后运维招聘必须掌握的一项基本技能,建议学习好语言过程,掌握多一门自动化工具,可选ansible或者是saltstack。两者精通其一即可。后面博主会多写关于运维过程中一些常用软件安装或者配置通过salt自动化工具实现的文章,在日常运维工作中尽量减轻重复工作的步骤。

Comments

2017-07-22