文章目录
- 前言
- [一、Ansible 概述和运行机制](#一、Ansible 概述和运行机制)
-
- [1.1 Ansible 概述](#1.1 Ansible 概述)
- [1.2 Ansible 工作机制](#1.2 Ansible 工作机制)
- [1.3 Ansible 角色 (Role)](#1.3 Ansible 角色 (Role))
- [二、Ansible 环境安装部署](#二、Ansible 环境安装部署)
-
- [2.1 环境规划](#2.1 环境规划)
- [2.2 安装步骤](#2.2 安装步骤)
- [2.3 主机清单配置](#2.3 主机清单配置)
- [2.4 SSH免密登录配置](#2.4 SSH免密登录配置)
- [三、Ansible 基础命令及模块操作](#三、Ansible 基础命令及模块操作)
-
- [3.1 基本命令格式](#3.1 基本命令格式)
- [3.2 常用模块详解](#3.2 常用模块详解)
-
- [3.2.1 command 模块](#3.2.1 command 模块)
- [3.2.2 shell 模块](#3.2.2 shell 模块)
- [3.2.3 cron 模块](#3.2.3 cron 模块)
- [3.2.4 user 模块](#3.2.4 user 模块)
- [3.2.5 group 模块](#3.2.5 group 模块)
- [3.2.6 copy 模块](#3.2.6 copy 模块)
- [3.2.7 file 模块](#3.2.7 file 模块)
- [3.2.8 hostname 模块](#3.2.8 hostname 模块)
- [3.2.9 ping 模块](#3.2.9 ping 模块)
- [3.2.10 yum 模块](#3.2.10 yum 模块)
- [3.2.11 service/systemd 模块](#3.2.11 service/systemd 模块)
- [3.2.12 script 模块](#3.2.12 script 模块)
- [3.2.13 setup 模块](#3.2.13 setup 模块)
- [四、Inventory 主机清单与变量配置](#四、Inventory 主机清单与变量配置)
-
- [4.1 主机分组管理](#4.1 主机分组管理)
- [4.2 Inventory变量配置](#4.2 Inventory变量配置)
-
- [4.2.1 主机变量配置](#4.2.1 主机变量配置)
- [4.2.2 组变量配置](#4.2.2 组变量配置)
- [4.2.3 组嵌套配置](#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:
bash
# 安装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
文件,配置主机分组:
ini
[webservers] # Web服务器组
192.168.10.14 # 组里包含的被管理的主机IP地址或主机名(主机名需要先修改/etc/hosts文件)
[dbservers] # 数据库服务器组
192.168.10.15
2.4 SSH免密登录配置
为实现自动化管理,需要配置SSH密钥认证:
bash
# 生成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的基本命令格式如下:
bash
ansible <主机组名> -m <模块名> -a "<参数>"
ansible-doc -l # 列出所有模块
3.2 常用模块详解
3.2.1 command 模块
功能 :在远程主机执行命令,不支持管道、重定向等shell特性
bash
# 查看command模块帮助
# -s 列出指定模块的描述信息和操作动作
ansible-doc -s command

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

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

bash
# 常用的参数:
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特性的远程命令执行
bash
# 在远程主机执行命令,相当于调用远程主机的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 模块
功能:管理远程主机的计划任务
bash
# 在远程主机定义任务计划。其中有两种状态(state):present表示添加(可以省略),absent表示移除。
# 查看cron模块帮助
ansible-doc -s cron
常用的参数:
- minute/hour/day/month/weekday:分/时/日/月/周
- job:任务计划要执行的命令
- name:任务计划的名称
bash
# 创建计划任务
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 时,是否删除用户的家目录 |
bash
# 查看user模块帮助
ansible-doc -s user
bash
# 创建用户
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 模块
功能:管理系统用户组
bash
# 查看group模块帮助
ansible-doc -s group
# 创建用户组mysql
ansible dbservers -m group -a 'name=mysql gid=306 system=yes'
ansible dbservers -a 'tail /etc/group'
bash
# 将用户添加到组
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
为目录时,需确保目标路径以/
结尾(如/opt/files/
),否则会重命名目录。 mode
参数在Windows目标主机上无效。- 若
owner
/group
指定的用户/组不存在,任务会失败。
bash
# 查看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'
bash
# 写入内容到文件
ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt'
ansible dbservers -a 'cat /opt/hello.txt'

3.2.7 file 模块
功能:管理文件属性和状态,创建和删除模块
bash
# 查看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'

bash
# 创建链接文件,设置/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'

bash
# 创建和删除文件
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 模块
功能:修改远程主机的主机名
bash
ansible dbservers -m hostname -a "name=mysql01"

3.2.9 ping 模块
功能:检测主机的连通性
bash
ansible all -m ping

3.2.10 yum 模块
功能:管理软件包的安装和卸载
bash
# 查看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 模块
功能:管理系统服务
bash
# 查看service模块帮助
ansible-doc -s service
# 常用的参数:
- name:被管理的服务名称
- state=started|stopped|restarted:动作包含启动关闭或者重启
- enabled=yes|no:表示是否设置该服务开机自启
- runlevel:如果设定了enabled开机自启,则要定义在哪些运行目标下自启动
bash
# 查看服务状态
ansible webservers -a 'systemctl status httpd'
# 启动服务并设置开机自启
ansible webservers -m service -a 'enabled=true name=httpd state=started'
3.2.12 script 模块
功能:在远程主机批量运行本地的 shell 脚本
bash
# 查看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 模块可以获取这些信息
bash
# 查看setup模块帮助
ansible-doc -s setup
# 获取webservers 组主机的facts信息
ansible webservers -m setup
# 过滤特定信息,使用filter可以筛选指定的facts信息
ansible dbservers -m setup -a 'filter=*ipv4'
补充:
bash
# 内存信息
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支持对主机进行分组,每个组内可以定义多个主机,每个主机都可以定义在任何一个或多个主机组内。
ini
# 如果是名称类似的主机,可以使用列表的方式标识各个主机。
# 基本分组
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 主机变量配置
ini
[webservers]
192.168.10.16 ansible_port=22 ansible_user=root ansible_password=000000
4.2.2 组变量配置
ini
[webservers]
192.168.10.16
[webservers:vars]
ansible_user=root
ansible_password=000000
[all:vars]
ansible_port=22

bash
ansible webservers -m ping

4.2.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
# 组嵌套,下面只能写组名,children是关键字
[webs:children]
nginx
apache
总结
通过本文的详细介绍,我们全面了解了Ansible这一强大的自动化运维工具。
ansibe是一个自动化运维工具,通过ssh对目标主机进行配置、应用部署、任务执行、编排调度等 操作。 它主要简化了复杂的环境管理和自动化任务,提高工作效率,同时 ansibel的剧本(playbooks)可以使用YMAL语言编写,易于运维或扩展。
从基本概念到实际操作,从模块使用到主机管理,Ansible展现出了其在自动化运维领域的独特优势:
- 简单易用:基于SSH和YAML,学习成本低,上手速度快
- 功能全面:丰富的模块库覆盖了日常运维的各个方面
- 扩展性强:支持自定义模块和插件,满足个性化需求
- 安全可靠:无代理架构减少安全风险,基于SSH保证通信安全
- 社区活跃:拥有庞大的用户社区和丰富的文档资源
在实际生产环境中,合理运用Ansible可以大幅提升运维效率,减少人为错误,实现运维工作的标准化和自动化。建议读者在掌握基础知识后,进一步学习Playbook编写、角色管理、Ansible Tower等高级功能,构建完整的自动化运维体系。
随着云计算和容器技术的普及,自动化运维的重要性日益凸显。掌握Ansible这样的工具,不仅是技术能力的提升,更是适应现代IT运维发展趋势的必然要求。希望本文能为您的Ansible学习之路提供有力的帮助!