前言
在现代IT运维中,自动化工具已经成为不可或缺的一部分。Ansible作为一款无代理、基于Python的自动化工具,以其简单、易用和强大的功能受到广大运维人员的青睐。我最近亲自操作并测试了Ansible的安装过程,并编写了一个Ansible角色(Role)来测试系统性能。本文将详细分享整个过程,包括环境准备、Ansible的安装、配置,以及如何编写一个用于系统性能测试的Ansible角色,希望对需要的朋友有所帮助。
环境准备
在开始之前,我们需要准备以下环境:
- 操作系统:CentOS 7(被控节点也使用相同的系统)
- 权限:具有
sudo
权限的用户 - 网络连接:控制节点与被控节点之间的网络通信正常
- Python版本:Python 2.7 或 Python 3.5+
Ansible简介
Ansible是一款基于SSH的开源自动化工具,可以实现配置管理、应用部署、任务执行等功能。由于Ansible采用无代理(Agentless)的方式,只需要在控制节点安装Ansible即可,被控节点无需安装任何客户端。
安装Ansible
1. 更新系统软件包
在控制节点上,首先更新系统的软件包,以确保拥有最新的系统环境。
sudo yum update -y
2. 安装EPEL仓库
EPEL(Extra Packages for Enterprise Linux)是一个为企业级Linux提供额外软件包的项目。Ansible在EPEL仓库中提供。
sudo yum install epel-release -y
3. 安装Ansible
通过YUM包管理器直接安装Ansible。
sudo yum install ansible -y
4. 验证安装
检查Ansible是否安装成功,并查看版本信息。
ansible --version
输出类似以下信息表示安装成功:
ansible 2.9.25config file = /etc/ansible/ansible.cfgconfigured module search path = ['/home/user/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']python version = 2.7.5
配置Ansible
1. 设置SSH免密码登录
为了让Ansible能够无障碍地与被控节点通信,需要设置SSH免密码登录。
在控制节点上生成SSH密钥对
ssh-keygen -t rsa -b 2048
一路回车,使用默认路径和空密码。
将公钥复制到被控节点
假设被控节点的IP为192.168.0.101
,用户名为user
。
ssh-copy-id user@192.168.0.101
输入被控节点用户的密码,即可完成公钥复制。
2. 配置Ansible主机清单(Inventory)
Ansible的默认主机清单文件位于/etc/ansible/hosts
,但我们可以在项目目录下创建自定义的主机清单。
在项目根目录下创建hosts
文件,内容如下:
[servers]
server1 ansible_host=192.168.0.101 ansible_user=user
server2 ansible_host=192.168.0.102 ansible_user=user
[servers]
:定义一个主机组,名为servers
。ansible_host
:指定目标主机的IP地址。ansible_user
:指定SSH连接的用户名。
3. 测试连接
使用ping
模块测试Ansible与被控节点的连接。
ansible -i hosts servers -m ping
成功的输出应类似于:
server1 | SUCCESS => {"changed": false,"ping": "pong"
}
server2 | SUCCESS => {"changed": false,"ping": "pong"
}
编写Ansible角色(Role)测试系统性能
Ansible的角色(Role)是一种将相关的任务、变量、文件、模板等组织在一起的方式,方便复用和共享。
1. 创建项目目录结构
按照Ansible的最佳实践,创建以下目录结构:
mkdir -p ansible-perf-test/roles/system_performance/{tasks,handlers,templates,files,vars,defaults,meta}
各目录的作用:
tasks
:存放主要的任务文件。handlers
:存放触发的处理器。templates
:存放Jinja2模板文件。files
:存放需要分发到被控节点的文件。vars
:存放变量文件。defaults
:存放默认变量文件。meta
:存放角色的元数据。
2. 编写任务文件
在roles/system_performance/tasks/main.yml
中添加以下内容:
---
- name: Install necessary packagesbecome: yespackage:name: sysstatstate: present- name: Gather CPU usageshell: |top -bn1 | grep "Cpu(s)" | \awk '{print 100 - $8"%"}'register: cpu_usage- name: Gather Memory usageshell: |free -m | awk 'NR==2{printf "%.2f%", $3*100/$2 }'register: mem_usage- name: Gather Disk usageshell: |df -h / | awk 'NR==2 {print $5}'register: disk_usage- name: Gather Network statisticsshell: |sar -n DEV 1 1 | grep Average | grep -v IFACE | awk '{print $2": RX "$5"KB/s TX "$6"KB/s"}'register: net_stats- name: Display CPU usagedebug:msg: "CPU Usage: {{ cpu_usage.stdout }}"- name: Display Memory usagedebug:msg: "Memory Usage: {{ mem_usage.stdout }}"- name: Display Disk usagedebug:msg: "Disk Usage: {{ disk_usage.stdout }}"- name: Display Network statisticsdebug:msg: "Network Stats: {{ net_stats.stdout_lines }}"
任务详解
-
安装必要的软件包
sysstat
:提供sar
命令,用于收集系统活动报告。
-
收集CPU使用率
- 使用
top
命令获取CPU空闲率,然后计算使用率。
- 使用
-
收集内存使用率
- 使用
free
命令计算已用内存占总内存的百分比。
- 使用
-
收集磁盘使用率
- 使用
df
命令获取根目录的磁盘使用率。
- 使用
-
收集网络统计
- 使用
sar
命令获取网络接口的传输速率。
- 使用
-
显示结果
- 使用
debug
模块在控制台输出收集到的性能指标。
- 使用
3. 编写主剧本
在项目根目录下创建site.yml
文件:
---
- hosts: serversbecome: yesroles:- system_performance
剧本详解
hosts: servers
:指定目标主机组为servers
。become: yes
:启用特权提升(sudo)。roles
:包含需要执行的角色列表。
4. 执行剧本
在项目根目录下,运行以下命令:
ansible-playbook -i hosts site.yml
测试结果与分析
执行后,控制台将显示各个任务的执行结果和性能指标。例如:
PLAY [servers] *****************************************************************TASK [Gathering Facts] *********************************************************
ok: [server1]
ok: [server2]TASK [system_performance : Install necessary packages] *************************
changed: [server1]
changed: [server2]TASK [system_performance : Gather CPU usage] ***********************************
changed: [server1]
changed: [server2]TASK [system_performance : Gather Memory usage] ********************************
changed: [server1]
changed: [server2]TASK [system_performance : Gather Disk usage] **********************************
changed: [server1]
changed: [server2]TASK [system_performance : Gather Network statistics] **************************
changed: [server1]
changed: [server2]TASK [system_performance : Display CPU usage] **********************************
ok: [server1] => {"msg": "CPU Usage: 15.3%"
}
ok: [server2] => {"msg": "CPU Usage: 20.1%"
}TASK [system_performance : Display Memory usage] *******************************
ok: [server1] => {"msg": "Memory Usage: 45.67%"
}
ok: [server2] => {"msg": "Memory Usage: 55.23%"
}TASK [system_performance : Display Disk usage] *********************************
ok: [server1] => {"msg": "Disk Usage: 35%"
}
ok: [server2] => {"msg": "Disk Usage: 40%"
}TASK [system_performance : Display Network statistics] *************************
ok: [server1] => {"msg": "Network Stats: ['eth0: RX 0.00KB/s TX 0.00KB/s']"
}
ok: [server2] => {"msg": "Network Stats: ['eth0: RX 0.00KB/s TX 0.00KB/s']"
}PLAY RECAP *********************************************************************
server1 : ok=10 changed=5 unreachable=0 failed=0
server2 : ok=10 changed=5 unreachable=0 failed=0
结果分析
- CPU使用率:显示了当前CPU的使用百分比。
- 内存使用率:显示了已用内存占总内存的百分比。
- 磁盘使用率:显示了根目录的磁盘使用百分比。
- 网络统计:显示了网络接口的接收和发送速率。
通过这些数据,可以初步了解各服务器的性能状况。如果某项指标过高,可能需要进一步调查和优化。
扩展与优化
1. 将结果保存到文件
可以修改任务,将性能指标保存到被控节点的文件中,或集中收集到控制节点。
- name: Save performance data to filecopy:content: |CPU Usage: {{ cpu_usage.stdout }}Memory Usage: {{ mem_usage.stdout }}Disk Usage: {{ disk_usage.stdout }}Network Stats: {{ net_stats.stdout_lines }}dest: /var/log/performance.log
2. 使用自定义变量
可以在defaults/main.yml
中定义阈值,进行性能报警。
cpu_threshold: 80
mem_threshold: 80
disk_threshold: 90
在任务中,添加条件判断:
- name: Check if CPU usage is highdebug:msg: "Warning: CPU usage is above {{ cpu_threshold }}%!"when: cpu_usage.stdout | float > cpu_threshold
3. 集成到监控系统
可以将Ansible与Zabbix、Nagios等监控系统集成,实现自动化监控和报警。
常见问题及解决
问题1:无法连接被控节点
解决方案:
- 检查被控节点的SSH服务是否开启。
- 确认防火墙是否允许SSH连接。
- 验证SSH免密码登录是否配置正确。
问题2:sysstat
未安装,导致sar
命令不可用
解决方案:
- 确保在任务中安装了
sysstat
包。 - 可以手动在被控节点上安装,或检查YUM仓库是否可用。
问题3:权限问题导致任务执行失败
解决方案:
- 在剧本中使用
become: yes
启用特权提升。 - 确保控制节点用户在被控节点上具有
sudo
权限。
参考资料
- Ansible官方文档
- Ansible最佳实践
- sysstat手册页