簡介
如今,伺服器需要非常頻繁地建立和銷毀。這是因為伺服器有時會承受很大的執行負載,而其他時候負載會減少,從而浪費系統資源。一個常見的例子是電子商務網站在節日期間吸引大量流量。當應用程式的本質是可擴展時,始終需要組態管理工具來使建立伺服器的整個過程變得更容易。Ansible 是一款優秀的組態管理工具,它使用標準程序自動化伺服器建立,從而減少人為錯誤。
Ansible 不需要將特殊軟體安裝在伺服器的節點上。它擁有編寫、建置和促進指令碼自動化所需的所有工具。本教學 詳細說明了如何使用 Ansible 來自動化我們 如何設定您的 Ubuntu 伺服器 教學中的步驟.
先決條件
要完成本指南,我們將使用 Ubuntu 20.04。此外,您還需要:
-
一個 Ansible 控制節點:一部執行最新 Ubuntu 版本的 Ubuntu 機器。Ansible 的主二進位檔案必須在此機器上安裝並執行。此機器應該要能夠連接到 Ansible 節點。對於這些連接,您需要使用 SSH 金鑰。為避免連接時出現問題,請確保您的 Ansible 控制節點已啟用防火牆。如果您需要協助,請查看我們的 在 Ubuntu 20.04 上安裝與設定 Ansible 部落格。
-
Ansible 主機:需要連接到一個或多個主機。這些主機本質上是 Ansible 中的受控節點。這些必須是 Ubuntu 伺服器。
Ansible Playbook 的功能
您可以手動設定以下所有步驟。但是,我們將自動化此執行過程。當您執行此 playbook 時,它將在您的機器上執行以下操作:
-
它將安裝 aptitude,這是 Ansible 首選的套件管理器。
-
它將建立一個管理群組 wheel,並具有免密碼的 sudo 權限。
-
它將建立一個新的 sudo 使用者。
-
它將複製一個本機 SSH 金鑰到 authorized_keys。這將用於遠端主機上的新管理使用者。
-
它將停用 root 使用者的密碼驗證。
-
它將安裝必要的套件。
-
它將設定 UFW 防火牆 以僅允許 SSH 連線。任何其他連線都將被阻止。
一旦 Playbook 執行完畢,將可以使用新使用者。您可以使用此使用者登入系統。
使用 Ansible Playbook
要設定伺服器,您將需要初始伺服器設定 playbook 及其相依性。如果您是第一次使用,則需要使用下方的連結複製(clone)該儲存庫:
|
1 |
cd ~ |
|
1 |
git clone https://github.com/do-community/ansible-playbooks.git |
|
1 |
cd ansible-playbooks |
如果您的系統中已存在該儲存庫,請執行以下命令以獲取最新更新:
|
1 |
cd ~/ansible-playbooks |
|
1 |
git pull |
您將在機器上獲得以下檔案結構:
|
1 2 3 4 |
setup |-- playbook.yml |__vars |-- default,yml |
以下是檔案的說明:
-
vars/default.yml:此檔案包含用於設定 Ansible 節點的變數。
-
playbook.yml:此檔案包含要在伺服器上執行的工作。
檔案 vars/default.yml 看起來像這樣:
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
以下是這些變數的說明。如果您希望編輯它們,可以將其值替換為您自己的值:
-
create_user:這是建立的使用者。此使用者具有 sudo 權限。
-
copy_local_key: 這包含本地 SSH 公鑰的路徑。它將被複製到遠端伺服器,作為 authorized_key.
-
sys_packages: 如果您想在伺服器上安裝一個或多個套件,請在此處以陣列形式列出。
編輯完此檔案後,請儲存內容。之後,在 nano 中按下 CTRL+X , Y. 然後, ENTER 以儲存檔案內容。
現在您已準備好在多台伺服器上執行此 playbook。預設情況下,Playbook 已準備好在您清單中的伺服器上執行。如果您想在某些特定的伺服器上使用 Playbook,可以使用 -l 旗標。現在假設遠端伺服器有多個使用者,您可以使用 -u 旗標來指定要連線的使用者。
如果您的伺服器名稱為 my_server 且使用者名稱為 my_user,然後執行以下命令以在 Ansible 節點上執行:
|
1 |
ansible-playbook playbook.yml -l my_server -u my_user |
您將會得到類似以下的輸出:
|
1 2 3 4 5 6 7 8 9 |
PLAY [all] ***************************************************************************************************************************** TASK [收集 主機資訊] ***************************************************************************************************************** ok: [my_server] TASK [安裝 前置需求] *********************************************************************************************************** 已變更: [my_server] TASK [確保 sure 我們 擁有 一個 'wheel' 群組] *********************************************************************************************** 已變更: [my_server] TASK [允許 'wheel' 群組 以 擁有 免密碼 sudo] *********************************************************************************** 已變更: [my_server] |
執行完成後,您可以使用以下命令進行連線:
|
1 |
ssh my_user@server_host_or_IP |
請記住 my_user 是我們在 vars/default.yml 檔案中使用的名稱。您還需要將上述命令中的伺服器 IP 更改為您伺服器的 IP。如果您提供了 copy_local_key 變數以指向某個自訂 SSH 金鑰,請使用 -i 選項指定位置:
|
1 |
ssh my_user@server_host_or_IP -i ~/.ssh/ansible_controller_key |
接下來,登入您的伺服器以檢查 UFW 防火牆的規則:
|
1 |
sudo ufw status |
您將會得到如下輸出:
|
1 2 3 4 5 |
狀態: 作用中 目的地 動作 來源 -- ------ ---- OpenSSH 允許 任何來源 OpenSSH (v6) 允許 任何來源 (v6) |
上述輸出確認了 UFW 防火牆已成功完成設定。這是我們 playbook 中的最後一個步驟。如果執行正確,這意味著執行已成功。
Ansible Playbook 內容
我們在本教學中使用的 Playbook 檔案託管於 ansible-playbooks/setup_ubuntu1804 at master · do-community/ansible-playbooks · GitHub。如果您希望查看每個檔案的內容以進行使用或編輯,請點擊每個指令碼頂部的 Raw 按鈕。
為了方便快速參考,我們將分享 Playbook 的完整內容以及相關檔案:
-
vars/default.yml
此檔案包含 playbook 任務將使用的值。這些值包括使用者名稱、權限、SSH 金鑰、作為初始設定一部分要安裝的套件等等:
|
1 2 3 4 |
--- create_user: my_user copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}" sys_packages: [ 'curl', 'vim', 'git', 'ufw'] |
-
playbook.yml
該 playbook.yml 檔案包含要執行的工作。首先,該檔案會列出所有要針對的主機。如果您想指定所有伺服器,請將此鍵的值設為 all。接下來,如果您想指定使用 sudo 權限執行的任務,請將變數的值設為 become: true。最後,此檔案需要包含上述 vars/default.yml 檔案的內容。我們接下來包含這些內容以載入此檔案的設定:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
--- - hosts: all become: true vars_files: - vars/default.yml tasks: - name: 安裝 前置準備 apt: name=aptitude update_cache=yes state=latest force_apt_get=yes # Sudo 群組設定 - name: 確認 確定 我們 擁有 一個 'wheel' 群組 group: name: wheel state: present - name: 允許 'wheel' 群組 具有 免密碼 sudo 權限 lineinfile: path: /etc/sudoers state: present regexp: '^%wheel' line: '%wheel ALL=(ALL) NOPASSWD: ALL' validate: '/usr/sbin/visudo -cf %s' # 使用者與金鑰設定 - name: 建立 一個 新的 一般 使用者 並具有 sudo 權限 user: name: "{{ create_user }}" state: present groups: wheel append: true create_home: true shell: /bin/bash - name: 設定 授權 金鑰 給 遠端 使用者 authorized_key: user: "{{ create_user }}" state: present key: "{{ copy_local_key }}" - name: 停用 密碼 驗證 給 root lineinfile: path: /etc/ssh/sshd_config state: present regexp: '^#?PermitRootLogin' line: 'PermitRootLogin prohibit-password' # 安裝套件 - name: 更新 apt apt: update_cache=yes - name: 安裝 所需的 系統 套件 apt: name={{ sys_packages }} state=latest # UFW 設定 - name: UFW - 允許 SSH 連線 ufw: rule: allow name: OpenSSH - name: UFW - 拒絕 所有 其他 傳入 流量 依 預設 ufw: state: enabled policy: deny direction: incoming |
結論
自動化是 IT 的關鍵,能確保所有流程皆無誤並遵循標準實踐與程序。由於現今大多數軟體都是透過網路以分散式架構交付,因此建立新伺服器已成為日常工作,例如針對預備環境(staging)、生產環境(production)或甚至是展示環境(demo)等不同環境。
在本教學中,我們示範了如何使用 Ansible 實現伺服器自動化,這是一個強大且易於使用的工具,可以為您節省大量時間。
祝您使用愉快!
留言
目前尚無留言。成為第一個留言的人吧。