Python 運維

1.python解釋器提供提供的小工具html

1.1 一秒鐘啓動一個下載服務器
  進入要下載文件的目錄(shift+鼠標右鍵能夠很快的在當前目錄打開一個cmd)
  python2:  python2 -m SimpleHTTPServer   (python2中的模塊,在python3中已經整合到http.server模塊中)
  python3:  python -m http.server
  
  其原理是打開了一個python中內置的web服務器,相似於FTP,默認端口爲8000,若是存在index.html則會打開此文件,若是不存在則顯示當前目錄下的文件列表

1.2 快速轉化json字符串爲json對象(linux系統中)
  $ echo '{"links":[{"name":"Google","url":"http://www.google.com"},{"name":"Baidu","url":"http://www.baidu.com"}]}' | python -m json.tool

1.3 檢查第三方庫是否正確安裝
   使用import paramiko
   批量檢查:python -c "import paramiko"

2.python中pip高級用法python

2.1 pip介紹
  pip是最流行的包管理工具。
    pip功能強大,支持安裝和卸載,期對手easy_install則只支持安裝,pip能夠很好的支持虛擬環境,能夠經過requirements.txt集中管理依賴,可以處理二進制格式(.whl),pip是先下載後安裝,若是安裝失敗,也會清理乾淨
  python2中是pip,python3中是pip3
2.2 pip經常使用命令
  升級
    pip install -U pip
  查找安裝包
    pip search paramiko
  安裝特定版本的包
    pip install paramiko==0.2.8
  刪除安裝包
    pip uninstall paramiko
  查看安裝包信息
    pip show paramiko
  查看安裝包的依賴是否完整
    pip check paramiko
  查看已安裝包的列表
    pip list
  處處系統已安裝包的列表到requirements文件 能夠到其餘服務器上直接安裝軟件
    pip freeze > d:\requirements.txt
  從requirements文件中安裝
    pip install -r requirements.txt
  使用pip補全
    pip completion --bash >> ~/.profile
    $source ~/.profile

2.3 pip加速安裝技巧
  pip的下載地址是在pypi.python.org,有點餓時候特別慢,也不穩定,若是要使用國內第三方的源,就能提升下載速度,只須要在下載的時候添加-i參數便可
    pip install -i http://pypi.douban.com/simple/ paramiko

  也能夠將軟件下載到本地部署,經過這中下載會將軟件的全部依賴包也下載到本地(離線下載的時二進制包)
    pip install --download=="test" -r requirements.txt 從requirements.txt中下載包到test下
  本地安裝
    pip install --no-index -f(-find-links) file://'test' -r requirements.txt
  
     

 3.python的工做環境linux

pyenv:用於管理不一樣的python的版本
virtualenv:用於管理不一樣的工做環境

4.python os,sys模塊(跨平臺)git

 判斷一個文件是否存在,若是不存在,則提示,若是存在,則判斷文件是否可讀github

import sys                                           #導入模塊
import os
def test():
    sys.argv.append(" ")                              #向argv列表中添加一個空元素,若是在執行時忘記添加參數,而又沒有第一個元素的話,程序會報錯
    filename = sys.argv[1]                           #將argv中的下標爲1的元素賦值給filename
    if not os.path.isfile(filename):                 #經過os模塊中path子模塊中的isfile判斷文件是否存在
        raise SystemExit(filename + '  不存在哦')     #若是不存在,則打印文件不存在
    elif not os.access(filename,os.R_OK):            #若是存在的話則經過os模塊的access子模塊判斷是否可讀
        raise SystemExit(filename + '  不能夠讀寫')    #若是可讀,則打印危機愛你能夠讀寫
    else:
        print (filename + '  能夠讀寫')
if __name__ == '__main__': test()

執行結果
E:\python 20>python json.py json.py
  ['json.py', 'json.py'] #是打印argv列表元素
  json.py 能夠讀寫

sys.argv:是sys庫下面的列表,該列表保存了全部的命令行參數,其中下標爲0的元素是執行文件的名字,其他的參數已字符串的形式保存在該列表中
      此列表能夠從終端接收無數個參數,而存放在列表當中,若是沒有第一個參數的話,程序會報錯,而沒法執行,因此在argv中添加一個空元素,當
