註:在官方文件中有提到 Ansible 不支援使用 Windows 來執行,如果想要在 Windows 中執行 Ansible 需要使用到 WSL。
安裝 ansible
Ansible 是使用 Python 撰寫的,在執行時需要先安裝 python。安裝 ansible :
pip install ansible
註: 在 apt 中也有 ansible 套件,但是筆者在測試時一直執行失敗,所以使用安裝 python + 使用 pip 安裝 ansible 的方式來執行。
ansible 使用示範
建立 inventory.yml 檔案,用來儲存要連接的主機。
all:
hosts:
192.168.0.43:
ansible_port: 22
驗證內容:
ansible-inventory -i inventory.yml --list
範例輸出:
ansible-inventory -i inventory.yml --list
{
"_meta": {
"hostvars": {
"192.168.0.43": {
"ansible_port": 22
}
}
},
"all": {
"children": [
"ungrouped"
]
},
"ungrouped": {
"hosts": [
"192.168.0.43"
]
}
}
這裡就建立一個最簡單的任務 yaml 做示範,目的是更新 apt 套件。
建立 upgrade.yml
- name: Upgrade all packages using apt
hosts: all # inventory.yml 中定義的主機
become: yes # 以 sudo 權限執行
tasks:
- name: Run apt upgrade # 任務名稱
apt: # 模組
upgrade: yes
update_cache: yes
ansible 中所有可用的模組(module)清單
ansible 需要仰賴 sshpass 來輸入密碼,需要使用以下指令安裝 sshpass:
sudo apt install sshpass
使用 ansible-playbook 指令來執行腳本:
-u 參數後面接上使用 ssh 連接的使用者名稱
--ask-pass 代表等一下會詢問 ssh 連線密碼
--ask-become-pass 代表等一下會詢問 sudo 密碼
ansible-playbook -i inventory.yml upgrade.yml -u ruyut --ask-pass --ask-become-pass
如果想要看到詳細的錯誤訊息還可以使用 -v 參數。
範例輸出:
ansible-playbook -i inventory.yml upgrade.yml -u ruyut --ask-pass --ask-become-pass
SSH password:
BECOME password[defaults to SSH password]:
PLAY [Upgrade all packages using apt] ******************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************************
ok: [192.168.0.43]
TASK [Run apt upgrade] *********************************************************************************************************************
changed: [192.168.0.43]
PLAY RECAP *********************************************************************************************************************************
192.168.0.43 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
執行完畢。 log 也可以使用 yaml 格式輸出:
ANSIBLE_STDOUT_CALLBACK=yaml ansible-playbook -i inventory.yml upgrade.yml -u ruyut --ask-pass --ask-become-pass
腳本範例
更新套件:
---
- name: Auto update and upgrade apt packages
hosts: all
become: yes
tasks:
- name: apt update
apt:
update_cache: yes
- name: apt upgrade -y
apt:
upgrade: dist
autoremove: yes # 移除不必要的依賴
autoclean: yes # 清理舊的安裝包
參考資料:
Ansible
Ansible Documentation
Ansible playbooks
留言
張貼留言
如果有任何問題、建議、想說的話或文章題目推薦,都歡迎留言或來信: a@ruyut.com