如果你讨厌执行重复性任务,那么我有一个提议给你。学习 Ansible!
Ansible 是一个工具,可以帮助你更轻松、更快速地完成日常任务,这样你就可以将时间用于更有效的方式,例如学习重要的新技术。 对于系统管理员来说,这是一个很棒的工具,因为它可以帮助你实现标准化并协作完成日常活动,包括
- 安装、配置和置备服务器和应用程序
- 定期更新和升级系统
- 监控、缓解和排除问题
通常,许多这些基本的日常任务需要依赖于个人技能的手动步骤,从而导致不一致并导致配置漂移。 在管理一台服务器并知道自己在做什么的小规模实现中,这可能还可以。 但是,当您管理数百或数千台服务器时会发生什么?
[ 提升您的自动化专业知识。 获取 Ansible 清单: 迁移到 Red Hat Ansible Automation Platform 2 的 5 个理由 ]
如果您不小心,这些手动、可重复的任务可能会因人为错误而导致延迟和问题,这些错误可能会影响您和您组织的声誉。
这就是自动化价值的体现。并且 Ansible 是自动化这些可重复的日常任务的完美工具。
自动化的一些原因是
- 你想要一个一致且稳定的环境。
- 你想要培养标准化。
- 你想要更少的停机时间和更少的严重事件案例,这样你就可以享受生活。
- 你想要喝啤酒而不是排除问题!
本文提供了一些系统管理员可以使用 Ansible 自动化的日常任务的示例。 我将本文中的 playbook 和 role 放入 GitHub 上的 sysadmin tasks repository,以便您更轻松地使用它们。
这些 playbook 的结构如下(我的注释前面带有 ==>
)
[root@homebase 6_sysadmin_tasks]# tree -L 2
.
├── ansible.cfg ===> Ansible config file that is responsible for controlling how ansible behave
├── ansible.log
├── inventory
│ ├── group_vars
│ ├── hosts ==> the inventory file that contains the list of my target server
│ └── host_vars
├── LICENSE
├── playbooks ==> the directory that contains playbooks that we will be using for this article
│ ├── c_logs.yml
│ ├── c_stats.yml
│ ├── c_uptime.yml
│ ├── inventory
│ ├── r_cron.yml
│ ├── r_install.yml
│ └── r_script.yml
├── README.md
├── roles ==> the directory that contains the roles that we will be using in this article.
│ ├── check_logs
│ ├── check_stats
│ ├── check_uptime
│ ├── install_cron
│ ├── install_tool
│ └── run_scr
└── templates ==> the directory that contains the jinja template
├── cron_output.txt.j2
├── sar.txt.j2
└── scr_output.txt.j2
inventory 看起来像这样
[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 ==> Please update this with your preferred ansible user
以下是您可以使用 Ansible 自动化的五个日常系统管理员任务。
1. 检查服务器运行时间
你需要确保你的服务器始终启动并运行。 组织拥有企业监控工具来监控服务器和应用程序的运行时间,但有时,自动化监控工具会失败,你需要介入并验证服务器的状态。 手动验证每台服务器的运行时间需要花费大量时间。 服务器越多,花费的时间就越长。 但通过自动化,可以在几分钟内完成此验证。
使用 check_uptime role 和 c_uptime.yml
playbook
[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] *************************************************************************************************
.
snip...
.
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]#
playbook 的输出看起来像这样
[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 role 和 r_cron.yml
playbook
[root@homebase 6_sysadmin_tasks]# ansible-playbook -i inventory/hosts playbooks/r_cron.yml -k
SSH password:
PLAY [Install additional cron jobs for root] ***************************************************************************************************************************
.
snip
.
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
验证 playbook 的结果
[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 role 和 c_stats.yml
playbook 执行此操作
$ 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]
.
snip...
.
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 role 和 r_cron.yml
playbook 执行此操作
$ ansible-playbook -i inventory/hosts playbooks/c_logs.yml -k
SSH password:
PLAY [Check Logs for Servers] ****************************************************************************************************************************************
.
snip
.
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 role 和 r_install.yml
playbook 执行此操作
$ 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 使你能够在更短的时间内完成更多工作,这样你就可以将时间花在更令人兴奋的项目上,而不是执行像管理你的事件和问题管理流程这样的可重复任务。
有了更多的空闲时间,你可以学习更多知识,让自己为下一个职业机会做好准备。
评论已关闭。