python json.py test.txt有參數的時候,test.txt就成了argv的第一個元素
os.path.isfile(filename):判斷文件是否存在
os.access(path,mode):判斷文件是否可讀
raise:python中的異常處理,當程序出現錯誤,python會自動引起異常,也能夠經過raise顯示地引起異常。一旦執行了raise語句,raise後面的語句將不能執行

 python使用stdin和fileinput讀取標準輸入web

從所周知,shell腳本有一個全部語言都沒有的有點,那就是管道,經過管道符,咱們可使用多個簡單的命令來實現一個複雜的功能。
所以,咱們但願在Python中使用管道來結合Python語言和shell語言的優點(經過管道來將shell語言和Python語言一塊兒使用

在Python標準庫sys中有三個文件描述符分別是:stdin(標準輸入 0,指的是經過<或者|來傳遞數據),stdout(標準輸出 1),stderr(標準錯誤 2)。經過標準輸入結合管道,就不須要經過open()函數來打開文件了。

1.使用sys庫中的stdin讀取內容(linux中的標準輸入)
  windows
  建立 tes_sys_stdin.py文件
     import sys
     name = sys.stdin.readline()
     print (name)

  linux:

  建立 test_sys_stdin.py文件
    import sys
    for line in sys.stdin():
    print (line)
    執行test_sys_stdin.py文件:
      cat /etc/passwd | python test_sys_stdin.py
      python test_sys_stdin.py < /etc/passwd
  也能夠經過stdin.readlines()函數將標準輸入的內容讀取到一個列表裏面

   sys.stdin.readline( )會將標準輸入所有獲取,包括末尾的'\n',所以用len計算長度時是把換行符'\n'算進去了的,可是input( )獲取輸入時返回的結果是不包含末尾的換行符'\n'的。
   所以若是在平時使用sys.stdin.readline( )獲取輸入的話,不要忘了去掉末尾的換行符.
   能夠用strip( )函數(sys.stdin.readline( ).strip('\n'))或sys.stdin.readline( )[:-1]這兩種方法去掉換行。shell

2.使用fileinput標準庫讀取內容(普通的讀取文件)
  fileinput()能夠進行多文件的處理,使用fileinput能夠讀取命令行給出的多個文件,也就是說fileinput會便利argv[1:]列表,並按行一次讀取列表中的文件,若是該列表爲空,則fileinput默認讀取標準輸入的內容
  建立sys_fileinput.py文件

  windows:
    import fileinput
    for line in fileinput.input(files=('123','456')): #讀取文件
      print(line)
  linux:
    import fileinput
    for line in fielinput.input():
      print (line)
    執行方法:
      cat /etc/passwd |python sys_fileinput.py
      python sys_fileinput.py /etc/passwd
      python sys_fileinput.py /etc/passwd /etc/hosts
  
fileinput()方法:
    print (fileinput.filename()) #當前正在讀取的文件名
    print (fileinput.fileno()) #文件描述符
    print (fileinput.filelineno()) #正在讀取的行是當前文件的第幾行
    print (fileinput.isfirstline()) #正在讀取的行是不是當前文件的第一行
    print (fileinput.isstdin()) #正在讀取文件仍是直接從標準輸入中讀取內容

3.使用stdout和stderr向標準輸出和標準錯誤中輸入信息
  import os
  sys.stdout.write("標準輸出") 等價於 print('標準輸出')
  sys.stderr.write("標準錯誤")

  在python中調用print時,事實上調用了sys.stdout.write(obj+'\n')
  print 將須要的內容打印到控制檯,而後追加一個換行符。數據庫

 5.使用getpass讀取密碼編程

import getpass
user = getpass.getuser()                     #linux/windows獲取到的用戶都是當前用戶
passwd = getpass.getpass('your password:')   #用戶輸入的密碼不在控制檯上顯示,可是pycharm有個小bug,不能實現這個函數
print (user,passwd)

6.python管理Linux系統(os,sys標準庫進階,跨平臺)json

在管理Linux系統不少狀況下就是在對文件進行管理,這是由於UNIX及其衍生物Linux中:一切都被看做是文件!!
如:普通文件,硬盤,sockect接口,連接符號,命名管道,甚至目錄都被當作是一個文件,檔把全部東西都當作是文件之後,一個顯著的優勢就是:能夠在輸入和輸出資源上使用同一組Linux工具,程序和Api。

1.文件讀寫
    文件能夠從多個維度進行管理:文件重命名,獲取文件屬性,判斷文件是否存在,備份文件,讀寫文件,打包解壓等等。
    在python讀取文件只須要經過內置函數open來打開文件便可,open函數接受文件名稱和打開模式做爲參數,返回一個文件對象,操做完文件以後,經過文件對象的close方法關閉便可
    info = open('456',encoding='utf-8') #要加上編碼方式,讀取到info文件對象裏面
    print(info.read()) #經過info文件對象的read方法讀取文件的全部內容,並打印
    info.close() #關閉這個文件對象
    
    open函數默認以"r"的方式打開,也能夠知道那個文件的打開模式
      r:默認以讀的方式打開,若是文件不存在,拋出FileFoundError異常
      w:以寫模式打開,若是文件非空,則已有的內容將會被覆蓋,若是文件不存在,將建立文件並寫入
      a:在文件末尾追加數據的方式寫入
      x:建立一個新文件,若是文件存在,則拋出FileExisError異常
      r+:可讀寫文件。可讀;可寫;可追加
      w+:寫讀
      U:表示在讀取時,能夠將\r\n自動轉換成 \n (與 r 或 r+ 模式同使用, rU或者r+U)
      b:表示處理二進制文件(如:FTP發送上傳ISO鏡像文件,linux可忽略,windows處理二進制文件時需標註)
    
    open函數的其餘方法
      info.close() #關閉文件
      info.flush() #刷新緩衝區,將緩衝區的數據當即寫入到文件
      info.isatty() #判斷文件是否鏈接到終端設備,返回bool值
      info.read(10) #讀取文件前10個字符,從文件中讀取指定的字符數,默認讀取所有
      info.readline(3)) #讀取前3個字符,默認每次最多讀取一行數據,每行的最後包含換行符'\n'
      info.readlines() #將文件存入到列表中,列表中的麼一行就是文件中的每一行
      info.readable #判斷文件是否可讀,返回布爾值
      info.seek(3) #移動文件讀取的指針,若是文件中包含中文,移動指針必須是3的倍數,否則會報錯,由於一箇中文字符等於3個字節
      info.seekable #判斷文件指針是否可用,返回布爾值
      info.tell() #獲取指針位置
      info.truncate() #截斷,把指針後面的內容刪除,並寫入文件,要在可寫模式下操做
        f = open('text.txt','r+',encoding='utf-8')
        f.seek(9) #把指針移動到第9個字節後面(即第3箇中文後面)
        f.truncate() #把第3箇中文後面的字符刪除,並寫入文件
        f.close()
      info.writable() #判斷文件是否可寫,返回布爾值
      info.write() #把字符串寫入文件,並返回字符數
      info.writelines() #寫一個字符串列表到文件    

    在計算機中,每打開一個文件就須要佔用一個文件句柄,而一個進程擁有的文件句柄是有限的,而且文件句柄也會佔用操做系統的資源,因此,在打開文件之後要及時關閉文件,避免文件句柄泄露
      1.可使用finally關閉文件句柄,而且在什麼狀況是都會關閉(可是不提倡,由於python提倡優美,簡潔)
        try:
          info = open("test.txt",encoding='utf-8')
          peint(info)
        finally:
          info.close()
      2.使用上下文管理器(會打開文件,而後自動關閉,不用close函數)
        with open('data.txt',encoding='utf-8') as info:
          print(info.read())

    如何讀取大文件?
       使用上下文管理器和for循環,由於for循環不只能夠遍歷如字符串,列表,元祖等可迭代序列,還可使用可迭代協議來便利迭代對象,文件對象就實現了可迭代協議
        with open('data',encoding='utf-8') as info:
          for line in info:
            print(line.upper())

    使用print語句也能夠將數據寫入到文件
      with open ("456","a+",encoding="utf-8") as info:
        print(1,2,'hello,world',sep='\n',file=info)

 2.文件與文件路徑管理
   
 python標準庫中的os模塊對操做系統的api進行了封裝,而且使用同一個api接口來管理不一樣的操做系統的相同功能。
    os模塊包含與操做系統的系統環境,系統變量,系統文件,用戶數據庫以及權限進行交換的函數
    2.1 os模塊
      os模塊中包含兩個比較經常使用的函數
        os.getcwd() #獲取當前絕對路徑
        os.listdir() #列出當前目錄下的文件和文件夾
    2.2 os.path詳解
