linux安装ansible

前言

在现代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. 更新系统软件包

在控制节点上,首先更新系统的软件包,以确保拥有最新的系统环境。

bash 复制代码
sudo yum update -y

2. 安装EPEL仓库

EPEL(Extra Packages for Enterprise Linux)是一个为企业级Linux提供额外软件包的项目。Ansible在EPEL仓库中提供。

bash 复制代码
sudo yum install epel-release -y

3. 安装Ansible

通过YUM包管理器直接安装Ansible。

bash 复制代码
sudo yum install ansible -y

4. 验证安装

检查Ansible是否安装成功,并查看版本信息。

bash 复制代码
ansible --version

输出类似以下信息表示安装成功:

ansible 2.9.25
  config file = /etc/ansible/ansible.cfg
  configured module search path = ['/home/user/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  python version = 2.7.5

配置Ansible

1. 设置SSH免密码登录

为了让Ansible能够无障碍地与被控节点通信,需要设置SSH免密码登录。

在控制节点上生成SSH密钥对
bash 复制代码
ssh-keygen -t rsa -b 2048

一路回车,使用默认路径和空密码。

将公钥复制到被控节点

假设被控节点的IP为192.168.0.101,用户名为user

bash 复制代码
ssh-copy-id user@192.168.0.101

输入被控节点用户的密码,即可完成公钥复制。

2. 配置Ansible主机清单(Inventory)

Ansible的默认主机清单文件位于/etc/ansible/hosts,但我们可以在项目目录下创建自定义的主机清单。

在项目根目录下创建hosts文件,内容如下:

ini 复制代码
[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与被控节点的连接。

bash 复制代码
ansible -i hosts servers -m ping

成功的输出应类似于:

server1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
server2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

编写Ansible角色(Role)测试系统性能

Ansible的角色(Role)是一种将相关的任务、变量、文件、模板等组织在一起的方式,方便复用和共享。

1. 创建项目目录结构

按照Ansible的最佳实践,创建以下目录结构:

bash 复制代码
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中添加以下内容:

yaml 复制代码
---
- name: Install necessary packages
  become: yes
  package:
    name: sysstat
    state: present

- name: Gather CPU usage
  shell: |
    top -bn1 | grep "Cpu(s)" | \
    awk '{print 100 - $8"%"}'
  register: cpu_usage

- name: Gather Memory usage
  shell: |
    free -m | awk 'NR==2{printf "%.2f%", $3*100/$2 }'
  register: mem_usage

- name: Gather Disk usage
  shell: |
    df -h / | awk 'NR==2 {print $5}'
  register: disk_usage

- name: Gather Network statistics
  shell: |
    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 usage
  debug:
    msg: "CPU Usage: {{ cpu_usage.stdout }}"

- name: Display Memory usage
  debug:
    msg: "Memory Usage: {{ mem_usage.stdout }}"

- name: Display Disk usage
  debug:
    msg: "Disk Usage: {{ disk_usage.stdout }}"

- name: Display Network statistics
  debug:
    msg: "Network Stats: {{ net_stats.stdout_lines }}"
任务详解
  1. 安装必要的软件包

    • sysstat:提供sar命令,用于收集系统活动报告。
  2. 收集CPU使用率

    • 使用top命令获取CPU空闲率,然后计算使用率。
  3. 收集内存使用率

    • 使用free命令计算已用内存占总内存的百分比。
  4. 收集磁盘使用率

    • 使用df命令获取根目录的磁盘使用率。
  5. 收集网络统计

    • 使用sar命令获取网络接口的传输速率。
  6. 显示结果

    • 使用debug模块在控制台输出收集到的性能指标。

3. 编写主剧本

在项目根目录下创建site.yml文件:

yaml 复制代码
---
- hosts: servers
  become: yes
  roles:
    - system_performance
剧本详解
  • hosts: servers:指定目标主机组为servers
  • become: yes:启用特权提升(sudo)。
  • roles:包含需要执行的角色列表。

4. 执行剧本

在项目根目录下,运行以下命令:

bash 复制代码
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. 将结果保存到文件

可以修改任务,将性能指标保存到被控节点的文件中,或集中收集到控制节点。

yaml 复制代码
- name: Save performance data to file
  copy:
    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中定义阈值,进行性能报警。

yaml 复制代码
cpu_threshold: 80
mem_threshold: 80
disk_threshold: 90

在任务中,添加条件判断:

yaml 复制代码
- name: Check if CPU usage is high
  debug:
    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权限。

参考资料

相关推荐
嚯——哈哈4 分钟前
从入门到精通:解析如何使用亚马逊云服务器(AWS EC2)
运维·服务器·aws
编程修仙38 分钟前
Collections工具类
linux·windows·python
芝麻团坚果1 小时前
对subprocess启动的子进程使用VSCode python debugger
linux·ide·python·subprocess·vscode debugger
Elastic 中国社区官方博客1 小时前
Elasticsearch 中的热点以及如何使用 AutoOps 解决它们
大数据·运维·elasticsearch·搜索引擎·全文检索
写点什么啦1 小时前
[debug]不同的window连接ubuntu的vscode后无法正常加载kernel
linux·vscode·ubuntu·debug
wellnw1 小时前
[ubuntu]编译共享内存读取出现read.c:(.text+0x1a): undefined reference to `shm_open‘问题解决方案
linux·ubuntu
不爱学习的YY酱1 小时前
【操作系统不挂科】<CPU调度(13)>选择题(带答案与解析)
java·linux·前端·算法·操作系统
DC_BLOG1 小时前
Linux-Nginx虚拟主机
linux·运维·nginx
坐公交也用券1 小时前
使用Python3实现Gitee码云自动化发布
运维·gitee·自动化
XY.散人2 小时前
初识Linux · 信号处理 · 续
linux·信号处理