Python+Django+Ansible Playbook自动化运维项目实战(二)
Python+Django+Ansible Playbook自動化運維項目實戰(zhàn)
?一、資產(chǎn)管理,自動化發(fā)現(xiàn)、掃描
?1、服務(wù)端資產(chǎn)探測、掃描發(fā)現(xiàn)
1)資產(chǎn)管理的資產(chǎn):
2)抽象與約定:
?
2、探測協(xié)議和模塊
?1)探測協(xié)議
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:返回數(shù)據(jù)包括端口都顯示
4)python-nmap模塊的使用
首先,在python環(huán)境下安裝python-nmap模塊,然后再使用python-nmap
import nmapnm = nmap.PortScanner() # 端口服務(wù)、主機掃描 nm.scan(hosts='192.168.1.0/24',arguments='-n -sP -PE') # 對hosts網(wǎng)端進(jìn)行掃描 nm.all_hosts() # 在局域網(wǎng)內(nèi)只找已啟用的ip?
運行結(jié)果
nm.scan(hosts='192.168.1.0/24',arguments='-n -sP -PE'):nm.all_hosts():
?
?
?3、python中的telnet模塊判斷ssh服務(wù)主機
?1)SSH端口存活掃描
?
判斷主機列表是否屬于Linux服務(wù)器:根據(jù)上面-抽象與約定
①、系統(tǒng)內(nèi)部開通ssh服務(wù)端口的的為Linux服務(wù)器
②、開放的ssh端口范圍:22 , 2022 , 202
?telnet 命令:判斷端口是否存活
telnet 192.168.1.155 22輸出結(jié)果:是linux服務(wù)器
telnetlib 模塊:python模塊,python自帶
import telnetlib tm = telnetlib.Telnet(host='192.168.1.155',port='22',timeout=4) tm.read_until('\n',timeout=5) #執(zhí)行ip 端口掃描,遇到換行便結(jié)束# 返回結(jié)果: # 'SSH-2.0-OpenSSH_6.7p1 Raspbian-5+deb8u2\r\n'# 正則匹配,判斷是否為linux服務(wù)器 import re re.search('ssh',tm.read_until('\n',timeout=5)) # 如果為True ,則說明是linux服務(wù)器?
小結(jié):?
?
?
4、主機登錄探測?
?
使用一系列的驗證方式循環(huán)進(jìn)行SSH登錄,得到正確的登錄方式:
?
1)使用ssh登錄服務(wù)端:ssh -l root 192.168.1.155 -p 22? ,回車根據(jù)要求輸入密碼即可
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?
?找到如下內(nèi)容,確認(rèn)已啟用:
RSAAuthentication yes? ? ? ? ?# 開啟用戶賬號密碼登錄認(rèn)證
PubkeyAuthentication yes? ? # 開啟公鑰私鑰登錄認(rèn)證
? ②、給當(dāng)前用戶生成公鑰秘鑰
執(zhí)行指令:ssh-kengen
系統(tǒng)會自動為你生成公鑰/私鑰 兩個文件? ,放置的路徑:/home/用戶/.ssh/ 下 。 公鑰:id_rsa.pub , 私鑰:id_rsa
? ?如果出現(xiàn):Enter passphrase(empty…)(輸入加密串),可以不用理,直接回車
? ?③、重命名或copy公鑰文件:
? mv id_rsa.pub authorized_keys? # 重命名 ,必須命名為authorized_keys ,配置文件sshd_config中指定的 ,authorized_keys文件必須放在公鑰的位置(home/用戶/.ssh)
? ?④、確保公鑰文件權(quán)限600(rwx -111:7)
chmod 600?authorized_keys
? ?⑤、將私鑰copy到自己的客戶端
如果是linux,則放到home/用戶/.ssh 路徑下
?
5、pexpect和paramiko模塊?
1)pexpect
①、安裝:pip install pexpect
②、pexpect 的 run() 函數(shù):
直接執(zhí)行命令返回結(jié)果和狀態(tài)
import pexpectpexpect.run("ls /tmp") # 直接執(zhí)行命令,打印 tmp目錄下的文件 pexpect.run("ls /tmp",withexitstatua=1) #打印的數(shù)據(jù)末尾有個數(shù)字,‘0’代表成功,‘1’代表執(zhí)行失敗? ③、pexpect的spawn類
啟動子程序,用豐富的方法實現(xiàn)對子程序的控制:
? ? 類的實例化
緩沖區(qū)內(nèi)容匹配:正則匹配、pexpect.EOF、pexpect.TIMEOUT(正則表達(dá)式中的$符號在pexpect中只代表$符號,沒有其他意義。要表示結(jié)尾可以用:\r\n,代表行結(jié)束)
向子程序發(fā)送指令
腳本模擬ssh登錄
終端會話
?
import pexpect# chk = pexpect.spawn('ls -l /tmp/') # 實例化 ssh_k = pexpect.spawn('ssh root%127.0.0.1 -p22') # 實例化 ssh_k.expect('password:') # 緩沖區(qū)內(nèi)容匹配:實例化后執(zhí)行,匹配子程序的執(zhí)行情況,結(jié)果為0表示匹配成功?發(fā)送指令:
send() :默認(rèn)多加一個回車符,sendline沒有
sendline()
sendcontrol(char) :發(fā)送控制符
?
腳本模擬ssh登錄
- pexpect實現(xiàn)ssh的自動化 用戶密碼 登錄
- pexpect實現(xiàn)ssh的自動化 秘鑰 登錄
? 會話控制:
執(zhí)行腳本模擬ssh登錄時,登錄成功執(zhí)行了一個ssh.interact()方法,這個就是會話控制,模擬ssh登錄成功,進(jìn)入會話終端,可以進(jìn)行登錄服務(wù)器的終端操作
④、?pexpect模塊缺陷
?
?
2)paramiko
?一個基于python實現(xiàn)的SSH遠(yuǎn)程安全連接,用于SSH遠(yuǎn)程執(zhí)行命令、文件傳輸?shù)裙δ艿膕sh客戶端模塊
?paramiko參考:https://www.cnblogs.com/Eric15/articles/9185291.html
?①、安裝
pip install paramiko # 安裝?
?②、實現(xiàn)ssh 賬號密碼 登錄
import paramiko# 創(chuàng)建SSH對象 ssh = paramiko.SSHClient() # 允許連接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接服務(wù)器 ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', password='123')# 執(zhí)行命令 stdin, stdout, stderr = ssh.exec_command('df') # 獲取命令結(jié)果 stdin可以先遠(yuǎn)程服務(wù)端輸入指令(stdin.write(),stdout獲取遠(yuǎn)程機器輸出結(jié)果,stderr接收錯誤信息) result = stdout.read()# 關(guān)閉連接 ssh.close()?
? ③、實現(xiàn)ssh的密鑰登錄
import paramikoprivate_key = paramiko.RSAKey.from_private_key_file('/home/auto/.ssh/id_rsa')# 創(chuàng)建SSH對象 ssh = paramiko.SSHClient() # 允許連接不在know_hosts文件中的主機 ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) # 連接服務(wù)器 ssh.connect(hostname='c1.salt.com', port=22, username='wupeiqi', pkey=private_key)# 執(zhí)行命令 stdin, stdout, stderr = ssh.exec_command('df') # 獲取命令結(jié)果 result = stdout.read()# 關(guān)閉連接 ssh.close()?
? ⑤、paramiko的應(yīng)用和缺陷
?
6、通過操作系統(tǒng)獲取主機資產(chǎn)信息?
?1)如何通過登錄系統(tǒng)獲取信息
? ①、通過系統(tǒng)獲取哪些信息
?
②、為什么要獲取這些信息 (主機資產(chǎn)信息的重要性和探測對象)
- ?有利于識別資產(chǎn)設(shè)備
- 是資產(chǎn)的基本信息,是自動化平臺的基石
探測主機類型(探測對象):非docker容器的類型主機實體
③、獲取信息的linux命令介紹
1、主機資產(chǎn)(系統(tǒng)主機名、系統(tǒng)版本)獲取方式
系統(tǒng)主機名獲取:hostname 、 uname -a 、 cat /etc/sysconfig/network(最后一個命令,cat用于centos,不適用Ubuntu) 等
? ? 系統(tǒng)版本獲取:cat /etc/issue? 、 cat /etc/redhat-release 、 uname 、 lsb_release
? 2、主機資產(chǎn)(mac地址信息)獲取
? linux系統(tǒng):cat /sys/class/net/eht0/adress 、 ifconfig eth0 、 ip a
ESXI:esxcfg-vmknic -l
應(yīng)用:
linux:cat /sys/class/net/[^vtlsb]*/address
ESXI:esxcfg-vmknic -l|awk '{print $8}'|grep ':'
通用于不同的操作系統(tǒng):cat /sys/class/net/[^vtlsb]*/address||esxcfg-vmknic -l|awk '{print $8}'|grep ':'
? 3、主機資產(chǎn)(機器型號、sn序列號)獲取
? 獲取機器型號:dmidecode -s system-manufacturer 、 dmidecode -s system-product-name
? 獲取sn序列號:dmidecode -s system-serial-number
?
7、yaml工程的配置文件讀取
? 配置文件讀取:yaml模塊
? 是一種直觀的能夠被電腦識別的數(shù)據(jù)序列化格式,類似于xml。由于易于被解析,應(yīng)用于工程中作程序讀取的配置文件
? 安裝:pip install PyYAML
使用:
import yamlmyconf = yaml.load(file('conf/scanhosts.yaml')) print(myconf['hostsinfo']['nets']) # 結(jié)果:[192.168.1]?
轉(zhuǎn)載于:https://www.cnblogs.com/Eric15/articles/9795725.html
《新程序員》:云原生和全面數(shù)字化實踐50位技術(shù)專家共同創(chuàng)作,文字、視頻、音頻交互閱讀總結(jié)
以上是生活随笔為你收集整理的Python+Django+Ansible Playbook自动化运维项目实战(二)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 转载:left join和left se
- 下一篇: vs code中使用Astyle排版C/