(用來對文件和文件路徑進行管理)
      拆分路徑
        os.path.split()   #返回一個二元組,包含文件路徑和文件名
        os.path.dirname() #返回文件的路徑
        os.path.basename() #返回文件名
        os.path.splitext() #返回一個去處擴展名部分和擴展名的二元組
          
import os
          path = "/root/p0st/h/error.log"
          print(os.path.split(path)) --->('/root/p0st/h', 'error.log')
          print(os.path.dirname(path)) --->/root/p0st/h
          print(os.path.basename(path)) --->error.log
          print(os.path.splitext(path)) --->('/root/p0st/h/error', '.log')
      構建路徑
     
   os.path.expanduser('~')#返回當前輸入用戶的家目錄,必須得加~或~adm等指定用戶
        os.path.abspath() #返回文件或路徑的絕對路徑
        os.path.path() #根據不一樣的操做系統,使用不一樣的路徑分隔符拼接路徑
          import os
          print(os.path.expanduser('~adm')) --->/var/adm
          print(os.path.abspath('456')) --->E:\oldboy\python 20\456
          print(os.path.join(os.path.expanduser('~'),'123','456.txt')) --->/var/adm/123/456.txt

        判斷一個路徑是否爲絕對路徑
          import os
          os.path.isabs(os.path.join(os.path.expanduser('~adm'),'123','456.txt')) --->True

        查看當前文件名字須要使用__file__這個特殊變量:當前代碼所在的源文件
          import os
          path = os.path.abspath(__file__)
          print(path) --->/var/adm/123/456.py
          print(os.path.abspath(os.path.join(os.path.dirname(path),os.path.pardir))) -->/var
        獲取文件屬性和判斷文件類型
          
