欢迎光临
我们一直在努力

Ansible(一)—— 自动化运维工具 Ansible:集中化管理服务器完全指南

文章目录

  • 前言
  • 一、Ansible 概述和运行机制
    • 1.1 Ansible 概述
    • 1.2 Ansible 工作机制
    • 1.3 Ansible 角色 (Role)
  • 二、Ansible 环境安装部署
    • 2.1 环境规划
    • 2.2 安装步骤
    • 2.3 主机清单配置
    • 2.4 SSH免密登录配置
  • 三、Ansible 基础命令及模块操作
    • 3.1 基本命令格式
    • 3.2 常用模块详解
      • 3.2.1 command 模块
      • 3.2.2 shell 模块
      • 3.2.3 cron 模块
      • 3.2.4 user 模块
      • 3.2.5 group 模块
      • 3.2.6 copy 模块
      • 3.2.7 file 模块
      • 3.2.8 hostname 模块
      • 3.2.9 ping 模块
      • 3.2.10 yum 模块
      • 3.2.11 service/systemd 模块
      • 3.2.12 script 模块
      • 3.2.13 setup 模块
  • 四、Inventory 主机清单与变量配置
    • 4.1 主机分组管理
    • 4.2 Inventory变量配置
      • 4.2.1 主机变量配置
      • 4.2.2 组变量配置
      • 4.2.3 组嵌套配置
  • 总结

前言

在当今的IT运维环境中,随着服务器数量的不断增加和业务复杂度的提升,传统的手工运维方式已经无法满足效率和质量的要求。自动化运维工具应运而生。

其中Ansible以其简单易用、功能强大的特点成为了众多运维工程师的首选。本文将详细介绍Ansible的基本概念、安装配置、核心模块使用以及主机清单管理,帮助读者快速掌握这一强大的自动化运维工具。

一、Ansible 概述和运行机制

1.1 Ansible 概述

Ansible是一款面向类Unix系统的自由开源配置和自动化工具,采用Python语言编写。与其他自动化工具如SaltStack(Python C/S)、Puppet(ruby C/S)、Chef相比,Ansible具有以下显著优势:

  • 无需客户端:被管理节点无需安装任何客户端,实现真正的轻量级管理
  • 基于SSH协议:直接通过SSH协议与节点进行通信,安全可靠
  • YAML编排:使用简单易懂的YAML格式和Jinja2模板语言进行任务编排

官方网站:https://www.ansible.com/

其他自动化运维工具:

  • Puppet:ruby C/S http
  • SaltStack:Python C/S ssh,可以加入MQ
  • Chef:ruby C/S http

重要行业事件:

  • 2015年10月,红帽(Red Hat)宣布收购Ansible,交易金额约为1-1.5亿美元
  • Ansible公司成立于2013年,总部位于北卡罗来纳州达勒姆,联合创始人均为红帽前员工

