Ansible实现自动化运维

使用Ansible实现自动化运维:集中化管理服务器的完整指南

  • 前言
  • [一、 Ansible概述和运行机制](#一、 Ansible概述和运行机制)
      • [1.1 Ansible概述](#1.1 Ansible概述)
      • [1.2 Ansible工作机制](#1.2 Ansible工作机制)
      • [1.3 Ansible角色(Role)](#1.3 Ansible角色(Role))
  • [二、 Ansible环境安装部署](#二、 Ansible环境安装部署)
  • [三、 Ansible基础命令及模块操作](#三、 Ansible基础命令及模块操作)
      • 命令格式
      • 常用模块示例
        • [3.1 command模块](#3.1 command模块)
        • [3.2 shell模块](#3.2 shell模块)
        • [3.3 cron模块](#3.3 cron模块)
        • [3.4 user模块](#3.4 user模块)
        • [3.5 group模块](#3.5 group模块)
        • [3.6 copy模块](#3.6 copy模块)
        • [3.7 file模块](#3.7 file模块)
        • [3.8 hostname模块](#3.8 hostname模块)
        • [3.9 ping模块](#3.9 ping模块)
        • [3.10 yum模块](#3.10 yum模块)
        • [3.11 service/systemd模块](#3.11 service/systemd模块)
        • [3.12 script模块](#3.12 script模块)
        • [3.13 setup模块](#3.13 setup模块)
  • [四、 Inventory主机清单与变量配置](#四、 Inventory主机清单与变量配置)
      • [4.1 Inventory支持对主机进行分组](#4.1 Inventory支持对主机进行分组)
      • [4.2 常用Inventory变](#4.2 常用Inventory变)
      • 基本示例
        • [(1) 主机变量](#(1) 主机变量)
        • [(2) 组变量](#(2) 组变量)
        • [(3) 组嵌套](#(3) 组嵌套)
  • 结语

前言

  在当今快速发展的IT环境中,自动化运维已经成为提高效率、减少人为错误和确保系统一致性的关键手段。随着服务器数量的增加和配置的复杂化,手动管理变得越来越不可行。Ansible作为一款强大的自动化运维工具,因其简单易用、无需客户端代理、基于SSH通信等特点,成为了众多运维工程师的首选。

  本文将详细介绍Ansible的基本概念、运行机制、安装部署以及基础命令和模块操作,帮助您快速上手并掌握如何使用Ansible进行集中化的服务器管理。无论您是初学者还是有经验的运维人员,本文都将为您提供有价值的指导和参考。

一、 Ansible概述和运行机制

1.1 Ansible概述

Ansible是一款面向类Unix系统的自由开源配置和自动化工具,由Python编写。与SaltStack、Puppet、Chef等工具相似,Ansible在自动化运维领域中具有独特的优势:

  • 无需在被管理节点安装客户端:Ansible是轻量级的,管理端安装即可,被控端无需任何操作。
  • 通过SSH协议与节点通信:默认使用SSH协议管理设备,确保通信的安全性。
  • 使用YAML和Jinja2模板语言 :通过YAML和Jinja2模板语言进行配置和自动化任务编排,易于理解和维护。
    官方网站https://www.ansible.com/
    行业事件
  • 2015年10月,红帽(Red Hat)以约1-1.5亿美元收购了Ansible,进一步推动了其在企业级自动化运维中的应用。
    Ansible特点
  1. 部署简单:管理端安装即可,被控端无需操作。
  2. 默认使用SSH协议管理设备:确保通信安全。
  3. 集中化管理,支持主从模式:便于统一管理和控制。
  4. 配置简洁、功能强大、扩展性高:易于上手且功能丰富。
  5. 支持API和自定义模块:可通过Python扩展,满足个性化需求。
  6. Playbook可实现复杂任务配置和状态管理:通过编写Playbook实现自动化流程。
  7. 对云计算和大数据平台支持良好:适应现代IT环境的需求。

1.2 Ansible工作机制

Ansible通过SSH将模块推送到被管理节点执行,执行完后自动删除。这种机制不仅简化了管理流程,还确保了系统的安全性。Ansible可以结合SVN等工具管理自定义模块及任务编排,进一步提升管理效率和灵活性。
Ansible核心组成

  1. Ansible:核心引擎,负责整体的自动化流程控制。
  2. Modules:内置核心模块和自定义模块,用于执行具体的任务。
  3. Plugins:补充模块功能,如连接插件、邮件插件等,增强Ansible的功能。
  4. Playbooks:剧本,定义多任务操作,通过YAML语法编写,实现复杂的自动化流程。
  5. Inventory:主机清单,定义被管理的主机和组,便于分类和管理。

1.3 Ansible角色(Role)

随着数据中心环境的复杂化,Playbook会变得庞大且难以维护。为了解决这一问题,Ansible引入了角色的概念。角色提供了对复杂任务的模块化管理,具有以下优点:

  • 模块化管理:将任务组织为独立、可复用的剧本和文件。
  • 外部加载机制:提供从外部加载任务、处理程序、变量的机制。
  • 关联静态文件和模板:可关联静态文件和模板,便于管理和复用。
  • 满足通用需求,可重复使用:适用于多种场景,提高效率。
  • 严格的目录结构要求:确保角色的一致性和可维护性。

二、 Ansible环境安装部署

环境示例

类型 IP
管理端 192.168.10.10
被管理端 192.168.10.30
被管理端 192.168.10.40

管理端安装Ansible

  1. 安装EPEL源
bash 复制代码
yum install -y epel-release

EPEL(Extra Packages for Enterprise Linux)源提供了许多额外的软件包,包括Ansible。

  1. 安装Ansible
bash 复制代码
yum install -y ansible

通过YUM包管理器安装Ansible,简单快捷。

目录结构

  • 配置文件/etc/ansible/ansible.cfg
    • 一般无需修改,包含Ansible的默认配置。
  • 主机清单/etc/ansible/hosts
    • 定义被管理的主机和组,便于分类和管理。
  • 公共角色目录/etc/ansible/roles
    • 用于存放Ansible角色,支持模块化管理。

配置主机清单

编辑/etc/ansible/hosts文件,配置主机组和主机信息:

ini 复制代码
[webservers]
192.168.10.30
[dbservers]
192.168.10.40
  • 组名和主机IP :通过组名(如webserversdbservers)管理不同类型的主机,便于分类和批量操作。

配置免密SSH登录

为了实现无需手动输入密码的自动化管理,配置管理端到被管理端的免密SSH登录:

  1. 生成密钥
bash 复制代码
ssh-keygen -t rsa

按提示生成RSA密钥对,默认保存在~/.ssh/目录下。

  1. 复制密钥到被管理节点
bash 复制代码
sshpass -p '登陆密码' ssh-copy-id root@192.168.10.30
sshpass -p '登录密码' ssh-copy-id root@192.168.10.40

使用sshpass工具自动输入密码,将公钥复制到被管理节点。注意:在生产环境中,建议使用更安全的方式来管理密码和密钥。

三、 Ansible基础命令及模块操作

Ansible通过简单的命令格式和丰富的模块,实现对被管理节点的自动化操作。以下是常用的命令格式和模块示例。

命令格式

bash 复制代码
ansible <组名> -m <模块> -a <参数>
  • <组名> :定义在主机清单中的组,如webserversdbservers
  • -m <模块> :指定要使用的模块,如commandshellyum等。
  • -a <参数>:传递给模块的参数,具体取决于所使用的模块。

常用模块示例

3.1 command模块

功能 :远程执行命令,不支持管道/重定向。
示例

bash 复制代码
ansible-doc -s command  # 列出command模块的描述信息和操作动作
ansible webservers -m command -a 'date'  # 在webservers组的所有主机上执行date命令
ansible all -m command -a 'ls /'  # 在所有主机上执行ls /命令



常用参数

  • chdir:在远程主机上运行命令前进入指定目录。
  • creates:判断指定文件是否存在,如果存在,不执行后面的操作。
  • removes :判断指定文件是否存在,如果存在,执行后面的操作。
    示例
bash 复制代码
ansible all -m command -a "chdir=/home ls ./"
3.2 shell模块

功能 :支持管道和shell特性,相当于调用远程主机的shell进程。
示例

bash 复制代码
ansible-doc -s shell  # 查看shell模块的描述信息
ansible dbservers -m shell -a 'echo 123456 | passwd --stdin test'  # 设置用户test的密码
ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2{print $2}") | cut -d" " -f2'




说明:Shell模块功能强大,但需谨慎使用,避免安全风险。

3.3 cron模块

功能 :管理计划任务,支持添加和移除任务。
示例

bash 复制代码
ansible-doc -s cron  # 查看cron模块的描述信息
ansible webservers -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test crontab"'  # 添加每分钟执行一次的cron任务
ansible webservers -a 'crontab -l'  # 查看当前用户的cron任务
ansible webservers -m cron -a 'name="test crontab" state=absent'  # 移除名为test crontab的cron任务




常用参数

  • minute/hour/day/month/weekday:定义计划任务的时间。
  • job:任务计划要执行的命令。
  • name:任务计划的名称。
  • state :任务状态,present表示添加(可省略),absent表示移除。
3.4 user模块

功能 :管理用户账户。
示例

bash 复制代码
ansible-doc -s user  # 查看user模块的描述信息
ansible dbservers -m user -a 'name="test01"'  # 创建用户test01
ansible dbservers -m command -a 'tail /etc/passwd'  # 查看用户列表
ansible dbservers -m user -a 'name="test01" state=absent'  # 删除用户test01




常用参数

  • name:用户名,必选参数。
  • statepresent表示创建,absent表示删除。
  • system:是否为系统账号。
  • uid:用户UID。
  • group:用户基本组。
  • shell:默认使用的shell。
  • move_home:如果设置的家目录已经存在,是否将已经存在的家目录进行移动。
  • password:用户的密码,建议使用加密后的字符串。
  • comment:用户的注释信息。
  • remove:当state=absent时,是否删除用户的家目录。
3.5 group模块

功能 :管理用户组。
示例

bash 复制代码
ansible-doc -s group  # 查看group模块的描述信息
ansible dbservers -m group -a 'name=mysql gid=306 system=yes'  # 创建mysql组
ansible dbservers -a 'tail /etc/group'  # 查看组列表
ansible dbservers -m user -a 'name=test01 uid=306 system=yes group=mysql'  # 将test01用户添加到mysql组中
ansible dbservers -a 'tail /etc/passwd'
ansible dbservers -a 'id test01'





常用参数

  • name:组名,必选参数。
  • gid:组GID。
  • system:是否为系统组。
3.6 copy模块

功能 :复制文件或内容到远程主机。
示例

bash 复制代码
ansible-doc -s copy  # 查看copy模块的描述信息
ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'  # 复制/etc/fstab到远程主机的/opt/fstab.bak
ansible dbservers -a 'ls -l /opt/'  # 查看/opt目录下的文件
ansible dbservers -a 'cat /opt/fstab.bak'  # 查看复制的文件内容
ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt'  # 将helloworld写入/opt/hello.txt文件中
ansible dbservers -a 'cat /opt/hello.txt'





常用参数

  • dest:目标路径,使用绝对路径。
  • src:源文件路径。
  • mode:目标文件的权限。
  • owner:目标文件的属主。
  • group:目标文件的属组。
  • content:直接指定复制到目标主机上的内容,不能与src一起使用。
3.7 file模块

功能 :管理文件属性和链接。
示例

bash 复制代码
ansible-doc -s file  # 查看file模块的描述信息
ansible dbservers -m file -a 'owner=test01 group=mysql mode=644 path=/opt/fstab.bak'  # 修改文件的属主、属组和权限
ansible dbservers -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'  # 创建符号链接
ansible dbservers -m file -a 'path=/opt/abc.txt state=touch'  # 创建一个空文件
ansible dbservers -m file -a 'path=/opt/abc.txt state=absent'  # 删除一个文件





常用参数

  • path:文件或目录的路径。
  • owner:属主。
  • group:属组。
  • mode:权限。
  • state :状态,如linktouchabsent等。
3.8 hostname模块

功能 :修改远程主机的主机名。
示例

bash 复制代码
ansible dbservers -m hostname -a 'name=mysq101'  # 将dbservers组的主机名修改为mysq101


说明:修改主机名后,可能需要重启系统或相关服务以使更改生效。

3.9 ping模块

功能 :检测主机的连通性。
示例

bash 复制代码
ansible all -m ping  # 检测所有主机的连通性


说明:Ping模块用于快速检查Ansible管理的主机是否在线和可访问。

3.10 yum模块

功能 :管理软件包的安装与卸载。
示例

bash 复制代码
ansible-doc -s yum  # 查看yum模块的描述信息
ansible webservers -m yum -a 'name=httpd'  # 在webservers组的主机上安装httpd服务
ansible webservers -m yum -a 'name=httpd state=absent'  # 卸载httpd服务



常用参数

  • name:软件包名称。
  • state :状态,present表示安装,absent表示卸载。
3.11 service/systemd模块

功能 :管理服务的运行状态。
示例

bash 复制代码
ansible-doc -s service  # 查看service模块的描述信息
ansible webservers -a 'systemctl status httpd'  # 查看httpd服务的运行状态
ansible webservers -m service -a 'enabled=true name=httpd state=started'  # 启动httpd服务并设置开机自启


常用参数

  • name:服务名称。
  • state :动作,如startedstoppedrestarted
  • enabled:是否设置开机自启。
  • runlevel:定义在哪些运行级别下自启动。
3.12 script模块

功能 :在远程主机上执行本地脚本。
示例

bash 复制代码
ansible-doc -s script  # 查看script模块的描述信息
vim test.sh  # 创建一个简单的脚本
#!/bin/bash
echo "hello ansible from script" > /opt/script.txt
chmod +x test.sh  # 赋予执行权限
ansible webservers -m script -a 'test.sh'  # 在webservers组的主机上执行test.sh脚本
ansible webservers -a 'cat /opt/script.txt'  # 查看脚本执行结果


说明:Script模块用于批量执行本地的Shell脚本,简化了脚本的分发和执行过程。

3.13 setup模块

功能 :收集被管理节点的系统信息(Facts)。
示例

bash 复制代码
ansible-doc -s setup  # 查看setup模块的描述信息
ansible webservers -m setup  # 获取webservers组主机的所有Facts信息
ansible dbservers -m setup -a 'filter=*ipv4'  # 使用filter筛选特定的Facts信息,如IPv4地址


说明:Setup模块用于获取被管理节点的详细系统信息,便于后续的配置和管理。

四、 Inventory主机清单与变量配置

4.1 Inventory支持对主机进行分组

Inventory文件(通常为/etc/ansible/hosts)用于定义被管理的主机和组,支持灵活的分组和变量配置。
示例

ini 复制代码
[webservers]
192.168.10.14:2222  # 冒号后定义远程连接端口,默认是SSH的22端口
192.168.10.1[2:5]   # 支持主机范围,如192.168.10.12到192.168.10.15

[dbservers]
db-[a:f].example.org  # 支持主机名匹配,如db-a.example.org到db-f.example.org

4.2 常用Inventory变

变量名 含义
ansible_host 节点IP
ansible_port SSH端口,默认22
ansible_user SSH用户
ansible_password SSH密码(未使用密钥时)
ansible_ssh_private_key_file 私钥文件
ansible_become 提升权限(如sudo)
ansible_become_method 提升方式(sudo/su/runas)
ansible_become_user 提升为指定用户
ansible_become_password 提升密码

基本示例

(1) 主机变量

为特定主机定义变量,覆盖全局或组变量。

ini 复制代码
[webservers]
192.168.10.14 ansible_port=2222 ansible_user=root ansible_password=abc1234
(2) 组变量

为整个组定义变量,适用于组内的所有主机。

ini 复制代码
[webservers:vars]
ansible_user=root
ansible_password=abc1234
[all:vars]
ansible_port=22
(3) 组嵌套

通过组嵌套,将多个组组合成一个更大的组,便于统一管理。

ini 复制代码
[nginx]
192.168.10.20
192.168.10.21
192.168.10.22
[apache]
192.168.10.30
192.168.10.31
192.168.10.32
192.168.10.33
[webs:children]
nginx
apache

说明 :通过组嵌套,可以将nginxapache组组合成webs组,便于统一管理所有Web服务器。

结语

  通过本文的介绍,您应该对Ansible有了一个全面的了解,包括其基本概念、运行机制、安装部署以及基础命令和模块操作。Ansible以其简单易用、功能强大和高度可扩展性,成为自动化运维领域的重要工具。无论是管理少量服务器还是大规模的基础设施,Ansible都能帮助您提高效率、降低复杂性,并确保系统的一致性和可靠性。

  在实际应用中,建议结合具体的业务需求,深入学习和使用Ansible的高级功能,如Playbook、角色(Roles)、模板(Templates)和变量(Variables)等,以实现更复杂和自动化的运维流程。同时,持续关注Ansible社区和官方文档,获取最新的功能更新和最佳实践,不断提升您的自动化运维能力。

  希望本文能为您的Ansible之旅提供有价值的指导和帮助,祝您在自动化运维的道路上取得更大的成功!

相关推荐
乘云数字DATABUFF3 天前
5分钟部署开源APM Databuff:OpenTelemetry全链路追踪入门实战
运维·后端
悠然南风5 天前
Ansible常见模块总结及LDAP Role 编写与调试
ansible
荣--5 天前
一键部署不是为了省时间 —— 它是把"买来的 PaaS"变成"自己的平台"的拐点
运维·zabbix·工程化·一键部署·平台化·边界设计
江华森5 天前
动手实战学 Docker — 从零到集群编排完全指南
运维
Avan_菜菜6 天前
FRP 内网穿透完整实战:从 HTTP 映射到 HTTPS 自签代理
运维·nginx·https
SelectDB7 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode8 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220709 天前
如何搭建本地yum源(上)
运维
大树8812 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠12 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql