博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Python+Django+Ansible Playbook自动化运维项目实战(二)
阅读量:5294 次
发布时间:2019-06-14

本文共 6860 字,大约阅读时间需要 22 分钟。

Python+Django+Ansible Playbook自动化运维项目实战


 一、资产管理,自动化发现、扫描

 1、服务端资产探测、扫描发现

 1)资产管理的资产:

 

 2)抽象与约定:

 

 

2、探测协议和模块

 1)探测协议

 

2)探测模块和工具

  

3)nmap工具探测使用

# Ubuntu安装sudo apt install nmap# linux安装yum install nmap# python安装pip install python-nmap ==0.61

 

# 探测ip为192.168.1.155是否存活nmap -n -sP -EP  192.168.1.155# 探测ip段的存活ipnmap -n -sP -EP  192.168.1.155/24# -EP:返回数据包括端口都显示

  

4)python-nmap模块的使用

首先,在python环境下安装python-nmap模块,然后再使用python-nmap

import nmapnm = nmap.PortScanner()  # 端口服务、主机扫描nm.scan(hosts='192.168.1.0/24',arguments='-n -sP -PE')   # 对hosts网端进行扫描   nm.all_hosts()  # 在局域网内只找已启用的ip

 

运行结果

nm.scan(hosts='192.168.1.0/24',arguments='-n -sP -PE'):

 

nm.all_hosts():

  


 

 3、python中的telnet模块判断ssh服务主机

 1)SSH端口存活扫描

  

判断主机列表是否属于Linux服务器:根据上面-抽象与约定

 ①、系统内部开通ssh服务端口的的为Linux服务器

 ②、开放的ssh端口范围:22 , 2022 , 202

 telnet 命令:判断端口是否存活

telnet 192.168.1.155 22

输出结果:是linux服务器

 

telnetlib 模块:python模块,python自带

import telnetlibtm = telnetlib.Telnet(host='192.168.1.155',port='22',timeout=4)tm.read_until('\n',timeout=5) #执行ip 端口扫描,遇到换行便结束# 返回结果:# 'SSH-2.0-OpenSSH_6.7p1 Raspbian-5+deb8u2\r\n'# 正则匹配,判断是否为linux服务器import rere.search('ssh',tm.read_until('\n',timeout=5))  # 如果为True ,则说明是linux服务器

 

小结: 

 


 

4、主机登录探测 

  

使用一系列的验证方式循环进行SSH登录,得到正确的登录方式:

  

1)使用ssh登录服务端:ssh -l root 192.168.1.155 -p 22  ,回车根据要求输入密码即可

sudo apt-get install openssh-server  # Ubuntu下SSH安装/etc/init.d/ssh start   # SSH 启动ssh -l 用户名 本机ip -p 端口   # SSH 登录

2)使用秘钥公钥登录

 ①、编辑:vim /etc/ssh/sshd_config 

 找到如下内容,确认已启用:

 RSAAuthentication yes         # 开启用户账号密码登录认证

 PubkeyAuthentication yes    # 开启公钥私钥登录认证

  ②、给当前用户生成公钥秘钥

 执行指令:ssh-kengen

 系统会自动为你生成公钥/私钥 两个文件  ,放置的路径:/home/用户/.ssh/ 下 。 公钥:id_rsa.pub , 私钥:id_rsa

   如果出现:Enter passphrase(empty…)(输入加密串),可以不用理,直接回车

   ③、重命名或copy公钥文件:

   mv id_rsa.pub authorized_keys  # 重命名 ,必须命名为authorized_keys ,配置文件sshd_config中指定的 ,authorized_keys文件必须放在公钥的位置(home/用户/.ssh)

   ④、确保公钥文件权限600(rwx -111:7)

  chmod 600 authorized_keys

   ⑤、将私钥copy到自己的客户端

  如果是linux,则放到home/用户/.ssh 路径下


 

5、pexpect和paramiko模块 

 

1)pexpect

 ①、安装:pip install pexpect

 

 ②、pexpect 的 run() 函数:

  直接执行命令返回结果和状态

