公司动态
Ansible 自动化运维:原理、安装、配置及核心模块详解
核心定义Ansible 是一款开源自动化运维工具集成了 Puppet、Chef、Fabric 等工具的核心优点可实现批量系统配置、批量程序部署、批量命令执行。Ansible 本身无批量执行能力仅提供运维框架真正实现批量操作的是各类功能模块。核心四大组件connection plugins连接插件负责管控节点与被管控节点通信默认使用 SSH 连接支持 ZEROMQ 等其他方式。host inventory主机清单核心配置文件定义所有被管控主机的 IP、端口、账号密码、分组等信息。modules模块运维核心包含系统核心模块、命令模块、自定义模块实现各类运维操作。plugins插件模块功能补充包含连接插件、邮件通知插件等。playbook剧本多任务编排文件用于复杂批量运维场景。六大核心特性no agents被管控主机无需安装任何客户端仅需管控节点更新即可运维成本极低。no server无服务端架构无需部署、启动、维护后台服务直接执行命令即可使用。modules in any languages基于模块工作支持任意语言开发自定义模块扩展性极强。yaml, not code采用 YAML 语法编写剧本无需复杂编码可读性强、易上手。ssh by default默认基于原生 SSH 协议通信安全可靠无需额外配置通信通道。strong multi-tier solution支持多级运维指挥适配复杂集群、多层业务架构。工作原理与执行流程核心工作机制Ansible 分为管理节点和被管理节点两类角色。管理节点将 Ad-hoc 临时命令或 Playbook 剧本转换为 Python 临时脚本通过 SSH 协议传输至所有被管控主机远程执行后实时返回执行结果执行完毕自动清理临时脚本。完整执行步骤加载默认主配置文件/etc/ansible/ansible.cfg读取主机清单文件匹配需要执行操作的主机/主机组加载对应功能模块如 command、copy、service 模块自动生成临时 Python 脚本通过 SSH 传输至远程主机远程主机将脚本存放至.ansible/tmp/临时目录自动赋予脚本执行权限并运行脚本将执行结果实时回传至管理节点自动删除远程临时脚本完成一次批量运维操作。Ansible 两种安装方式Ansible 仅需在管控节点安装所有被管控节点无需任何部署提供 YUM 和 PIP 两种主流安装方式按需选择即可。YUM 安装需先配置 EPEL 扩展源CentOS 默认源无 Ansible 安装包# 安装 EPEL 源 yum install -y epel-release # 安装 Ansible yum install ansible -y # 验证安装 ansible --versionPIP 安装适合自定义版本# 安装 pip 工具 yum install -y python-pip # pip 安装 ansible pip install ansible # 验证版本 ansible --versionAnsible 核心配置文件详解配置文件优先级由高到低Ansible 配置文件为多级查找机制优先级从高到低高优先级配置覆盖低优先级环境变量ANSIBLE_CONFIG指定的配置文件当前用户家目录下~/.ansible.cfg系统默认全局配置/etc/ansible/ansible.cfg。主配置文件 ansible.cfg 核心参数YUM 安装默认主配置路径/etc/ansible/ansible.cfg常用核心参数如下# 主机清单文件路径 inventory /etc/ansible/hosts # 模块存放目录 library /usr/share/ansible # 批量并发连接数默认 5 forks 5 # 默认执行命令的用户 sudo_user root # 被管控节点 SSH 端口 remote_port 22 # 是否校验 SSH 主机密钥 host_key_checking False # SSH 连接超时时间 timeout 60 # 日志存储路径默认不记录日志 log_path /var/log/ansible.log主机清单 hosts 配置核心重点主机清单是 Ansible 的核心配置文件用于定义所有被管控主机的 IP、分组、SSH 端口、账号密码、自定义变量等默认路径/etc/ansible/hosts。基础配置语法# 1. 未分组主机直接写 IP/域名 192.168.10.11 # 2. 自定义主机分组 [webservers] 192.168.10.128 # 指定非默认 SSH 端口 Bar.example.com ansible_ssh_port2000 # 主机别名配置 web1 ansible_ssh_host192.168.1.50 # 3. 通配符批量配置主机 www[01:50].example.com # 匹配 www01-www50 db-[a:f].example.com # 匹配 db-a~db-f主机/分组变量配置# 单主机自定义变量 [atlanta] host1 http_port8080 maxRequestsPerChild808 host2 maxRequestsPerChild909 # 分组统一变量组内所有主机生效 [atlanta:vars] ntp_serverntp.atlanta.example.com proxyproxy.atlanta.example.com http_port80 # 嵌套分组继承子分组所有主机 [raleigh] host3 host4 [southeast:children] atlanta raleigh [southeast:vars] some_serverfoo.southeast.example.com常用内置主机变量内置变量作用说明使用示例ansible_ssh_host指定主机 SSH 连接 IPansible_ssh_host192.168.1.100ansible_ssh_port指定主机 SSH 端口ansible_ssh_port2222ansible_ssh_pass指定主机 SSH 密码ansible_ssh_pass123456ansible_sudo_pass指定 sudo 提权密码ansible_sudo_pass123456ansible_python_interpreter指定 Python 解释器路径ansible_python_interpreter/bin/python3清单信息查看命令# 树形展示所有主机分组信息 ansible-inventory --graphAnsible Ad-hoc 临时命令详解Ad-hoc 即临时命令适用于一次性、简单批量运维场景如批量查看端口、批量拷贝文件、批量检测主机存活无需编写剧本直接命令行执行简单高效。复杂重复运维场景建议使用 Playbook。核心语法ansible pattern -m module_name -a arguments参数详解pattern匹配目标主机支持主机名、IP、分组、all所有主机、通配符、切片-m指定模块名称默认 command 模块-a传递给模块的执行参数-i指定自定义主机清单文件-k交互式输入 SSH 密码未配置密钥时使用。模块帮助查询命令# 查看所有可用模块 ansible-doc -l # 查看指定模块详细用法、参数、案例 ansible-doc 模块名Ansible 核心常用模块实战模块是 Ansible 运维的核心下面详解生产环境最常用的 13 大模块附带完整实操案例可直接复用。ping 模块主机连通性检测最基础模块用于批量检测被管控主机是否在线、SSH 通信是否正常无额外参数。# 检测 web 分组所有主机连通性 ansible web -m ping返回pong即代表主机连通正常是所有批量操作的前置检测。command 模块基础命令执行默认执行模块用于远程执行基础 Linux 命令不支持管道、重定向、环境变量等 shell 特性执行效率最高。常用参数chdir执行命令前切换到指定目录creates文件存在则跳过命令执行removes文件不存在则跳过命令执行。# 切换目录执行 ls ansible web -m command -a chdir/data/ ls # 文件存在则不执行命令 ansible web -m command -a creates/data/aaa.jpg ls # 文件存在则执行命令 ansible web -m command -a removes/data/aaa.jpg cat /data/ashell 模块高级命令执行兼容所有 shell 特性支持管道、grep、重定向、变量解析适合复杂命令执行用法与 command 一致。# 批量过滤指定用户 ansible web -m shell -a cat /etc/passwd | grep keercopy 模块文件批量推送将管控节点文件/内容批量推送至远程主机支持权限修改、文件备份、内容直接生成。常用参数src本地源文件路径dest远程目标绝对路径content直接指定文件内容替代 srcbackup文件变更时自动备份mode设置文件权限force是否强制覆盖文件。# 推送本地文件至远程主机 ansible web -m copy -a src~/hello dest/data/hello # 直接生成文件并设置权限 ansible web -m copy -a contentI am keer\n dest/data/name mode666 # 修改文件并自动备份原文件 ansible web -m copy -a contentI am keerya\n backupyes dest/data/name mode666file 模块文件/目录管理用于批量创建/删除文件、目录、软链接修改文件权限、属主属组。state 状态参数directory创建目录touch创建空文件link/hard创建软/硬链接absent删除文件/目录/链接。# 创建目录 ansible web -m file -a path/data/app statedirectory # 创建软链接 ansible web -m file -a path/data/bbb.jpg srcaaa.jpg statelink # 删除文件 ansible web -m file -a path/data/a stateabsentfetch 模块远程文件拉取与 copy 模块相反批量从远程主机拉取文件至管控节点仅支持文件不支持目录自动按主机 IP 分层存储。# 拉取远程文件至本地 /data 目录 ansible web -m fetch -a src/data/hello dest/data存储路径/data/主机IP/data/hello自动区分不同主机文件避免覆盖。cron 模块定时任务管理批量管理远程主机 crontab 定时任务语法兼容原生 crontab支持新增、删除定时任务。# 新增每 5 分钟同步时间的定时任务 ansible web -m cron -a namentp update every 5 min minute*/5 job/sbin/ntpdate 172.17.0.1 /dev/null # 查看定时任务 ansible web -m shell -ayum模块软件批量安装卸载基于yum源批量管理软件适配CentOS系统支持安装、卸载、更新软件。state参数• present/latest安装/安装最新版本• absent卸载软件。# 安装htop工具 ansible web -m yum -a namehtop statepresent 卸载htop工具 ansible web -m yum -a namehtop stateabsentservice模块服务启停管理批量管理系统服务支持启动、停止、重启、重载、设置开机自启。state参数• started启动服务• stopped停止服务• restarted重启服务• reloaded重载配置。# 启动nginx并设置开机自启 ansible web -m service -a namenginx statestarted enabledtrue 停止nginx服务 ansible web -m service -a namenginx statestoppeduser/group模块用户组管理批量创建、删除系统用户和用户组支持指定UID、GID、家目录、登录shell等。# 创建指定UID用户 ansible web -m user -a namekeer uid11111 删除用户 ansible web -m user -a namekeer stateabsent 创建用户组 ansible web -m group -a namesanguo gid12222 删除用户组 ansible web -m group -a namesanguo stateabsentscript模块脚本批量执行将管控节点本地脚本批量传输至远程主机并执行无需手动上传脚本一键批量运行。# 1. 本地编写脚本并授权 vim /tmp/df.sh #!/bin/bash date /tmp/disk_total.log df -lh /tmp/disk_total.log chmod x /tmp/df.sh 2. 批量执行脚本 ansible web -m script -a /tmp/df.shsetup模块主机信息采集自动采集远程主机硬件、系统、资源、网络等所有信息facts变量可过滤指定信息常用于剧本条件判断。# 批量查看主机内存信息 ansible web -m setup -a filter*mem* 批量采集主机信息并保存至本地 ansible web -m setup -a filtermem --tree /tmp/factslineinfile模块文件单行修改精准修改、删除文件单行内容替代sed命令适合修改配置文件单行参数避免全局替换出错。# 批量关闭SELinux ansible localhost -m lineinfile -a path/etc/selinux/config regexp^SELINUX lineSELINUXdisabled 修改Apache默认端口 ansible localhost -m lineinfile -a path/etc/httpd/conf/httpd.conf regexp^Listen lineListen 8080 insertafter^#Listen