新手入门指南:在快马平台从零开始构建你的第一个极客日报
2026/6/6 11:10:17
在云计算与大数据时代,运维工作早已告别 “单机手动操作” 的模式,自动化、集中化、模块化成为运维效率提升的核心关键词。Ansible 作为一款由 Python 编写的开源自动化运维工具,凭借 “无需被控端客户端、基于 SSH 协议通信、配置简洁灵活” 等核心优势,迅速成为运维领域的主流选择,广泛应用于批量部署、配置管理、任务编排等场景。
Ansible 是一款面向类 Unix 系统的自由开源自动化运维工具,由 Python 编写,与 SaltStack、Puppet、Chef 相比,核心优势如下:
| 组件 | 功能描述 |
|---|---|
| Ansible | 核心引擎,负责任务调度、节点通信与模块分发 |
| Modules | 执行具体操作的核心单元,含内置模块(如 ping、yum)和自定义模块 |
| Plugins | 补充功能模块,包括连接插件(SSH 通信)、邮件插件、日志插件等 |
| Playbooks | 剧本文件,以 YAML 格式定义多任务编排、依赖关系与状态管理 |
| Inventory | 主机清单,记录被控端的 IP、分组、SSH 连接参数等配置 |
| Roles | 模块化管理复杂 Playbook,支持任务复用、外部变量加载,有严格目录结构要求 |
| 节点类型 | IP 示例 | 角色职责 |
|---|---|---|
| 管理端 | 192.168.10.23 | 安装 Ansible,执行自动化任务 |
| 被控端 | 192.168.10.14/15 | 接收管理端指令,执行具体操作 |
# 1. 安装 EPEL 源(解决依赖包获取问题)yuminstall-y epel-release# 2. 安装 Ansible 核心程序yuminstall-y ansible/etc/ansible/ ├── ansible.cfg # 全局配置文件(关键参数可修改,如禁用主机密钥检查) ├── hosts # 主机清单(必配,定义被控端分组与连接信息) └── roles/ # 公共角色目录(存放可复用的 Role 模块)支持分组、端口指定、主机范围匹配,基础配置示例:
# 基础分组配置 [webservers] # 网站服务器组 192.168.10.14 # 单个被控端 IP 192.168.10.1[2:5] # 范围匹配(192.168.10.12-192.168.10.15) 192.168.10.16:2222 # 非默认 SSH 端口(冒号后指定端口) [dbservers] # 数据库服务器组 db-[a:f].example.org # 字母匹配(db-a 至 db-f 共 6 台主机) # 组嵌套配置(父组包含子组) [nginx] 192.168.10.20-22 [apache] 192.168.10.30-33 [webs:children] # webs 组包含 nginx 和 apache 子组 nginx apache# 1. 管理端生成 SSH 密钥(一路回车,设置空密码)ssh-keygen -t rsa# 2. 推送公钥到被控端(两种方式)# 方式一:手动输入被控端密码(适合少量节点)ssh-copy-id root@192.168.10.14# 方式二:sshpass 自动输入密码(适合批量部署)sshpass -p'被控端root密码'ssh-copy-id root@192.168.10.14[defaults] host_key_checking = False # 禁用 SSH 主机密钥交互(解决 yes/no 弹窗) timeout = 10 # 设置 SSH 连接超时时间(默认 10 秒) [ssh_connection] ssh_args = -o ControlMaster=auto -o ControlPersist=60s # 保持连接复用,提升效率通过变量统一配置被控端连接参数(如 SSH 用户名、端口),避免重复编写,支持主机变量、组变量、全局变量。
| 变量名 | 含义说明 |
|---|---|
| ansible_host | 被控端 IP 地址(当主机名无法解析时使用) |
| ansible_port | SSH 连接端口(默认 22,非默认需指定) |
| ansible_user | SSH 登录用户名(如 root、admin) |
| ansible_password | SSH 登录密码(未使用免密时配置) |
| ansible_ssh_private_key_file | 私钥文件路径(免密登录时指定) |
| ansible_become | 是否提升权限(如 sudo,值为 yes/no) |
| ansible_become_method | 权限提升方式(sudo/su/runas) |
| ansible_become_user | 提升后的目标用户(如 root) |
| ansible_become_password | 权限提升密码(如 sudo 密码) |
[webservers] 192.168.10.14 ansible_port=22 ansible_user=root ansible_password=abc1234[webservers:vars] # webservers 组所有节点生效 ansible_user=root ansible_password=abc1234 [all:vars] # 所有被控端全局生效 ansible_port=22每个模块均提取文档原生示例,附加参数解释、执行逻辑和应用场景,兼顾理论与实操。
ansible all -mcommand-a"chdir=/home ls ./"注释
all:目标对象(所有被控端,可替换为组名webservers、IP192.168.10.14)chdir=/home:执行命令前先切换到/home目录(command 模块核心参数)ls ./:实际执行的命令(列出当前目录内容)/home目录下执行ls命令,不支持|(管道)、>(重定向)等 Shell 特性ansible dbservers -m shell -a'echo 123456 | passwd --stdin test'注释
dbservers:目标组(仅对数据库服务器组执行)echo 123456:生成密码字符串(123456)|:管道符(Shell 特性,command 模块不支持,这是选择 shell 模块的核心原因)passwd --stdin test:通过标准输入给test用户设置密码(批量修改用户密码常用)dbservers组所有被控端的test用户统一设置密码为 123456,利用 Shell 管道符实现批量操作ansible webservers -mcron-a'minute="*/1" job="/bin/echo helloworld" name="test crontab"'注释
webservers:目标组(仅对 web 服务器组执行)minute="*/1":执行频率(每分钟执行 1 次,*表示所有单位,*/n表示每隔 n 单位)job="/bin/echo helloworld":计划任务执行的命令(输出 helloworld)name="test crontab":计划任务名称(唯一标识,后续删除需用此名称)state=present:默认参数(可省略),表示「添加」计划任务(删除用state=absent)test crontabansible webservers -m cron -a 'name="test crontab" state=absent'ansible dbservers -m user -a'name="test01" uid=306 system=yes group=mysql'注释
name="test01":用户名(必选参数,创建/删除用户的核心标识)uid=306:指定用户 UID(唯一标识,避免与现有用户冲突)system=yes:创建为系统用户(系统用户 UID 通常小于 1000,默认no为普通用户)group=mysql:指定用户基本组为mysql(需提前通过 group 模块创建该组)dbservers组所有被控端创建系统用户test01,UID=306,归属于mysql组ansible dbservers -m user -a 'name="test01" state=absent'(加remove=yes可删除家目录)ansible dbservers -m group -a'name=mysql gid=306 system=yes'注释
name=mysql:用户组名称(必选参数,创建/删除组的核心标识)gid=306:指定组 GID(组唯一标识,避免与现有组冲突)system=yes:创建为系统组(系统组 GID 通常小于 1000,默认no为普通组)dbservers组所有被控端创建系统组mysql,GID=306ansible dbservers -m copy -a'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=640'注释
src=/etc/fstab:管理端本地源文件路径(需确保文件存在)dest=/opt/fstab.bak:被控端目标路径(绝对路径,文件名为fstab.bak)owner=root:远程文件属主为root用户mode=640:远程文件权限为640(所有者可读可写,组可读,其他无权限)/etc/fstab文件复制到所有数据库服务器的/opt目录备份,同时设置属主和权限ansible dbservers -m copy -a 'content="helloworld" dest=/opt/hello.txt'(无需本地文件,直接写入字符串)ansible dbservers -mfile-a'path=/opt/fstab.link src=/opt/fstab.bak state=link'注释
path=/opt/fstab.link:被控端目标路径(要创建的软链接文件)src=/opt/fstab.bak:被链接的原始文件(需已存在于被控端)state=link:操作类型(创建软链接,state=touch创建空文件,state=absent删除文件)/opt/fstab.link软链接,指向/opt/fstab.bak文件ansible dbservers -m file -a 'path=/opt/fstab.bak mode=644'ansible dbservers -mhostname-a"name=mysql01"注释
name=mysql01:被控端新主机名(唯一参数)dbservers组所有被控端的主机名统一修改为mysql01(实际部署建议按节点区分,如mysql01/mysql02)ansible all -mping注释
all:目标对象(所有被控端)"ping": "pong"ansible webservers -m yum -a'name=httpd'注释
webservers:目标组(仅对 web 服务器组执行)name=httpd:要安装的软件包名称(httpd 即 Apache 服务)state=present:默认参数(可省略),表示「安装」软件包(卸载用state=absent)ansible webservers -m yum -a 'name=httpd state=absent'ansible webservers -mservice-a'enabled=true name=httpd state=started'注释
enabled=true:设置服务开机自启(false为关闭自启)name=httpd:要管理的服务名称(需与系统服务名一致)state=started:服务操作(started启动、stopped停止、restarted重启)ansible webservers -a 'systemctl status httpd'(默认使用 command 模块)# 第一步:管理端创建脚本并加执行权限vimtest.sh#!/bin/bashecho"hello ansible from script">/opt/script.txtchmod+x test.sh# 第二步:远程执行脚本ansible webservers -m script -a'test.sh'注释
chmod +x test.sh)test.sh:管理端本地脚本路径(相对路径或绝对路径均可)test.sh脚本推送到所有 web 服务器,自动执行,结果写入被控端/opt/script.txtansible dbservers -m setup -a'filter=*ipv4'注释
dbservers:目标组(仅收集数据库服务器信息)filter=*ipv4:筛选参数(仅返回 IPv4 相关信息,*为通配符)dbservers组所有被控端的 IPv4 地址信息,不筛选则返回完整系统信息(CPU、内存、网卡、系统版本等)ansible<目标>-m<模块>-a<参数># 完整格式ansible<目标>-a<命令># 省略 -m 时,默认使用 command 模块webservers)、all(所有被控端)/root/.ssh目录权限为 700,authorized_keys文件权限为 600,且sshd_config开启PermitRootLogin yesansible.cfg中host_key_checking = False,全局禁用密钥检查command,需 Shell 特性用shell,批量操作(装软件、改服务)用对应功能模块(yum/service)Ansible 凭借「无客户端、SSH 通信、配置简洁、模块化」等特点,成为自动化运维首选工具,适用于批量部署、配置管理、任务编排等场景,尤其适合中小规模集群的集中化管理。