import os
          path= os.path.abspath(__file__)
          print(os.path.getatime(path)) #獲取當前文件的訪問時間
          print(os.path.getctime(path)) #獲取當前文件的建立時間
          print(os.path.getmtime(path)) #獲取當前文件的修改時間
          print(os.path.getsize(path)) #獲取當前文件的大小
          print(os.path.exists(path))              #判斷當前路徑是否存在
          print(os.path.isfile(path)) #參數所指的路徑存在,而且是一個文件
          print(os.path.isdir(path)) #參數所所指的路徑存在,而且是一個目錄
          print(os.path.islink(path)) #。。。。。。。而且是一個連接
          print(os.path.ismount(path)) #。。。。。。。而且是一個掛載點

        使用os模塊管理文件和目錄
          os.remove(path)/unlink(path): 刪除path所指的文件
          os.rmdir(path)/removedirs(path) : 刪除path所指向的目錄,該文件夾必須爲空,不然報錯。
          os.mkdir(path):建立一個文件夾
          os.rename('olddir','newdir'):修改一個文件夾的名字
        
        使用os模塊來修改和判斷文件權限
          os.chmod(filename,0777) #修改文件權限
          os.access(filename,os.R_OK)#判斷文件權限---> os.R_OK:是否可讀, os.W_OK:是否可寫, os.X_OK:是否可執行
          
        
"""
經過命令行讀取文件名稱,若是文件存在,則查看是否能執行,不能的話修改權限爲777,若是可執行的話就打印輸出文件內容,若是文件不在,則提示文不存在
"""
# _*_ encoding:utf-8 _*_
import os
import sys

sys.argv.append('')
file_name = sys.argv[1]
def read_file():
    if not os.path.isfile(file_name):
        raise SystemExit(file_name + " 文件不存在")
    elif os.access(file_name,os.X_OK):
        with open(file_name) as info:
            print(info.read())
    else:
        os.chmod(file_name,0777)
        print("已修改成0777")    
