日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

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

發布時間:2025/4/16 54 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Python+Django+Ansible Playbook自动化运维项目实战(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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段的存活ip nmap -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 telnetlib tm = 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 re re.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)) # 實例化spawni = 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: # 錯誤EOFprint "logging process exit!"elif index == 2: # TIMEOUTprint "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 '...................................',0if 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參考:https://www.cnblogs.com/Eric15/articles/9185291.html

?①、安裝

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 paramikoprivate_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

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的Python+Django+Ansible Playbook自动化运维项目实战(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。