用 Ansible 自動化系統管理員的 5 個日常任務
如果你討厭執行重複性的任務,那麼我有一個提議給你,去學習 Ansible!
Ansible 是一個工具,它可以幫助你更輕鬆、更快速地完成日常任務,這樣你就可以更有效地利用時間,比如學習重要的新技術。對於系統管理員來說,它是一個很好的工具,因為它可以幫助你實現標準化,並在日常活動中進行協作,包括:
- 安裝、配置和調配伺服器和應用程序;
- 定期更新和升級系統;
- 監測、減輕和排除問題。
通常,許多這些基本的日常任務都需要手動步驟,而根據個人的技能的不同,可能會造成不一致並導致配置發生漂移。這在小規模的實施中可能是可以接受的,因為你管理一台伺服器,並且知道自己在做什麼。但當你管理數百或數千台伺服器時會發生什麼?
如果不小心,這些手動的、可重複的任務可能會因為人為的錯誤而造成延誤和問題,而這些錯誤可能會影響你及你的組織的聲譽。
這就是自動化的價值所在。而 Ansible 是自動化這些可重複的日常任務的完美工具。
自動化的一些原因是:
- 你想要一個一致和穩定的環境。
- 你想要促進標準化。
- 你希望減少停機時間,減少嚴重事故案例,以便可以享受生活。
- 你想喝杯啤酒,而不是排除故障問題!
本文提供了一些系統管理員可以使用 Ansible 自動化的日常任務的例子。我把本文中的劇本和角色放到了 GitHub 上的 系統管理員任務倉庫 中,以方便你使用它們。
這些劇本的結構是這樣的(我的注釋前面有 ==>
)。
[root@homebase 6_sysadmin_tasks]# tree -L 2
.
├── ansible.cfg ==> 負責控制 Ansible 行為的配置文件
├── ansible.log
├── inventory
│ ├── group_vars
│ ├── hosts ==> 包含我的目標伺服器列表的清單文件
│ └── host_vars
├── LICENSE
├── playbooks ==> 包含我們將在本文中使用的劇本的目錄
│ ├── c_logs.yml
│ ├── c_stats.yml
│ ├── c_uptime.yml
│ ├── inventory
│ ├── r_cron.yml
│ ├── r_install.yml
│ └── r_script.yml
├── README.md
├── roles ==> 包含我們將在本文中使用的角色的目錄
│ ├── check_logs
│ ├── check_stats
│ ├── check_uptime
│ ├── install_cron
│ ├── install_tool
│ └── run_scr
└── templates ==> 包含 jinja 模板的目錄
├── cron_output.txt.j2
├── sar.txt.j2
└── scr_output.txt.j2
清單類似這樣的:
[root@homebase 6_sysadmin_tasks]# cat inventory/hosts
[rhel8]
master ansible_ssh_host=192.168.1.12
workernode1 ansible_ssh_host=192.168.1.15
[rhel8:vars]
ansible_user=ansible ==> 請用你的 ansible 用戶名更新它
這裡有五個你可以用 Ansible 自動完成的日常系統管理任務。
1、檢查伺服器的正常運行時間
你需要確保你的伺服器一直處於正常運行狀態。機構會擁有企業監控工具來監控伺服器和應用程序的正常運行時間,但自動監控工具時常會出現故障,你需要登錄進去驗證一台伺服器的狀態。手動驗證每台伺服器的正常運行時間需要花費大量的時間。你的伺服器越多,你需要花費的時間就越長。但如果有了自動化,這種驗證可以在幾分鐘內完成。
使用 check_uptime 角色和 c_uptime.yml
劇本:
[root@homebase 6_sysadmin_tasks]# ansible-playbook -i inventory/hosts playbooks/c_uptime.yml -k
SSH password:
PLAY [Check Uptime for Servers] ****************************************************************************************************************************************
TASK [check_uptime : Capture timestamp] *************************************************************************************************
.
截斷...
.
PLAY RECAP *************************************************************************************************************************************************************
master : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
workernode1 : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
[root@homebase 6_sysadmin_tasks]#
劇本的輸出是這樣的:
[root@homebase 6_sysadmin_tasks]# cat /var/tmp/uptime-master-20210221004417.txt
-------------------------------------------------- Uptime for master
-------------------------------------------------- 00:44:17 up 44 min, 2 users, load average: 0.01, 0.09, 0.09
--------------------------------------------------[root@homebase 6_sysadmin_tasks]# cat /var/tmp/uptime-workernode1-20210221184525.txt
-------------------------------------------------- Uptime for workernode1
-------------------------------------------------- 18:45:26 up 44 min, 2 users, load average: 0.01, 0.01, 0.00
--------------------------------------------------
使用 Ansible,你可以用較少的努力以人類可讀的格式獲得多個伺服器的狀態,Jinja 模板 允許你根據自己的需要調整輸出。通過更多的自動化,你可以按計劃運行,並通過電子郵件發送輸出,以達到報告的目的。
2、配置額外的 cron 作業
你需要根據基礎設施和應用需求定期更新伺服器的計劃作業。這似乎是一項微不足道的工作,但必須正確且持續地完成。想像一下,如果你對數百台生產伺服器進行手動操作,這需要花費多少時間。如果做錯了,就會影響生產應用程序,如果計劃的作業重疊,就會導致應用程序停機或影響伺服器性能。
使用 install_cron 角色和 r_cron.yml
劇本:
[root@homebase 6_sysadmin_tasks]# ansible-playbook -i inventory/hosts playbooks/r_cron.yml -k
SSH password:
PLAY [Install additional cron jobs for root] ***************************************************************************************************************************
.
截斷...
.
PLAY RECAP *************************************************************************************************************************************************************
master : ok=10 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
workernode1 : ok=10 changed=7 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
驗證劇本的結果:
[root@homebase 6_sysadmin_tasks]# ansible -i inventory/hosts all -m shell -a "crontab -l" -k
SSH password:
master | CHANGED | rc=0 >>
1 2 3 4 5 /usr/bin/ls /tmp
#Ansible: Iotop Monitoring
0 5,2 * * * /usr/sbin/iotop -b -n 1 >> /var/tmp/iotop.log 2>> /var/tmp/iotop.err
workernode1 | CHANGED | rc=0 >>
1 2 3 4 5 /usr/bin/ls /tmp
#Ansible: Iotop Monitoring
0 5,2 * * * /usr/sbin/iotop -b -n 1 >> /var/tmp/iotop.log 2>> /var/tmp/iotop.err
使用 Ansible,你可以以快速和一致的方式更新所有伺服器上的 crontab 條目。你還可以使用一個簡單的點對點 Ansible 命令來報告更新後的 crontab 的狀態,以驗證最近應用的變化。
3、收集伺服器統計和 sars
在常規的故障排除過程中,為了診斷伺服器性能或應用程序問題,你需要收集 系統活動報告 (sars)和伺服器統計。在大多數情況下,伺服器日誌包含非常重要的信息,開發人員或運維團隊需要這些信息來幫助解決影響整個環境的具體問題。
安全團隊在進行調查時非常特別,大多數時候,他們希望查看多個伺服器的日誌。你需要找到一種簡單的方法來收集這些文檔。如果你能把收集任務委託給他們就更好了。
通過 check_stats 角色和 c_stats.yml
劇本來完成這個任務:
$ ansible-playbook -i inventory/hosts playbooks/c_stats.yml
PLAY [Check Stats/sar for Servers] ***********************************************************************************************************************************
TASK [check_stats : Get current date time] ***************************************************************************************************************************
changed: [master]
changed: [workernode1]
.
截斷...
.
PLAY RECAP ***********************************************************************************************************************************************************
master : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
workernode1 : ok=5 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
輸出看起來像這樣:
$ cat /tmp/sar-workernode1-20210221214056.txt
-------------------------------------------------- sar output for workernode1
--------------------------------------------------Linux 4.18.0-193.el8.x86_64 (node1) 21/02/21 _x86_64_ (2 CPU)
21:39:30 LINUX RESTART (2 CPU)
--------------------------------------------------
4、收集伺服器日誌
除了收集伺服器統計和 sars 信息,你還需要不時地收集日誌,尤其是當你需要幫助調查問題時。
通過 check_logs 角色和 r_cron.yml
劇本來實現:
$ ansible-playbook -i inventory/hosts playbooks/c_logs.yml -k
SSH password:
PLAY [Check Logs for Servers] ****************************************************************************************************************************************
.
截斷...
.
TASK [check_logs : Capture Timestamp] ********************************************************************************************************************************
changed: [master]
changed: [workernode1]
PLAY RECAP ***********************************************************************************************************************************************************
master : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
workernode1 : ok=6 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
為了確認輸出,打開轉儲位置生成的文件。日誌應該是這樣的:
$ cat /tmp/logs-workernode1-20210221214758.txt | more
-------------------------------------------------- Logs gathered: /var/log/messages for workernode1
--------------------------------------------------
Feb 21 18:00:27 node1 kernel: Command line: BOOT_IMAGE=(hd0,gpt2)/vmlinuz-4.18.0-193.el8.x86_64 root=/dev/mapper/rhel-root ro crashkernel=auto resume=/dev/mapper/rhel
-swap rd.lvm.lv=rhel/root rd.lvm.lv=rhel/swap rhgb quiet
Feb 21 18:00:27 node1 kernel: Disabled fast string operations
Feb 21 18:00:27 node1 kernel: x86/fpu: Supporting XSAVE feature 0x001: 'x87 floating point registers'
Feb 21 18:00:27 node1 kernel: x86/fpu: Supporting XSAVE feature 0x002: 'SSE registers'
Feb 21 18:00:27 node1 kernel: x86/fpu: Supporting XSAVE feature 0x004: 'AVX registers'
Feb 21 18:00:27 node1 kernel: x86/fpu: xstate_offset[2]: 576, xstate_sizes[2]: 256
Feb 21 18:00:27 node1 kernel: x86/fpu: Enabled xstate features 0x7, context size is 832 bytes, using 'compacted' format.
5、安裝或刪除軟體包和軟體
你需要能夠持續快速地在系統上安裝和更新軟體和軟體包。縮短安裝或更新軟體包和軟體所需的時間,可以避免伺服器和應用程序不必要的停機時間。
通過 install_tool 角色和 r_install.yml
劇本來實現這一點:
$ ansible-playbook -i inventory/hosts playbooks/r_install.yml -k
SSH password:
PLAY [Install additional tools/packages] ***********************************************************************************
TASK [install_tool : Install specified tools in the role vars] *************************************************************
ok: [master] => (item=iotop)
ok: [workernode1] => (item=iotop)
ok: [workernode1] => (item=traceroute)
ok: [master] => (item=traceroute)
PLAY RECAP *****************************************************************************************************************
master : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
workernode1 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
這個例子安裝了在 vars 文件中定義的兩個特定包和版本。使用 Ansible 自動化,你可以比手動安裝更快地安裝多個軟體包或軟體。你也可以使用 vars 文件來定義你要安裝的軟體包的版本。
$ cat roles/install_tool/vars/main.yml
# vars file for install_tool
ins_action: absent
package_list:
- iotop-0.6-16.el8.noarch
- traceroute
擁抱自動化
要成為一名有效率的系統管理員,你需要接受自動化來鼓勵團隊內部的標準化和協作。Ansible 使你能夠在更少的時間內做更多的事情,這樣你就可以將時間花在更令人興奮的項目上,而不是做重複的任務,如管理你的事件和問題管理流程。
有了更多的空閑時間,你可以學習更多的知識,讓自己可以迎接下一個職業機會的到來。
via: https://opensource.com/article/21/3/ansible-sysadmin
作者:Mike Calizo 選題:lujun9972 譯者:wxy 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive