使用 Ansible 自動化伺服器設定:撰寫自動執行指令腳本示範


註:官方文件中有提到 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

留言