Ansible核心特点:

  • 部署简单:只需在管理端安装,被控端无需额外操作
  • 协议标准:默认使用SSH协议管理设备,无需学习新协议
  • 集中管理:支持主从模式,实现集中化运维管理
  • 功能强大:配置简洁但功能丰富,扩展性极高
  • 扩展灵活:支持API和自定义模块,可通过Python轻松扩展
  • 编排强大:Playbook支持复杂任务配置和状态管理
  • 生态完善:对云计算和大数据平台有良好支持
  • 1.2 Ansible 工作机制

    Ansible通过SSH协议将模块推送到被管理节点执行,执行完成后自动删除临时文件。这种无代理的架构使得部署和维护变得极其简单。在实际生产环境中,可以结合SVN、Git等版本控制工具来管理自定义模块和任务编排。

    在这里插入图片描述

    Ansible核心组件:

  • Ansible引擎:核心引擎,核心控制中心,负责任务调度和执行
  • 模块系统:包含丰富的内置核心模块和可扩展的自定义模块
  • 插件机制:提供连接插件、邮件插件等扩展功能
  • Playbooks:任务剧本,使用YAML格式定义复杂的多任务操作流程
  • Inventory:主机清单,管理所有被控节点信息
  • 1.3 Ansible 角色 (Role)

    随着企业数据中心环境的日益复杂,单一的Playbook文件往往会变得臃肿且难以维护。Ansible角色(Role)机制应运而生,它提供了以下优势:

    • 模块化管理:将相关任务组织为独立、可复用的单元
    • 结构清晰:提供标准的目录结构,便于维护和理解
    • 灵活加载:支持从外部加载任务、处理程序和变量
    • 资源关联:可以关联静态文件、模板等资源文件
    • 复用性强:满足通用运维需求,可在不同项目中重复使用

    二、Ansible 环境安装部署

    2.1 环境规划

    在实际部署前,需要合理规划环境结构。以下是一个典型的生产环境示例:

    节点类型IP地址角色描述
    管理端 192.168.10.22 Ansible控制节点
    被管理端 192.168.10.14 Web服务器组
    被管理端 192.168.10.15 数据库服务器组

    2.2 安装步骤

    在管理端安装Ansible:

    # 安装EPEL源(CentOS/RHEL系统)
    yum install -y epel-release

    # 安装Ansible
    yum install -y ansible

    Ansible目录结构:

    /etc/ansible/
    ├── ansible.cfg # 主配置文件,通常使用默认配置即可
    ├── hosts # 主机清单文件,定义被管理节点
    └── roles/ # 公共角色目录,存放可复用的角色

    2.3 主机清单配置

    编辑/etc/ansible/hosts文件,配置主机分组:

    [webservers] # Web服务器组
    192.168.10.14 # 组里包含的被管理的主机IP地址或主机名(主机名需要先修改/etc/hosts文件)

    [dbservers] # 数据库服务器组
    192.168.10.15

    2.4 SSH免密登录配置

    为实现自动化管理,需要配置SSH密钥认证:

    # 生成SSH密钥对
    ssh-keygen -t rsa

    # 将公钥分发到被管理节点(需要输入目标主机密码)
    sshpass -p '000000' ssh-copy-id root@192.168.10.14
    sshpass -p '000000' ssh-copy-id root@192.168.10.15

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

    3.1 基本命令格式

    Ansible的基本命令格式如下:

    ansible <主机组名> -m <模块名> -a "<参数>"
    ansible-doc -l # 列出所有模块

    3.2 常用模块详解

    3.2.1 command 模块

    功能:在远程主机执行命令,不支持管道、重定向等shell特性

    # 查看command模块帮助
    # -s 列出指定模块的描述信息和操作动作
    ansible-doc -s command

    在这里插入图片描述

    # 基本使用示例
    ansible 192.168.10.14 -m command -a 'date' # 指定IP执行命令
    ansible webservers -m command -a 'date' # 指定组执行命令
    ansible dbservers -m command -a 'date'

    在这里插入图片描述

    ansible all -m command -a 'date' # 所有主机执行命令
    ansible all -a 'ls /' # 省略-m参数,默认使用command模块

    在这里插入图片描述

    # 常用的参数:
    chdir:在远程主机上运行命令前提前进入目录
    creates:判断指定文件是否存在,如果存在,不执行后面的操作
    removes:判断指定文件是否存在,如果存在,执行后面的操作
    # 高级参数使用
    ansible all -m command -a 'chdir=/home ls ./' # 执行前切换目录
    ansible all -m command -a 'creates=/tmp/file date' # 文件存在则不执行
    ansible all -m command -a 'removes=/tmp/file date' # 文件存在则执行

    在这里插入图片描述

    3.2.2 shell 模块

    功能:支持管道和shell特性的远程命令执行

    # 在远程主机执行命令,相当于调用远程主机的shell进程,然后在该shell下打开一个子shell运行命令(支持管道符号等功能)
    # 查看shell模块帮助
    ansible-doc -s shell

    # 使用示例
    ansible dbservers -m shell -a 'echo 123456 | passwd –stdin test'
    # 注意单引号与双引号,双引号中的$会识别成变量,所以要用\\转移
    ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print $2}") | cut -d " " -f2'
    ansible dbservers -m shell -a 'echo $(ifconfig ens33 | awk "NR==2 {print \\$2}")'

    在这里插入图片描述 在这里插入图片描述

    3.2.3 cron 模块

    功能:管理远程主机的计划任务

    # 在远程主机定义任务计划。其中有两种状态(state):present表示添加(可以省略),absent表示移除。
    # 查看cron模块帮助
    ansible-doc -s cron

    常用的参数:
    – minute/hour/day/month/weekday:分/时/日/月/周
    – job:任务计划要执行的命令
    – name:任务计划的名称

    # 创建计划任务
    ansible webservers -m cron -a 'minute="*/1" job="/bin/echo helloworld" name="test crontab"'

    # 查看计划任务
    ansible webservers -a 'crontab -l'

    # 删除计划任务,假如该计划任务没有取名字,name=None即可
    ansible webservers -m cron -a 'name="test crontab" state=absent'

    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

    3.2.4 user 模块

    功能:管理系统用户账户

    常用的参数:

    参数名可选值/类型说明
    name 字符串 用户名,必选参数
    state present / absent 创建账号或删除账号,present 表示创建,absent 表示删除
    system yes / no 是否为系统账号
    uid 整数 用户 UID
    group 字符串 用户基本组
    shell 字符串 默认使用的 Shell
    move_home yes / no 若家目录已存在,是否移动已存在的家目录
    password 字符串 用户密码,建议使用加密后的字符串
    comment 字符串 用户的注释信息
    remove yes / no 当 state=absent 时,是否删除用户的家目录

    # 查看user模块帮助
    ansible-doc -s user

    # 创建用户
    ansible dbservers -m user -a 'name="test01"'

    # 验证用户创建
    ansible dbservers -m command -a 'tail /etc/passwd'

    # 删除用户
    ansible dbservers -m user -a 'name="test01" state=absent'

    在这里插入图片描述 在这里插入图片描述

    3.2.5 group 模块

    功能:管理系统用户组

    # 查看group模块帮助
    ansible-doc -s group

    # 创建用户组mysql
    ansible dbservers -m group -a 'name=mysql gid=306 system=yes'
    ansible dbservers -a 'tail /etc/group'

    在这里插入图片描述 在这里插入图片描述

    # 将用户添加到组
    ansible dbservers -m user -a 'name=test01 uid=306 system=yes group=mysql'
    ansible dbservers -a 'tail /etc/passwd'
    # 验证配置
    ansible dbservers -a 'id test01'

    在这里插入图片描述 在这里插入图片描述

    3.2.6 copy 模块

    功能:复制本机文件或内容到远程主机

    参数名描述备注
    dest 目标文件或目录的绝对路径。若源为目录,目标也需为目录。若目标已存在会被覆盖。 必须参数
    src 源文件/目录路径(相对或绝对路径)。若为目录,目标也需为目录。 与content互斥
    mode 设置目标文件的权限(如644)。 支持八进制或符号模式(u=rw,g=r,o=r)
    owner 设置目标文件的属主(如root)。 需要Ansible主机有权限修改
    group 设置目标文件的属组(如www-data)。 需要Ansible主机有权限修改
    content 直接指定写入目标文件的内容(多行文本需用|)。 与src互斥,不能同时使用

    注意事项:

    • 当src为目录时,需确保目标路径以/结尾(如/opt/files/),否则会重命名目录。
    • mode参数在Windows目标主机上无效。
    • 若owner/group指定的用户/组不存在,任务会失败。

    # 查看copy模块帮助
    ansible-doc -s copy

    # 复制文件
    ansible dbservers -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'
    ansible dbservers -a 'ls -l /opt'
    ansible dbservers -a 'cat /opt/fstab.bak'

    在这里插入图片描述 在这里插入图片描述

    # 写入内容到文件
    ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt'
    ansible dbservers -a 'cat /opt/hello.txt'

    在这里插入图片描述

    3.2.7 file 模块

    功能:管理文件属性和状态,创建和删除模块

    # 查看file模块帮助
    ansible-doc -s file

    # 修改文件属性
    ansible dbservers -m file -a 'owner=simon group=mysql mode=644 path=/opt/fstab.bak'
    ansible dbservers -a 'ls -l /opt'

    在这里插入图片描述

    # 创建链接文件,设置/opt/fstab.link为/opt/fstab.bak的链接文件
    ansible dbservers -m file -a 'path=/opt/fstab.link src=/opt/fstab.bak state=link'
    ansible dbservers -a 'ls -l /opt'

    在这里插入图片描述

    # 创建和删除文件
    ansible dbservers -m file -a "path=/opt/abc.txt state=touch"
    ansible dbservers -a 'ls -l /opt'
    ansible dbservers -m file -a "path=/opt/abc.txt state=absent"

    在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

    3.2.8 hostname 模块

    功能:修改远程主机的主机名

    ansible dbservers -m hostname -a "name=mysql01"

    在这里插入图片描述

    3.2.9 ping 模块

    功能:检测主机的连通性

    ansible all -m ping

    在这里插入图片描述

    3.2.10 yum 模块

    功能:管理软件包的安装和卸载

    # 查看yum模块帮助
    ansible-doc -s yum

    # 安装软件包
    ansible webservers -m yum -a 'name=httpd'

    # 卸载软件包
    ansible webservers -m yum -a 'name=httpd state=absent'

    在这里插入图片描述 在这里插入图片描述

    3.2.11 service/systemd 模块

    功能:管理系统服务

    # 查看service模块帮助
    ansible-doc -s service

    # 常用的参数:
    – name:被管理的服务名称
    – state=started|stopped|restarted:动作包含启动关闭或者重启
    – enabled=yes|no:表示是否设置该服务开机自启
    – runlevel:如果设定了enabled开机自启,则要定义在哪些运行目标下自启动

    # 查看服务状态
    ansible webservers -a 'systemctl status httpd'

    # 启动服务并设置开机自启
    ansible webservers -m service -a 'enabled=true name=httpd state=started'

    在这里插入图片描述 在这里插入图片描述

    3.2.12 script 模块

    功能:在远程主机批量运行本地的 shell 脚本

    # 查看script模块帮助
    ansible-doc -s 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'

    # 验证执行结果
    ansible webservers -a 'cat /opt/script.txt'

    在这里插入图片描述 在这里插入图片描述

    3.2.13 setup 模块

    功能:收集被管理节点的系统信息

    facts 组件是用来收集被管理节点信息的,使用 setup 模块可以获取这些信息

    # 查看setup模块帮助
    ansible-doc -s setup

    # 获取webservers 组主机的facts信息
    ansible webservers -m setup

    # 过滤特定信息,使用filter可以筛选指定的facts信息
    ansible dbservers -m setup -a 'filter=*ipv4'

    在这里插入图片描述 补充:

    # 内存信息
    ansible all -m setup -a "filter=ansible_memory_mb*"

    # 具体内存信息
    ansible all -m setup -a "filter=ansible_memory_mb"
    ansible all -m setup -a "filter=ansible_swaptotal_mb"

    # 磁盘信息
    ansible all -m setup -a "filter=ansible_devices*"
    ansible all -m setup -a "filter=ansible_mounts*"

    # 具体磁盘信息
    ansible all -m setup -a "filter=ansible_devices"
    ansible all -m setup -a "filter=ansible_mounts"
    ansible all -m setup -a "filter=ansible_device_links"

    # 网络信息
    ansible all -m setup -a "filter=ansible_*ipv4*"
    ansible all -m setup -a "filter=ansible_default_ipv4*"

    # 具体 IP 信息
    ansible all -m setup -a "filter=ansible_default_ipv4"
    ansible all -m setup -a "filter=ansible_all_ipv4_addresses"

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

    4.1 主机分组管理

    Inventory支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。

    # 如果是名称类似的主机,可以使用列表的方式标识各个主机。
    # 基本分组
    vim /etc/ansible/hosts

    [webservers]
    192.168.10.14:2222 # 指定非标准SSH端口
    192.168.10.1[2:5] # 支持数字范围匹配

    [dbservers]
    db-[a:f].example.org # 支持字母范围匹配

    4.2 Inventory变量配置

    Ansible提供了丰富的变量来定制连接和行为:

    变量名说明
    ansible_host 节点IP地址
    ansible_port SSH端口,默认22
    ansible_user SSH连接用户名
    ansible_password SSH密码(密钥认证时不需要)
    ansible_ssh_private_key_file SSH私钥文件路径
    ansible_become 是否提升权限
    ansible_become_method 权限提升方式(sudo/su/runas)
    ansible_become_user 提升为指定用户
    ansible_become_password 权限提升密码

    变量优先级: 命令行参数- –》playbooks 变量 —》 主机变量 —>组变量—》全局变量

    4.2.1 主机变量配置

    [webservers]
    192.168.10.16 ansible_port=22 ansible_user=root ansible_password=000000

    在这里插入图片描述 在这里插入图片描述

    4.2.2 组变量配置

    [webservers]
    192.168.10.16

    [webservers:vars]
    ansible_user=root
    ansible_password=000000

    [all:vars]
    ansible_port=22

    在这里插入图片描述

    ansible webservers -m ping

    在这里插入图片描述

    4.2.3 组嵌套配置

    # 定义基础组
    [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

    # 组嵌套,下面只能写组名,children是关键字
    [webs:children]
    nginx
    apache

    在这里插入图片描述 在这里插入图片描述

    总结

    通过本文的详细介绍,我们全面了解了Ansible这一强大的自动化运维工具。

    ansibe是一个自动化运维工具,通过ssh对目标主机进行配置、应用部署、任务执行、编排调度等 操作。 它主要简化了复杂的环境管理和自动化任务,提高工作效率,同时 ansibel的剧本(playbooks)可以使用YMAL语言编写,易于运维或扩展。

    从基本概念到实际操作,从模块使用到主机管理,Ansible展现出了其在自动化运维领域的独特优势:

  • 简单易用:基于SSH和YAML,学习成本低,上手速度快
  • 功能全面:丰富的模块库覆盖了日常运维的各个方面
  • 扩展性强:支持自定义模块和插件,满足个性化需求
  • 安全可靠:无代理架构减少安全风险,基于SSH保证通信安全
  • 社区活跃:拥有庞大的用户社区和丰富的文档资源
  • 在实际生产环境中,合理运用Ansible可以大幅提升运维效率,减少人为错误,实现运维工作的标准化和自动化。建议读者在掌握基础知识后,进一步学习Playbook编写、角色管理、Ansible Tower等高级功能,构建完整的自动化运维体系。

    随着云计算和容器技术的普及,自动化运维的重要性日益凸显。掌握Ansible这样的工具,不仅是技术能力的提升,更是适应现代IT运维发展趋势的必然要求。希望本文能为您的Ansible学习之路提供有力的帮助!

    赞(0)
    未经允许不得转载:171主机测评 » Ansible(一)—— 自动化运维工具 Ansible:集中化管理服务器完全指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址