• 多台计算机之间的ssh无密钥登录


      在很多分布式系统中,我们最常遇到的一个问题是,需要在服务器集群上保证多台机器之间的SSH无密钥登录。以Hadoop为例,为了方便,我们需要在master和slaves之间配置密钥登录,这样我们启动Hadoop时就不用一个个输入密码了。问题是在配置无密钥登录过程中,如果集群机器很多,我们要将master机器上产生的公钥分发给所有的slaves, 分发一次就要输入一次密码,这种超费体力的活我们何不交给计算机自己来做呢? 于是就有了这篇文章。

    1. 准备工作

    • 集群机器信息

        本次实验使用Openstack云平台来创建测试集群, 所有节点采用的配置为CPU: 1Core MEM: 512M Disk: 10G OS: CentOS 6.4. 各个节点的详细信息如下表:

    主机名 IP地址
    master 172.16.0.200
    slave1 172.16.0.201
    slave2 172.16.0.202
    slave3 172.16.0.203
    slave4 172.16.0.204

        注意: 由Openstack创建的所有节点的初始登录用户名密码均相同(本实验中使用root用户)

    • maste机器配置

        1. 登录到master机器, 打开文件ssh_config(/etc/ssh_config), 在ssh_config文件中找到Host *这一行,在下面行中加入 StrictHostKeyChecking no 如下图:

      


        2. 生成ssh密钥, 命令: 
    ssh-keygen -t rsa不用管提示,一路回车即可。最后会生成两个密钥文件id_rsa, id_rsa.pub, 分别为私钥和公钥。公钥是我们待会要发送给各个slave节点的。

    • 安装pexpect(Python 模块)

        在配置无密钥登录的过程中,最重要的一步是将master生成id_rsa.pub文件拷贝的各个slave节点上,并追加到各个slave节点的authorized_keys文件中(上面两步操作也可以使用ssh提供的ssh-copy-id命令,本文用的就是这种方法)。但在拷贝过程中会让我们输入slave节点的密码。这也是阻碍我们自动化配置无密钥登录的最大障碍。 为了解决这个问题,本文采用python的pexpect模块,该模块能够让程序与shell命令进行交互。 pexpect下载地址: https://pypi.python.org/pypi/pexpect/ , 下载完成后,解压。解压后在目录下运行:python ./setup.py install(root权限) 安装完成以后,就可以进行我们下一步的工作了。

        另外我们也可以直接安装expect工具。具体的请百度 expect。 

    2. 无密钥登录程序

      下面两个脚本就是本文中实现SSH批量无密钥登录的程序,free_login.sh配置slave的用户名密码,并调用free_login.py,  free_login.py负责将master的公钥拷贝到各个slave机器上。代码如下:

    free_login.sh

    #!/bin/bash
    
    #slave节点的user_name和password
    user_name="root"
    user_pass="111111"
    
    #命令参数为保存所有slave节点ip地址文件,一个ip一行
    if [ $# != 1 ]; then
        echo "need ip list file"
        exit
    fi
    ip_list_file=$1
    
    # first invoke free_python.py to setup passphraseless ssh to
    # all hosts in ip list file 
    
    `./free_login.py ${ip_list_file} ${user_name} ${user_pass}`

    free_login.py

    #!/usr/bin/python
    
    import os
    import pexpect
    import sys
    
    file_path = sys.argv[1]
    user_name = sys.argv[2]
    pwd = sys.argv[3]
    file = open(file_path,"r")
    lines = file.readlines()
    for line in lines:
        line = line.strip('
    ')
        print "set free login on host:%s" % line
        child = pexpect.spawn('ssh-copy-id -i /root/.ssh/id_rsa.pub ' + user_name + '@' + line)
        message = ''
        try:
            i = child.expect(['[Pp]assword:','continue connecting (yes/no?)'])
            if i == 0:
                child.sendline(pwd)
            elif i == 1:
                child.sendline('yes')
                child.expect('[Pp]assword')
                child.sendline(pwd)
            else:
                pass
        except pexpect.EOF:
            message = child.read()
            child.close()
        else:
            message = child.read()
            child.expect(pexpect.EOF)
            child.close()

      注意,在使用时,free_login和free_login.py应放在同一个目录下。执行如下命令,即可完成无密钥登录操作。

    bash ./free_login 'ip list file'

      以上便是自动化无密钥登录的全部过程,上面用到的代码和工具可以到github上下载,地址: https://github.com/meibenjin/FreeLogin 

     

    本文来自博客园,如果查看原文请点击:  http://www.cnblogs.com/meibenjin/p/3434178.html

     

  • 相关阅读:
    Python---HTML常用标签
    Python---进阶---Tkinter---game
    工程师的URL大全
    docker安装小笔记
    SQL server查询语句
    非常好用的sersync同步工具
    运维自动化的标准
    使用ansible实现轻量级的批量主机管理
    emos邮件系统的web密码修改方法
    Linux 之 rsyslog+mysql+LogAnalyzer 日志收集系统
  • 原文地址:https://www.cnblogs.com/meibenjin/p/3434178.html
Copyright © 2020-2023  润新知