if __name__ == '__main__':
    read_file()
列子一
"""
打印最經常使用的十條linux命令
"""
#_*_ encoding:utf-8 _*_
import os
from collections import Counter

c = Counter()
with open(os.path.expanduser('~/.bash_history')) as cmd_info:
for line in cmd_info:
cmd = line.strip().split()
if cmd:
c[cmd[0]]+=1
print(c.most_common(10))
列子二

 7.python運維經常使用模塊

一、psutil是一個跨平臺庫(https://github.com/giampaolo/psutil)
可以實現獲取系統運行的進程和系統利用率(內存,CPU,磁盤,網絡等),主要用於系統監控,分析和系統資源及進程的管理。

二、IPy(http://github.com/haypo/python-ipy),輔助IP規劃。

三、dnspython(http://dnspython.org)Python實現的一個DNS工具包。

4、difflib:difflib做爲Python的標準模塊,無需安裝,做用是對比文本之間的差別。

5、filecmp:系統自帶,能夠實現文件,目錄,遍歷子目錄的差別,對比功能。

6、smtplib:發送電子郵件模塊

七、pycurl(http://pycurl.sourceforge.net)是一個用C語言寫的libcurl Python實現,功能強大,支持的協議有:FTP,HTTP,HTTPS,TELNET等,能夠理解爲Linux下curl命令功能的Python封裝。(PS:PycURL在前幾天的文章裏有說起過)

8、XlsxWriter:操做Excel工做表的文字,數字,公式,圖表等。

9、rrdtool:用於跟蹤對象的變化,生成這些變化的走走勢圖

十、scapy(http://www.wecdev.org/projects/scapy/)是一個強大的交互式數據包處理程序,它可以對數據包進行僞造或解包,包括髮送數據包,包嗅探,應答和反饋等功能。

11、Clam Antivirus免費開放源代碼防毒軟件,pyClamad,可讓Python模塊直接使用ClamAV病毒掃描守護進程calmd。

12、pexpect:能夠理解成Linux下expect的Python封裝,經過pexpect咱們能夠實現對ssh,ftp,passwd,telnet等命令行進行自動交互,而無需人工干涉來達到自動化的目的。

1三、paramiko是基於Python實現的SSH2遠程安裝鏈接,支持認證及密鑰方式。能夠實現遠程命令執行,文件傳輸,中間SSH代理等功能。相對於Pexpect,封裝的層次更高,更貼近SSH協議的功能,官網地址:http://paramiko.org(依賴:Crypto,Ecdsa,Python開發包python-devel)

1四、fabric是基於Python實現的SSH命令行工具,簡化了SSH的應用程序部署及系統管理任務,它提供了系統基礎的操做組件,能夠實現本地或遠程shell命令,包括命令執行,文件上傳,下載及完整執行日誌輸出等功能。Fabric在paramiko的基礎上作了更高一層的封裝,操做起來更加簡單。官網地址:http://www.fabfile.org(依賴setuptools,Crypto,paramiko包支持)

15、CGIHTTPRequestHandler實現對CGI的支持。

1六、ansible(http://www.ansibleworks.com/)一種集成IT系統的配置管理,應用部署,執行特定任務的開源平臺。基於Python實現,由Paramiko和PyYAML兩個關鍵模塊構建。Ansibl與Saltstack最大的區別是Ansible無需在被控主機上部署任何客戶端,默認直接經過SSH通道進行遠程命令執行或下發功能。

17、YAML:是一種用來表達數據序列的編程語言。

18、playbook:一個很是簡單的配置管理和多主機部署系統。

1九、saltstack(http://saltstack.com)是一個服務器基礎架構集中化管理平臺,通常能夠理解爲簡化版的puppet和增強版的func。Saltstack基於Python語言實現,結合輕量級消息隊列ZeroMQ,與Python每三方模塊(Pyzmq,PyCrypto,Pyjinja2,python-msgpack和PyYAML等)構建。

20、func,爲解決集羣管理,監控問題需設計開發的系統管理基礎框架。
View Code

 8.python分佈式框架

Celery - 分佈式任務隊列

 

 

 

 

 

web

相關文章
相關標籤/搜索