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之旅提供有价值的指导和帮助,祝您在自动化运维的道路上取得更大的成功!

相关推荐
✎﹏赤子·墨筱晗♪2 小时前
Ansible Playbook 入门指南:从基础到实战
linux·服务器·ansible
小白不想白a2 小时前
【Ansible】使用ansible部署k8s集群前的准备工作脚本
容器·kubernetes·ansible
m0_464608262 小时前
Ansible Playbook:自动化配置管理的利器
运维·自动化·ansible
DDC楼宇自控与IBMS集成系统解读2 小时前
DDC 楼宇自控系统 + 3D 可视化运维管理平台融合解决方案
运维·3d
乌萨奇也要立志学C++3 小时前
【Linux】进程概念(六):进程地址空间深度解析:虚拟地址与内存管理的奥秘
linux·运维
YAY_tyy8 小时前
【JavaScript 性能优化实战】第六篇:性能监控与自动化优化
javascript·性能优化·自动化
tritone9 小时前
我在阿贝云免费服务器上搭建RustDesk自建服务器(Self-Hosting)的真实体验【推荐】
运维·服务器
2301_800050999 小时前
DNS 服务器
linux·运维·笔记
慌糖10 小时前
自动化接口框架搭建分享-pytest第二部分
运维·自动化·pytest