import pexpectpexpect.run("ls /tmp")  # 直接执行命令,打印 tmp目录下的文件pexpect.run("ls /tmp",withexitstatua=1) #打印的数据末尾有个数字,‘0’代表成功,‘1’代表执行失败

  ③、pexpect的spawn类

  启动子程序,用丰富的方法实现对子程序的控制:

     类的实例化

   缓冲区内容匹配:正则匹配、pexpect.EOF、pexpect.TIMEOUT(正则表达式中的$符号在pexpect中只代表$符号,没有其他意义。要表示结尾可以用:\r\n,代表行结束)

   向子程序发送指令

   脚本模拟ssh登录

   终端会话

 

import pexpect# chk = pexpect.spawn('ls -l /tmp/') # 实例化ssh_k = pexpect.spawn('ssh root%127.0.0.1 -p22') # 实例化ssh_k.expect('password:')   # 缓冲区内容匹配:实例化后执行,匹配子程序的执行情况,结果为0表示匹配成功

 发送指令:

 send() :默认多加一个回车符,sendline没有

 sendline()

 sendcontrol(char) :发送控制符

 

 脚本模拟ssh登录

  • pexpect实现ssh的自动化 用户密码 登录
  • pexpect实现ssh的自动化 秘钥 登录
# -*- coding: utf-8 -*-import pexpectdef login_ssh_passwd(port="",user="",host="",passwd=""):    '''函数:用于pexepect实现ssh的自动化用户密码登录'''    # print 'ssh -p %s %s@%s' % (port,user, host)    if  port and user and host and passwd:        ssh = pexpect.spawn('ssh -p %s %s@%s' % (port,user, host)) # 实例化spawn        i = ssh.expect(['password:', 'continue connecting (yes/no)?'], timeout=5) # 执行缓冲区内容匹配,第一次登陆匹配(continue...),非第一次登陆匹配(password)        if i == 0 : # 参数1的结果            ssh.sendline(passwd) # 匹配到password ,发送密码过去        elif i == 1: # 参数2的结果            ssh.sendline('yes\n')            ssh.expect('password: ')            ssh.sendline(passwd)        index = ssh.expect (["#", pexpect.EOF, pexpect.TIMEOUT])  # 匹配到'#',说明是root用户        if index == 0: # root用户            print "logging in as root!"            ssh.interact()        elif index == 1: # 错误EOF            print "logging process exit!"        elif index == 2: # TIMEOUT            print "logging timeout exit"    else:        print "Parameter error!"def login_ssh_key(keyfile="",user="",host="",port=""):    '''函数:用于实现pexepect实现ssh的自动化密钥登录'''    if  port and user and host and keyfile:        ssh = pexpect.spawn('ssh -i %s -p %s %s@%s' % (keyfile,port,user, host))        i = ssh.expect( [pexpect.TIMEOUT,'continue connecting (yes/no)?'], timeout=2)        # print '...................................',0        if i == 1: # 表示第一次登陆            ssh.sendline('yes\n')            index = ssh.expect (["#", pexpect.EOF, pexpect.TIMEOUT])        else: # 不是第一次登陆,就算安全登陆成功            index = ssh.expect (["#", pexpect.EOF, pexpect.TIMEOUT])        if index == 0:            print "logging in as root!"            ssh.interact()        elif index == 1:            print "logging process exit!"        elif index == 2:            print "logging timeout exit"    else:        print "Parameter error!"def main():    '''主函数:实现两种方式分别的登录'''    # login_ssh_passwd(port='22',user='root',host='192.168.1.101',passwd='imooccs')    login_ssh_key(keyfile="/tmp/id_rsa",port='22',user='root',host='192.168.1.101')if __name__ == "__main__":    main()

  会话控制:

  执行脚本模拟ssh登录时,登录成功执行了一个ssh.interact()方法,这个就是会话控制,模拟ssh登录成功,进入会话终端,可以进行登录服务器的终端操作

 ④、 pexpect模块缺陷

  


 

2)paramiko

 一个基于python实现的SSH远程安全连接,用于SSH远程执行命令、文件传输等功能的ssh客户端模块

 paramiko参考:

 ①、安装

