构建数据包,Ansible

构建数据包

pip3 install scapy
#ipython

from scapy.all import *
TCP()
IP()
ICMP()
Ether()
DNS()

tmp =TCP()
tmp.show()

tmp.sport = 66661
tmp.show()
tmp.dport = RandShort()     设置目标端口随机
tmp.show()
del(tmp.sport)
tmp.show()

封装多层协议
Ether()/IP()/TCP()/'数据
只发送
send() 三层发送
sendp() 二层发送
参数:
inter=0.5 : 每隔0.5秒发送一次
loop = 1 : 死循环发送数据

构建并发送ping请求
    tmp = IP()/ICMP()
    tmp.dst='192.168.2.100'
    tmp.show()
    send(tmp)
    tmp.src = '100.100.100.100'
    send(tmp)

    tmp = Ether()/IP(dst='192.168.2.100')/ICMP()
    sendp(tmp)

    注意: 为了看到效果可以在目标主机上进行抓包  tcpdump -i 网卡 -nn icmp

收发数据(注意一般只能收到一次请求的响应不会连续请求,不会得到响应的数据)
sr() : 三这层发送接收数据,因为有些数据会发送失败,所以此函数会返回一个列表 [成功的响应,失败的信息]
sr1() : 三层发送接收数据,因为有些数据会发送失败,所以此函数只会返回 成功的响应
srp() : 二层发送接收数据,因为有些数据会发送失败,所以此函数会返回一个列表 [成功的响应,失败的信息]
srloop() : 不停的发送数据

    常用参数:
        inter=0.5     : 每隔0.5秒发送一次
        retry=3       : 如果失败了一共尝试3 次
        timeout=1     : 最后一个数据发完后,再过1秒,请求超时

#使用scapy请求解析DNS
from scapy.all import *
dns_server=‘114.114.114.114’
domain = ‘www.baidu.com’

data = IP(dst=dns_server)/UDP()/DNS(rd=1,qd=DNSQR(qname=domain))
ret = sr1(data)

ret.show()
'

nmap 端口扫描工具

nmap -选项  [-p 指定端口] 主机|网段
    常用选项:
        sn  : 以ping的方式扫描
        sS  : 以三次握手第一次探测
        sT  : 以完成三次握手的方式探测 
        sU  : 以udp的方式探测 
        A  : 显示设备的概况信息

python-nmap : python对nmap的封装

安装:
    #yum install nmap
    #pip3 install python-nmap

scan在参数:
    scan(hosts='127.0.0.1', ports=None, arguments='-sV', sudo=False)

探测示例
例: 探测主机192.168.2.100有没有开放22端口
import nmap
tool = nmap.PortScanner()
ret = tool.scan(‘192.168.2.100’,‘22’)
print(ret)

例: 探测主机192.168.2.100有没有开放20-22端口
import nmap
tool = nmap.PortScanner()
ret = tool.scan(‘192.168.2.100’,‘20-22’)
print(ret)

例: 探测网段192.168.2.0/24有没有开放22和5900端口
import nmap
tool = nmap.PortScanner()
ret = tool.scan(‘192.168.2.0/24’,‘22,5900’)
print(ret)

题: 探测本局域网中是否有vnc服务器(默认为5900/tcp),如果有则找出它的ip地址
import nmap

    def scan(ip,port='5900'):
        tool = nmap.PortScanner()
        ret = tool.scan(ip,port)
        info = ret['scan'][ip]
        if info['status']['state'] != 'up':return False
        port_info = info['tcp'][int(port)]['state']
        if port_info == 'open':
            return True
        else:
            return False

    if __name__ == '__main__':
        for i in range(1,255):
            ip = '192.168.144.{}'.format(i)
            ret = scan(ip)
            print(ret)

使用多线程的方式
import nmap
import threading

def scan(ip,port='5900'):
    tool = nmap.PortScanner()
    ret = tool.scan(ip,port)
    info = ret['scan'][ip]
    if info['status']['state'] != 'up':return False
    port_info = info['tcp'][int(port)]['state']
    if port_info == 'open':
        print(ip)
        return True
    else:
        return False

if __name__ == '__main__':
    threads = []
    for i in range(1,255):
        ip = '192.168.144.{}'.format(i)
        tmp = threading.Thread(target=scan,args=(ip,))
        threads.append(tmp)

    for i in threads:
        i.start()

    for i in threads:
        i.join()

探测某一地址范围
import nmap

port = 5900
tool = nmap.PortScanner()
ret = tool.scan('192.168.147.84-185',str(port))
info = ret['scan']
for ip in info:
    if info[ip]['status']['state'] == 'up':
        if info[ip]['tcp'][port]['state'] == 'open':
            print(ip)

自动化运维

 Fabric   ansible  salt-stack
 ansible: 
    不需要专门安装客户端,可以直接使用sshd服务
    被红帽收购
    相对而言性能没有salt-stack强

 salt-stack
    需要安装服务器端和客户端(版本要匹配)
    相对而言可以支持更大规模的服务器

 相同: 都使用python开发,而且都使用yaml作为配置语言

