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

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

接著,它會列出可選模板:

選擇一個,比如“安裝軟件包”,然后輸入參數:

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