pip install paramiko  # 安装

 

 ②、实现ssh 账号密码 登录

import paramiko  # 创建SSH对象ssh = paramiko.SSHClient()# 允许连接不在know_hosts文件中的主机ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接服务器ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', password='123')  # 执行命令stdin, stdout, stderr = ssh.exec_command('df')# 获取命令结果   stdin可以先远程服务端输入指令(stdin.write(),stdout获取远程机器输出结果,stderr接收错误信息)result = stdout.read()  # 关闭连接ssh.close()

 

  ③、实现ssh的密钥登录

import paramiko private_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa') # 创建SSH对象ssh = paramiko.SSHClient()# 允许连接不在know_hosts文件中的主机ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())# 连接服务器ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', pkey=private_key) # 执行命令stdin, stdout, stderr = ssh.exec_command('df')# 获取命令结果result = stdout.read() # 关闭连接ssh.close()

 

  ⑤、paramiko的应用和缺陷


 

6、通过操作系统获取主机资产信息 

 1)如何通过登录系统获取信息

  ①、通过系统获取哪些信息

  

 

 ②、为什么要获取这些信息 (主机资产信息的重要性和探测对象)

  •  有利于识别资产设备
  • 是资产的基本信息,是自动化平台的基石

 探测主机类型(探测对象):非docker容器的类型主机实体

③、获取信息的linux命令介绍

 1、主机资产(系统主机名、系统版本)获取方式

  系统主机名获取:hostname 、 uname -a 、 cat /etc/sysconfig/network(最后一个命令,cat用于centos,不适用Ubuntu) 等

    系统版本获取:cat /etc/issue  、 cat /etc/redhat-release 、 uname 、 lsb_release

  2、主机资产(mac地址信息)获取

   linux系统:cat /sys/class/net/eht0/adress 、 ifconfig eth0 、 ip a

  ESXI:esxcfg-vmknic -l

  应用:

   linux:cat /sys/class/net/[^vtlsb]*/address

   ESXI:esxcfg-vmknic -l|awk '{print $8}'|grep ':'

   通用于不同的操作系统:cat /sys/class/net/[^vtlsb]*/address||esxcfg-vmknic -l|awk '{print $8}'|grep ':'

  3、主机资产(机器型号、sn序列号)获取

    获取机器型号:dmidecode -s system-manufacturer 、 dmidecode -s system-product-name

    

    获取sn序列号:dmidecode -s system-serial-number

     


 

7、yaml工程的配置文件读取

  配置文件读取:yaml模块

   是一种直观的能够被电脑识别的数据序列化格式,类似于xml。由于易于被解析,应用于工程中作程序读取的配置文件

  安装:pip install PyYAML

 使用:

import yamlmyconf = yaml.load(file('conf/scanhosts.yaml'))print(myconf['hostsinfo']['nets'])# 结果:[192.168.1]

 

转载于:https://www.cnblogs.com/Eric15/articles/9795725.html

你可能感兴趣的文章
MySQL创建数据库和数据库表
查看>>
Codeforces Round #423 (Div. 2) C 思维,并查集 或 线段树 D 树构造,水
查看>>
Educational Codeforces Round 26 D dp,思维
查看>>
Spring Boot使用Servlet、Filter或Listener的方式
查看>>
ecshop中 transport.js/run() error:undefined
查看>>
POJ 1321 棋盘问题(DFS)
查看>>
mybatis中if及concat函数的使用
查看>>
第四周作业
查看>>
在ListView中获取当前行的索引
查看>>
Android 创世纪 第一天
查看>>
[重温数据结构]一种自平衡二叉查找树avl树的实现方法
查看>>
Java并发编程实战 第3章 对象的共享
查看>>
多线程系列(三):线程池基础
查看>>
【转载】数据库读写分离和垂直分库、水平分表
查看>>
String、StringBuffer和StringBuilder的区别
查看>>
mac terminal基本命令
查看>>
IntelliJ Idea 2017 免费激活方法
查看>>
Java适配器模式
查看>>
SetThreadAffinityMask 把线程限定在CPU上运行
查看>>
初学VUE2.0
查看>>