ansible运行过程
要有资产文件 :
里面记录了所有主机的信息及用户名,ip,密码等
也可以使用公钥私钥认证的方式,这种方式不需要再写密码等信息,官方推荐
连接ssh的组件:
当用户操作一些主机里,ansible会自动通过资产文件找到主机的连接信息,并通过连接组件连接到远程主机。
连接组件是ssh的客户端,一般为paramiko
模块:
实现了具体的功能,用户可以调用此模块实现相应操作
插件:
为模块提供一些基础功能,如记录日志,发送邮件等

ansible运行方式:
Ad-Hot : 相当于Shell的命令行形式
playbook : 相当于shell的脚本形式

安装:
#yum install sshpass 有时交互输入密码时自动交互使用。

方法1:
    使用yum安装(ansible官网推荐)
        好处: 会将所有配置文件,目录等生成出来
        坏处: 版本过低
方法2:
    使用pip安装
        好处: 版本较新
        坏处: 不会将所有配置文件,目录等生成出来

注意:
如果是第一次连接主机会弹出提示接收公钥私钥的对话框
禁用方法一:
修改 /etc/ssh/ssh_config
StrictHostKeyChecking no
方法二:
修改 /etc/ansible/ansible.cfg
host_key_checking = False
资产文件的定义:
# cat /etc/ansible/hosts
192.168.68.131 ansible_ssh_user=root ansible_ssh_pass=wh123456
cli2.test.com ansible_ssh_host=192.168.68.154 ansible_ssh_user=root ansible_ssh_pass=wh123456
上面的变量为系统内置变量,同时也可以自定义变量
# cat /etc/ansible/hosts
192.168.68.131 ansible_ssh_user=root ansible_ssh_pass=wh123456 http_port=80
cli2.test.com ansible_ssh_host=192.168.68.154 ansible_ssh_user=root ansible_ssh_pass=wh123456

分组及组变量的定义
    # cat /etc/ansible/hosts 
        192.168.68.100 ansible_ssh_user=root ansible_ssh_pass=wh123456

        [nginx]
        192.168.68.131
        cli2.test.com ansible_ssh_host=192.168.68.154

        [nginx:vars]
        ansible_ssh_user=root
        ansible_ssh_pass=wh123456

执行: 使用ping 模块探测连通性
ansible -i /etc/ansible/hosts 192.168.68.131 -m ping
ansible cli2.test.com -m ping

注意:登录一台主机可以使用资产文件中定义的用户名和密码,也可以使用免密登录(推荐)

Ad-hot模式使用方法:
ansible -m -a
ansible 匹配的资产主机 -m 使用的模块 -a 模块的参数

-i                  : 指定资产文件 ,默认为 /etc/ansible/hosts
-m                  : 指定使用的模块 ,默认为 command
-a                  : 指定相应模块的参数
-f                  : 指定ansible一次操作多少台主机,默认为5台
--private-key       : 使用公钥私钥的方式进行认证
--list-hosts        : 不执行命令,只显示会执行的主机
-e                  : 指定运行时的额外的变量
-l                  : 进一步限定生效的主机
-b                  : 切换到其它用户的身份进行执行命令,默认为 root
--become-uesr       : 指定切换到哪个用户去执行命令
--become-method     : 指定用户身份的方法如 sudo/su,默认为sudo

匹配主机:
可以使用全称(必须是在资产文件中定义的):
192.168.10.30
www.test.com
可以使用通配:
192.168.10.*
*.test.com
可以使用组名:
group1
特殊变量:
all : 指资产文件中所有主机
ungrouped : 资产文件中没有分组的主机
ansible-doc 命令查看模块帮助信息
ansible-doc -s 模块名 :查看模块的帮助信息

常用模块 (重点):
创建(present) 删除(absent)

ping        : 探测是否可以连接到客户端,如果成功返回 pong
setup       : 获得主机的本身的信息(硬盘,cpu,主板,系统,ip,主机名)称为facts。 playbook默认会先执行setup
command     : 执行系统命令,不支持管道等操作。默认模块
raw         : 执行系统命令,支持管道等操作。
script      : 在远程主机执行主控端的shell/python脚本 
shell       : 执行远程主机的shell/python脚本或命令,/root/test.sh要有执行权限
copy        : 拷贝文件---将本机文件拷贝到远程服务器上
fetch       : 拷贝文件---将远程服务器文件拷贝到本机上,注意:放置到本机上时为目录,为了防止相互覆盖。
file : 
            模块可以做到修改文件的属主和权限,(在这里可替换为 copy 模块,是等效的):
            $ ansible webservers -m file -a "dest=/srv/foo/a.txt mode=600"
            $ ansible webservers -m file -a "dest=/srv/foo/b.txt mode=600 owner=root group=root"

            使用 file 模块也可以创建目录,与执行 mkdir -p 效果类似:
            $ ansible webservers -m file -a "dest=/path/to/c mode=755 owner=root group=root state=directory"

            删除目录(递归的删除)和删除文件:
            $ ansible webservers -m file -a "dest=/path/to/c state=absent"  
            创建文件
            ansible nginx -m file -a 'state=touch path=/root/abc.txt'

你可能感兴趣的:(Python高级运维模块)