Python3自動化運維之Fabric模版詳解
一、概要
Fabric是基於Python(2.7,3.4+以上版本)實現的SSH命令列工具,簡化了SSH的應用程式部署及系統管理任務,它提供了系統基礎的操作元件,可以實現本地或遠端shell命令,包括命令執行、檔案上傳、下載及完整執行日誌輸出等功能。Fabric在paramiko的基礎上做了更高一層的封裝,操作起來會更加簡單。 Fabric官網地址為:http://www.fabfile.org/。
二、Fabric安裝
Mac os及CentOS 安裝
pip3 install fabric3
Ubuntu安裝
[email protected]virtual-machine:~$ python --version Python 3.6.5 [email protected]-virtual-machine:~$ pip3 install fabric3
詳細請參閱官方文件
三、官方提供了一個簡單的入門例項
#!/usr/bin/env python from fabric.api import run
#定義一個任務函式,通過run方法實現遠端執行"uname -s"命令 def host_type(): run('uname -s')
執行結果
[email protected]virtual-machine:~/devops$ fab -H localhost host_type [localhost] Executing task 'host_type' [localhost] run: uname -s [localhost] Login password for 'devops': [localhost] out: Linux [localhost] out: Done. Disconnecting from localhost... done.
其中,fab命令引用檔名fabfile.py,如果使用非預設檔名稱,則需要通過"-f"來指定,示例:
fab -H localhost -f host_type.py host_type
如果目標主機未配置金鑰認證信任,將會提示輸入目標主機對應賬號登入密碼。
四、fab常用引數
fab作為Fabric程式的命令列入口,提供了豐富的引數呼叫,命令格式如下:
fab [options] <command>[:arg1,arg2-val2,host=foo,host='h1;h2'...]...
常用引數介紹。更多引數可使用fab -help檢視。
- -l:顯示定義好的任務函式名;
[email protected]virtual-machine:~/devops$ fab -l Available commands: host_type
- -f:指定fab入口檔案,預設入口檔名為fabfile.py;
- -g:指定閘道器(中轉)裝置,比如堡壘機環境,填寫堡壘機IP即可;
- -H:指定目標主機,多型主機用","號分隔;
- -P:以非同步並行方式執行多主機任務,預設為序列執行;
- -R:指定role(角色),以角色名區分不同業務組裝置;
- -t:設定裝置連線超時時間(秒);
- -T:設定遠端主機命令執行超時時間(秒);
- -w:當命令執行失敗,發出警告,而非預設中止任務。
直接使用命令列執行遠端操作,示例:
[email protected]virtual-machine:~/devops$ fab -p 1234567 -H localhost -- 'uname -s' [localhost] Executing task '<remainder>' [localhost] run: uname -s [localhost] out: Linux [localhost] out: Done. Disconnecting from localhost... done.
五、fabfile的編寫
fab命令好似結合我們編寫的fabfile.py(其它檔名必須新增-f filename應用)來搭配使用的,部分命令列引數可以通過相應的方法來替代,使之更加靈活,例如"-H 192.168.56.133,192.168.56.134",我們可以通過定義env.hosts來實現,如"env.hosts=['192.168.56.133,192.168.56.134']"。fabfile的主體由多個自定義的任務函式組成,不同任務實現不同的操作邏輯。
全域性屬性設定
env物件的作用是定義fabfile的全域性設定,支援多個屬性,包含目標主機、使用者名稱、密碼、等角色,各屬性說明如下:
- evn.host:定義目標主機,可以用IP或主機名錶示,以Python的列表形式定義,如evn.hosts['192.168.56.133','192.168.56.134']。
- env.exclude_hosts:排除指定主機,如env.exclude_hosts=['192.168.56.133']。
- env.user:定義使用者名稱,如env.user="root"。
- env.port:定義目標主機埠,預設為22,如env.port="22"。
- env.password:定義密碼,如env.password='1234567'。
- env.passwords:與password功能一樣,區別在於不同主機不同密碼的應用場景,需要注意的是,配置passwords是需配置使用者、主機、埠等資訊,如:
env.passwords = { '[email protected]:22':'1234567', '[email protected]:22':'1234567', '[email protected]:22':'1234567', '[email protected]:22':'1234567' }
- env.gateway:定義閘道器(中轉、堡壘機)IP,如env.gateway = '192.168.56.1'。
- env.deploy_release_dir:自定義全域性變數,格式:env.+"變數名稱",如env.deploy_release_dir、env.age、env.sex等。
- env.roledefs:定義角色分組,比如web組與db組主機區分開來,定義如下:
env.roledefs = { 'webservers':['192.168.56.131','192.168.56.132','192.168.56.133'], 'dbserver':['192.168.56.134','192.168.56.135'] }
引用時使用Python修飾符的形式進行,角色修飾符下面的任務函式為其作用域,下面來看一個示例:
@roles('webservers') def webtask(): run('/etc/init.d/nginx start') @roles('dbservers') def dbtask(): run('/etc/init.d/mysql start') @roles('webservers','dbservers') def pubclitasj(): run('uptime') def deploy(): execute(webtask) execute(dbtask) execute(pubclitask)
在命令執行fab deploy就可以實現不同角色執行不同的任務函數了。
常用API
Fabric提供了一組簡單但功能強大的fabric.api命令集,簡單地呼叫這些API就能完成大部分應用場景需求。Fabric常用方法及說明如下:
- local:執行本地命令,如:local('uname -s');
- lcd:切換本地目錄,如:lcd('/home');
- cd:切換遠端目錄,如:cd('/data/logs');
- run:執行遠端命令,如:run('free -m');
- sudo:sudo方式執行遠端命令,如:sudo('/etc/init.d/httpd start');
- put:上傳本地檔案到遠端主機,如:put('/home/user.info','/data/user.info');
- prompt:獲得使用者輸入資訊,如:prompt('please input user password:');
- confirm:獲得提示資訊確認,如:confirm("Tests failed. Continue[Y/N]?");
- reboot:重啟遠端主機,如:reboot();
- @task:函式修飾符,標識的函式為fab可呼叫的,非標記對fab不可見,純業務邏輯;
- runs_once:函式修復符,標識的函式只會執行一次,不受多臺主機影響。
六、示例一:檢視本地與遠端主機資訊
檢視本地資訊
本示例呼叫local()方法執行本地(主控端)命令,新增"@runs_once"修飾符保證該任務函式只執行一次。呼叫run()方法執行遠端命令。
[email protected]virtual-machine:~/devops$ pwd /home/devops/devops [email protected]-virtual-machine:~/devops$ cat simple1.py #!/usr/bin/env python from fabric.api import * env.user = 'devops' env.hosts = ['localhost'] env.password = '1234567' @runs_once #檢視本地系統資訊,當有多臺主機時只執行一次 def local_task(): #本地任務函式 local("uname -a")
通過fab命令呼叫local_task任務函式執行結果如下:
[email protected]virtual-machine:~/devops$ fab -f simple1.py local_task [localhost] Executing task 'local_task' [localhost] local: uname -a Linux devops-virtual-machine 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux Done.
檢視遠端主機資訊
[email protected]virtual-machine:~/devops$ cat simple2.py #!/usr/bin/env python from fabric.api import * env.user = 'root' env.hosts = ['192.168.56.11'] env.password = '1234567' def remote_task(): with cd('/root'): #"with"的作用是讓後面的表示式的語句繼承當前狀態,實現"cd /root/ && ls -l'的效果 run('ls -l')
呼叫remote_task任務函式執行結果如下:
[email protected]virtual-machine:~/devops$ fab -f simple2.py remote_task [192.168.56.11] Executing task 'remote_task' [192.168.56.11] run: ls -l [192.168.56.11] out: total 4 [192.168.56.11] out: -rw-------. 1 root root 1273 May 29 11:47 anaconda-ks.cfg [192.168.56.11] out: Done. Disconnecting from 192.168.56.11... done.
七、示例二:動態獲取遠端目錄列表
本示例使用"@task'修復符標誌入口函式go()對外部可見,配合"@runs_once"修飾符接受使用者輸入,最後呼叫worktask()任務函式實現遠端命令執行。
[email protected]virtual-machine:~/devops$ cat simple3.py #!/usr/bin/env python from fabric.api import * env.user = 'root' env.hosts = ['192.168.56.11','192.168.56.12'] env.password = '1234567' @runs_once #主機遍歷過程中,只有第一臺觸發此函式 def input_raw(): return prompt("Please input directory name:",default="/home") def worktask(dirname): run("ls -l "+dirname) @task #限定只有go函式對fab命令可見 def go(): getdirname = input_raw() worktask(getdirname)
該示例實現了一個動態輸入遠端目錄名稱,再獲取目錄列表的功能,由於我們只要求輸入一次,在顯示所有主機上該目錄的列表資訊,呼叫一個子函式input_raw()同時配置@runs_once修復符來達到此目的。
執行結果如下:
[email protected]virtual-machine:~/devops$ fab -f simple3.py go [192.168.56.11] Executing task 'go' Please input directory name: [/home] /root [192.168.56.11] run: ls -l /root [192.168.56.11] out: total 4 [192.168.56.11] out: -rw-------. 1 root root 1273 May 29 11:47 anaconda-ks.cfg [192.168.56.11] out: [192.168.56.12] Executing task 'go' [192.168.56.12] run: ls -l /root [192.168.56.12] out: total 4 [192.168.56.12] out: -rw-------. 1 root root 1273 May 29 11:59 anaconda-ks.cfg [192.168.56.12] out: Done. Disconnecting from 192.168.56.11... done. Disconnecting from 192.168.56.12... done.
八、示例三:閘道器模式檔案上傳與執行
本示例通過Fabric的env物件定義閘道器模式,即俗稱的中轉、堡壘機環境。定義格式為"env.gateway='192.168.56.11'",其中IP“192.168.56.11”為堡壘機IP,再結合任務韓素實現目標主機檔案上傳與執行的操作。
[email protected]virtual-machine:/home/install$ cat /home/devops/devops/simple4.py #!/usr/bin/env python from fabric.api import * from fabric.context_managers import * from fabric.contrib.console import confirm env.user = 'root' env.gateway = '192.168.56.11' #定義堡壘機IP,作為檔案上傳、執行的中轉裝置 env.hosts = ['192.168.56.12','192.168.56.13'] env.passwords = { '[email protected]:22':'1234567', #堡壘機賬號資訊 '[email protected]:22':'1234567', '[email protected]:22':'1234567' } l_pack_path = "/home/install/nginx-1.6.3.tar.gz" #本地安裝包路徑 r_pack_path = "/tmp/install" #遠端安裝包路徑 @task def put_task(): run("mkdir -p /tmp/install") with settings(warn_only=True): result = put(l_pack_path,r_pack_path) #上傳安裝包 if result.failed and not confirm("put file failed, Continue[Y/N]?"): abort("Aborint file put task!") @task def run_task(): #執行遠端命令,安裝nginx with cd(r_pack_path): run("tar -xvf nginx-1.6.3.tar.gz") with cd("nginx-1.6.3/"): #使用with繼續繼承/tmp/install目錄位置狀態 run("./nginx_install.sh") @task def go(): #上傳、安裝 put_task() run_task()
執行命令fab -f simple4.py go。執行結果如下:
[email protected]virtual-machine:~/devops$ fab -f simple4.py go [192.168.56.12] Executing task 'go' [192.168.56.12] run: mkdir -p /tmp/install [192.168.56.12] put: /home/install/nginx-1.6.3.tar.gz -> /tmp/install/nginx-1.6.3.tar.gz [192.168.56.12] run: tar -xvf nginx-1.6.3.tar.gz ..... ..... ..... [192.168.56.12] out: cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf.default' [192.168.56.12] out: test -d '/usr/local/nginx/logs' || mkdir -p '/usr/local/nginx/logs' [192.168.56.12] out: test -d '/usr/local/nginx/logs' || mkdir -p '/usr/local/nginx/logs' [192.168.56.12] out: test -d '/usr/local/nginx/html' || cp -R html '/usr/local/nginx' [192.168.56.12] out: test -d '/usr/local/nginx/logs' || mkdir -p '/usr/local/nginx/logs' [192.168.56.12] out: make[1]: Leaving directory `/tmp/install/nginx-1.6.3' [192.168.56.12] out: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok [192.168.56.12] out: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [192.168.56.12] out: [192.168.56.13] Executing task 'go' [192.168.56.13] run: mkdir -p /tmp/install [192.168.56.13] put: /home/install/nginx-1.6.3.tar.gz -> /tmp/install/nginx-1.6.3.tar.gz [192.168.56.13] run: tar -xvf nginx-1.6.3.tar.gz .... .... .... [192.168.56.13] out: cp conf/nginx.conf '/usr/local/nginx/conf/nginx.conf.default' [192.168.56.13] out: test -d '/usr/local/nginx/logs' || mkdir -p '/usr/local/nginx/logs' [192.168.56.13] out: test -d '/usr/local/nginx/logs' || mkdir -p '/usr/local/nginx/logs' [192.168.56.13] out: test -d '/usr/local/nginx/html' || cp -R html '/usr/local/nginx' [192.168.56.13] out: test -d '/usr/local/nginx/logs' || mkdir -p '/usr/local/nginx/logs' [192.168.56.13] out: make[1]: Leaving directory `/tmp/install/nginx-1.6.3' [192.168.56.13] out: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok [192.168.56.13] out: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [192.168.56.13] out: Done. Disconnecting from 192.168.56.11... done. Disconnecting from 192.168.56.12... done. Disconnecting from 192.168.56.13... done.執行結果,預設為序列執行
執行命令fab -Pf simple4.py go。執行結果如下:
[email protected]virtual-machine:~/devops$ fab -Pf simple4.py go [192.168.56.12] Executing task 'go' [192.168.56.13] Executing task 'go' [192.168.56.12] run: mkdir -p /tmp/install [192.168.56.13] run: mkdir -p /tmp/install [192.168.56.12] put: /home/install/nginx-1.6.3.tar.gz -> /tmp/install/nginx-1.6.3.tar.gz [192.168.56.13] put: /home/install/nginx-1.6.3.tar.gz -> /tmp/install/nginx-1.6.3.tar.gz [192.168.56.12] run: tar -xvf nginx-1.6.3.tar.gz .... .... .... [192.168.56.12] out: nginx-1.6.3/html/index.html [192.168.56.12] out: nginx-1.6.3/README [192.168.56.12] out: nginx-1.6.3/nginx_install.sh [192.168.56.12] out: nginx-1.6.3/configure [192.168.56.12] out: [192.168.56.12] run: ./nginx_install.sh [192.168.56.13] run: tar -xvf nginx-1.6.3.tar.gz [192.168.56.13] out: nginx-1.6.3/ [192.168.56.13] out: nginx-1.6.3/src/ .... .... .... [192.168.56.12] out: make[1]: Leaving directory `/tmp/install/nginx-1.6.3' [192.168.56.12] out: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok [192.168.56.12] out: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [192.168.56.12] out: .... .... ... [192.168.56.13] out: make[1]: Leaving directory `/tmp/install/nginx-1.6.3' [192.168.56.13] out: nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok [192.168.56.13] out: nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful [192.168.56.13] out:加P引數該為非同步並行執行,執行結果
九、示例四:檔案打包、上傳與校驗
我們時常做一些檔案包分發的工作,實施步驟一般是先壓縮打包,在批量上傳至目標伺服器,最後做一致性校驗。本示例通過put()方法實現檔案的上傳,通過對比本地與遠端主機檔案的md5,最終實現檔案一致性校驗。
[email protected]virtual-machine:~/devops$ cat simple5.py #!/usr/bin/env python from fabric.api import * from fabric.context_managers import * from fabric.contrib.console import confirm env.user = 'root' env.hosts = ['192.168.56.12','192.168.56.13'] env.passwords = { '[email protected]:22':'1234567', '[email protected]:22':'1234567', } @runs_once def tar_task(): #本地打包任務函式,只執行一次 with lcd('/home/devops/devops'): local("tar -zcf devops.tar.gz *") @task def put_task(): #上傳檔案任務函式 run("mkdir -p /root/devops") with cd("/root/devops"): with settings(warn_only=True): #put(上傳)出現異常時繼續執行,非終止 result = put("/home/devops/devops/devops.tar.gz","/root/devops/devops.tar.gz") if result.failed and not confirm("put file failed.Continue[Y/N]?"): abort("Aborting file put task!") #出現異常時,確認使用者是否繼續,(Y繼續) @task def check_task(): #校驗檔案任務函式 with settings(warn_only=True): #本地local命令需要配置capture=True才能捕獲返回值 lmd5 = local("md5sum /home/devops/devops/devops.tar.gz",capture=True).split(' ')[0] rmd5 = run("md5sum /root/devops/devops.tar.gz").split(' ')[0] if lmd5 == rmd5: #對比本地及遠端檔案md5資訊 prompt("OK") else: prompt("ERROR") @task def go(): tar_task() put_task() check_task()
執行命令fab -f simple5.py go。執行結果如下:(提示此程式不支援-P引數並行執行、如需並行執行,程式需要做調整)
[email protected]virtual-machine:~/devops$ fab -f simple5.py go [192.168.56.12] Executing task 'go' [localhost] local: tar -zcf devops.tar.gz * [192.168.56.12] run: mkdir -p /root/devops [192.168.56.12] put: /home/devops/devops/devops.tar.gz -> /root/devops/devops.tar.gz [localhost] local: md5sum /home/devops/devops/devops.tar.gz [192.168.56.12] run: md5sum /root/devops/devops.tar.gz [192.168.56.12] out: a1cf2be82647cbed0d41514bd80373de /root/devops/devops.tar.gz [192.168.56.12] out: OK [192.168.56.13] Executing task 'go' [192.168.56.13] run: mkdir -p /root/devops [192.168.56.13] put: /home/devops/devops/devops.tar.gz -> /root/devops/devops.tar.gz [localhost] local: md5sum /home/devops/devops/devops.tar.gz [192.168.56.13] run: md5sum /root/devops/devops.tar.gz [192.168.56.13] out: a1cf2be82647cbed0d41514bd80373de /root/devops/devops.tar.gz [192.168.56.13] out: OK Done. Disconnecting from 192.168.56.12... done. Disconnecting from 192.168.56.13... done.
十、示例五:部署LNMP業務服務環境
本示例通過env.roledefs定義不同主機角色,在使用"@roles('webservers')"修復符繫結到對應的任務函式,實現不同角色主機的部署差異。
[email protected]virtual-machine:~/devops$ cat simple6.py #!/usr/bin/env python from fabric.colors import * from fabric.api import * env.user = 'root' env.roledefs = { 'webservers':['192.168.56.11','192.168.56.12'], 'dbservers':['192.168.56.13'] } env.passwords = { '[email protected]:22':'1234567', '[email protected]:22':'1234567', '[email protected]:22':'1234567', } @roles('webservers') #使用webtask任務函式引用'webservers'角色修復符 def webtask(): print(yellow('Install nginx php php-fpm...')) with settings(warn_only=True): run("yum -y install nginx") run("yum -y install php-fpm php-mysql php-mbstring php-xml php-mcrypt php-gd") run("chkconfig --levels 235 php-fpm on") run("chkconfig --levels 235 nginx on") @roles('dbservers') #dbtask任務函式引用'dbservers'角色修復符 def dbtask(): print(yellow("Install Mysql...")) with settings(warn_only=True): run("yum -y install mysql mysql-server") run("chkconfig --levels 235 mysqld on") @roles('webservers','dbservers') #publictask任務函式同時引用兩個角色修復符 def publictask(): #部署公共類環境,如epel、ntp等 print(yellow("Install epel ntp....")) with settings(warn_only=True): run("wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo") run("yum -y install ntp") def deploy(): execute(publictask) execute(webtask) execute(dbtask)
執行命令fab -Pf simple6.py deploy
[email protected]virtual-machine:~/devops$ fab -Pf simple6.py deploy [192.168.56.11] Executing task 'publictask' [192.168.56.12] Executing task 'publictask' [192.168.56.13] Executing task 'publictask' Install epel ntp.... [192.168.相關推薦
Python3自動化運維之Fabric模版詳解
一、概要 Fabric是基於Python(2.7,3.4+以上版本)實現的SSH命令列工具,簡化了SSH的應用程式部署及系統管理任務,它提供了系統基礎的操作元件,可以實現本地或遠端shell命令,包括命令執行、檔案上傳、下載及完整執行日誌輸出等功能。Fabric在paramiko的基礎上做了更高一層
python3自動化運維學習之路第一天
密文 必須 font ron ide alex 表示 乘法表 提示 概要:python簡介、第一個python程序、變量、字符編碼、用戶交互程序、if...else、while、for 一、python簡介 首先,我們普及一下編程語言的基礎知識。用任何編程語言來開發程序,都
走進自動化運維之Ansible服務部署,附帶(參數及模塊)詳解!
輸入 epel源 檢測 鏈接文件 日誌輸出 運維 介紹 講解 book 何為Ansible: 簡單的自動化運維管理工具,不需要配置代理工具,基於Python研發。 Ansible是基於模塊工作的,本身沒有批量部署的能力。真正具有批量部署的是ansible所運行的模塊,ans
Ansible自動化運維之Playbook詳解及體驗(二)
tasks ansible sha shadow yml ESS remote name 自動化運維 Handlers介紹: Handlers也是一些task的列表,和一般的task並沒有什麽區別。是由通知者進行的notify,如果沒有被notify,則Handlers
自動化運維之saltstack(二)states介紹及使用
配置文件 如何 states master 根目錄 一、什麽是Salt States?Salt States是Salt模塊的擴展,主系統使用的狀態系統叫SLS系統,SLS代表Saltstack State,Salt是一些狀態文件,其中包含有關如何配置Salt子節點的信息,這些狀態被存放在一
Python自動化運維之函數
python 函數 1、函數簡介簡而言之,函數就是將一些語句集中方在一起的部件,它能夠不止一次的在程序中運行。函數還能夠計算出一個返回值,並能夠改變作為函數輸入的參數,而這些參數在代碼運行時也許每次都不相同。以函數的形式去編寫一個操作可以使它成為一個能夠廣泛應用的工具,讓我們在不同的情形下都能夠使用它
遊戲運維的最佳實踐:搜狐暢遊自動化運維之旅!
運維 遊戲 搜狐暢遊 搜狐黎誌剛見證了暢遊遊戲自動化運維平臺的從無到有,通過在其中踩過的坑、解過的結,他向大家來闡述遊戲運維的進階之路。本文主要圍繞暢遊遊戲管理體系與運維自動化的演變歷程、運維自動化的實現及未來運維四方面展開。暢遊運維管理體系與運維自動化的演變歷程暢遊運維管理體系演變歷程從 200
Python自動化運維之函數進階
高階函數 閉包 生成器 叠代器1、函數嵌套函數的嵌套定義:在一個函數的內部,又定義了另外一個函數函數的嵌套調用:在調用一個函數的過程中,又調用了其他函數代碼: >>> def f1(): ... def f2(): ... print(‘from f2‘) ...
Python自動化運維之模塊與包的使用
模塊與包使用 import from...import... 一、模塊1、什麽是模塊?一個模塊就是一個包含了python定義和聲明的文件,文件名就是模塊名字加上.py的後綴。2、為何要使用模塊?如果你退出python解釋器然後重新進入,那麽你之前定義的函數或者變量都將丟失,因此我們通常將程序寫到文
Python自動化運維之常用模塊—logging
logging python 常用模塊 日誌模塊 在現實生活中,記錄日誌非常重要。銀行轉賬時會有轉賬記錄;如果有出現什麽問題,人們可以通過日誌數據來搞清楚到底發生了什麽。 對於系統開發、調試以及運行,記錄日誌都是同樣的重要。如果沒有日誌記錄,程序崩潰時你幾乎就沒辦法弄明白到底發生
Python自動化運維之常用模塊-re
正則 re python 常用模塊 1、簡介 正則表達式本身是一種小型的、高度專業化的編程語言,而在python中,通過內嵌集成re模塊,程序媛們可以直接調用來實現正則匹配。正則表達式模式被編譯成一系列的字節碼,然後由用C編寫的匹配引擎執行。2、正則表達式中常用的字符含義2.1 普通字符
(轉)Python自動化運維之13、異常處理及反射(__import__,getattr,hasattr,setattr)
邏輯 斷言 函數 typeerror 代碼 __init__ raw linu 基類 Python自動化運維之13、異常處理及反射(__import__,getattr,hasattr,setattr) 一、異常處理 python異常: python的運行時錯誤稱
Python自動化運維之異常處理
python 異常處理 1、異常異常就是非正常狀態,在Python中使用異常對象來表示異常。若程序在編譯或運行過程中發生錯誤,程序的執行過程就會發生改變,拋出異常對象,程序流進入異常處理。如果異常對象沒有被處理或捕捉,程序就會執行回溯(Traceback)來終止程序。2、異常類型通用異常類型表異常描述
python自動化運維之Socket網絡編程
python socketserver socket 網絡編程 1、Socket socket起源於Unix,而Unix/Linux基本哲學之一就是“一切皆文件”,對於文件用【打開】【讀寫】【關閉】模式來操作。socket就是該模式的一個實現,socket即是一種特殊的文件,一些so
python自動化運維之多進程
python 多進程 multiprocessing python中的多線程其實並不是真正的多線程,如果想要充分地使用多核CPU的資源,在python中大部分情況需要使用多進程。Python提供了非常好用的多進程包multiprocessing,只需要定義一個函數,Python會完成其他所有事情。
自動化運維之跳板機--jumpserver
jumpserverJumpserverhttp://www.jumpserver.org/http://bbs.jumpserver.org/https://github.com/jumpserver/jumpserverhttps://github.com/jumpserver/jumpserver/wi
自動化運維之-PXE實現系統批量自動安裝
自動化運維、pxe、http、tftp、dhcp本節索引需求分析PXE簡介整體方案服務選擇功能實現安裝調試錯誤分析總結1 需求分析隨著互聯網技術的不斷壯大,服務器數量也在不斷的增加,IT運維已經成為IT服務內涵中重要的組成部分。面對越來越復雜的業務,面對越來越多樣化的用戶需求,不斷擴展的IT應用需要越來越合理
有贊 MySQL 自動化運維之路 — ZanDB
元數據 進行 頻繁登錄 syn 緩存 存在 數據庫名 ont 業務 轉自:https://tech.youzan.com/youzan-mysql-auto-ops-road/ 一、前言 在互聯網時代,業務規模常常出現爆發式的增長。快速的實例交付,數據庫優化以及備份管理
自動化運維之CentOS7下PXE+Kickstart+DHCP+TFTP+HTTP無人值守安裝系統
pwd 概述 .com 掛載 name 翻譯 epo 服務狀態 信息 一、概述 1、關於PXEPreboot Execution Environment翻譯過來就是預啟動執行環境;簡稱PXE;傳統安裝操作系統的方法是CDROM或U盤引導,而PXE技術解決的是從網絡引導安裝系
自動化運維之cobbler安裝多版本系統
ado XML field 問題 som cfg 當前 command nag 一、引言與概述 1、說明本文是緊接上一篇<自動化運維之CentOS7下PXE+Kickstart+DHCP+TFTP+HTTP無人值守安裝系統>補充篇,或叫基於上篇相關技術之上構建的