腳本編寫說明
腳本是一段Python代碼,要求腳本里面定義好與模板名同名的函數(shù),作為執(zhí)行任務(wù)的入口函數(shù)。
代碼限制
禁用內(nèi)置函數(shù)print,while。
限制range使用,最大不超過1000。
import白名單列表:
re
json
time
datetime
IPy
hashlib
base64
uuid.uuid4
difflib
ipaddress
copy
random
math
string
禁用下劃線開頭_命名的變量/函數(shù)。
內(nèi)置函數(shù)說明
logger
logger是標(biāo)準(zhǔn)模塊logging.Logger的一個實例。
用戶可以參考下?的?式輸出日志,所有的日志都會記錄在數(shù)據(jù)庫中,可以在任務(wù)管理??查詢。
def logger_example():
logger.error("an error message")
logger.warn("a warning message")
logger.info("an info message")
logger.debug("a debug message")
login_device/device_login
login_device/device_login負(fù)責(zé)處理設(shè)備的登錄登出,以及保證設(shè)備操作的串?化。
exec_cli
exec_cli負(fù)責(zé)向設(shè)備下發(fā)命令,只能用于login_device裝飾的函數(shù)中。
完整參數(shù)列表:
command: string|list,向設(shè)備下發(fā)的指令或指令列表。
timeout: int,默認(rèn)65s,系統(tǒng)等待設(shè)備響應(yīng)命令完成的超時時間,設(shè)備沒能在指定時間內(nèi)完成響應(yīng)則會有Timeout異常拋出。
style: string,控制返回內(nèi)容結(jié)構(gòu)。
simple: 回顯去除掉input command和終端提示符后剩余內(nèi)容。
tuple: 將回顯內(nèi)容進?拆分,返回(command,output)的列表。
verbose: 默認(rèn)值,將設(shè)備回顯內(nèi)容原樣返回。
strict: boolean,默認(rèn)值True,是否對回顯內(nèi)容作異常關(guān)鍵字判斷。如果命中關(guān)鍵字,則會拋出異常SYSTEM_BUSY或BAD_DEVICE_RESPONSE,?前關(guān)鍵字列表包括:
System is busy
Permission denied
syntax error.
Unrecognized command
Invalid command
Invalid parameter
at '^' marker
Unknown command
at '^' position.
Incomplete command
unknown command
Operation fail
error: configuration database locked by
TCAM region is not configured
Invalid input
Request denied
Authorization denied
error: commit failed
Unavailable command
Cannot apply ACL
exec_script
exec_script用于調(diào)用其他模板。
def exec_script_example(target, cli):
# 調(diào)用exec_cli_example的設(shè)備模板
return exec_script('exec_cli_example', _target=target, cli=cli)
exec_script_async
exec_script_async用于異步調(diào)用模板。
def exec_script_async_example(target, cli):
# 異步調(diào)用device_login_example的設(shè)備模板
task = exec_script('exec_cli_example', _target=target, cli=cli)
# 獲取異步任務(wù)的結(jié)果
result = task.get()
return result
current_device
current_device用于獲取當(dāng)前登錄的設(shè)備。
@login_device
def get_device():
device = current_device()
device['ip'] # 設(shè)備IP
device['hostname'] # 主機名
device['domain'] # 安全域
device['space'] # 物理空間
device['status'] # 狀態(tài)
device['role'] # 角色
device['vendor'] # 廠商
device['model'] # 型號
device['sn'] # SN
device['device_id'] # id
abort
abort用于終止任務(wù)執(zhí)行。
如下示例代碼,運行時,任務(wù)會執(zhí)行失敗,返回為{"message": "xxx", "traceback": [[ "__shadow_{腳本MD5值}_abort_example_{版本ID}__",2,"abort_example",null]], "error_code": "OZ_USER_ABORT"}。
def abort_example():
abort("xxx")
get_exc_code
捕獲異常時,可用該函數(shù)獲取異常錯誤碼。
get_traceback
捕獲異常時,可用該函數(shù)獲取錯誤堆棧。
def exc_example():
try:
abort("xxx")
except Exception as e:
e.message #返回"xxx"
get_exc_code(e) #返回"OZ_USER_ABORT"
get_traceback() #返回[["__shadow_{腳本MD值}_{模板名}_{版本ID}__",
# {異常發(fā)生代碼行數(shù)},
# {異常所在函數(shù)名},
# null]]
輸入?yún)?shù)說明
設(shè)備模板默認(rèn)第一個參數(shù)是_target,類型是string,可以是設(shè)備的id,設(shè)備的主機名或者IP。
輸出參數(shù)說明
主要用于變更方案步驟編輯中。
代碼格式要求
自動化模板代碼格式要求。
例如一個名為example_template的用戶模板,代碼必須全寫在example_template這個函數(shù)里面,若有同級其他函數(shù),引用時需要申明global。
re, json, time, datetime已經(jīng)內(nèi)置,可以不需要寫import。
正確示例
def func_a():
pass
def example_template():
import xxx
global func_a
def func_b():
pass
func_a()
func_b()
巡檢模板代碼格式要求。
巡檢模板代碼里面只能允許有一個可執(zhí)行函數(shù)。