震驚!我用一個(gè)腳本干掉了手寫 Ansible 劇本的痛苦!
在日常的運(yùn)維工作中,我們經(jīng)常會(huì)和Ansible打交道。
不管是批量部署服務(wù)、修改配置文件,還是重啟集群中的服務(wù)節(jié)點(diǎn),Ansible的“自動(dòng)化”確實(shí)幫我們省下了不少時(shí)間。
但是——每次都要手寫一份新的Playbook,是不是讓你也頭大過???

?? 手寫劇本的“重復(fù)勞動(dòng)”
還記得上個(gè)月,我接到這樣一個(gè)需求:
“幫我在 web 集群上批量安裝 Nginx,然后再啟動(dòng)一下服務(wù)。”
好嘛,這看似簡(jiǎn)單的一句話,對(duì)運(yùn)維來說,就是要寫這樣一個(gè) deploy_nginx.yml:
- name: 部署Nginx
hosts: webservers
become: true
tasks:
- name: 安裝Nginx
yum:
name: nginx
state: present
- name: 啟動(dòng)Nginx
service:
name: nginx
state: started寫一次沒問題,但問題在于:
- 明天要安裝 Redis;
- 后天要部署 Node;
- 再過幾天要批量拷貝配置文件……
每次都是復(fù)制粘貼改一改,改錯(cuò)一個(gè)縮進(jìn),ansible-playbook 就直接報(bào)錯(cuò)。 更別說臨時(shí)任務(wù)多的時(shí)候,一天下來Playbook目錄能塞滿幾十個(gè) .yml 文件,看著都累。
這時(shí)候我心想:
“這些任務(wù)的邏輯都差不多,能不能用腳本自動(dòng)生成Playbook?”
于是,干就完了。
?? 讓腳本替我“寫”劇本
我給自己定了三個(gè)目標(biāo):
- 簡(jiǎn)單交互即可生成劇本,不再手寫 YAML;
- 支持多任務(wù),比如一 Playbook包含“安裝 + 啟動(dòng) + 配置”;
- 支持模板化,常見任務(wù)(安裝、拷貝、執(zhí)行命令)都能復(fù)用。
經(jīng)過幾天折騰,一個(gè)名為 generator_playbook.py 的小工具誕生了。 它的功能很簡(jiǎn)單——根據(jù)用戶輸入自動(dòng)生成Ansible劇本。
?? 像點(diǎn)餐一樣“生成劇本”
運(yùn)行命令:
python3 generator_playbook.py終端會(huì)彈出交互界面:

接著,它會(huì)列出可選模板:

選擇一個(gè),比如“安裝軟件包”,然后輸入?yún)?shù):

最后生成的Playbook文件就長(zhǎng)這樣??:
- name: Web集群部署
hosts: webservers
become: true
tasks:
- name: 安裝Nginx
yum:
name: nginx
state: present
- name: 重啟Nginx
service:
name: nginx
state: restarted是不是很整齊?整個(gè)過程不到 分鐘,再也不用擔(dān)心寫錯(cuò)縮進(jìn)或忘加冒號(hào)。
模板驅(qū)動(dòng)的 YAML 生成
腳本的核心是模板化設(shè)計(jì)。每種常見任務(wù)(比如安裝、拷貝、執(zhí)行命令)都有預(yù)設(shè)模板:
TEMPLATES = {
"install_package": {
"desc": "安裝軟件包",
"module": "yum",
"args": {"name": "", "state": "present"}
},
"copy_file": {
"desc": "復(fù)制文件到遠(yuǎn)程主機(jī)",
"module": "copy",
"args": {"src": "", "dest": ""}
},
"run_command": {
"desc": "執(zhí)行 Shell 命令",
"module": "shell",
"args": {"cmd": ""}
}
}用戶只需填寫參數(shù),腳本就能自動(dòng)組裝出YAML結(jié)構(gòu),然后用 PyYAML 庫(kù)輸出成標(biāo)準(zhǔn)的Playbook文件。邏輯清晰、擴(kuò)展方便 —— 新增模板只要加一段配置就行!
讓自動(dòng)化更“自動(dòng)”
自從用了這個(gè)工具,我的工作效率真的是“肉眼可見”的提升。
過去:
- 每次寫劇本要10分鐘;
- 重復(fù)任務(wù)還容易抄錯(cuò);
- 多人協(xié)作劇本風(fēng)格不統(tǒng)一。
現(xiàn)在:
- 1分鐘生成 Playbook;
- 風(fēng)格統(tǒng)一,參數(shù)清晰;
小結(jié)
Ansible是自動(dòng)化的基礎(chǔ),而這個(gè)工具,是“讓自動(dòng)化更自動(dòng)”的一步。 我們不再被YAML文件牽著鼻子走,而是通過模板思維,讓任務(wù)生成更靈活、更高效。
這其實(shí)正體現(xiàn)了運(yùn)維工作的一個(gè)核心理念:
“不要重復(fù)造輪子,而要造一個(gè)能自動(dòng)造輪子的輪子。”
所以,當(dāng)你下一次再打開編輯器準(zhǔn)備手寫 playbook.yml 時(shí),不妨試試讓 Python 幫你寫—— 畢竟,懶惰是推動(dòng)自動(dòng)化進(jìn)步的第一生產(chǎn)力。























