拓冰建站拓冰建站
首页 / 资讯中心 / 正文

基于CentOS搭建Ansible实现运维自动化

ansible的原理Ansible 是一款开源的 IT 自动化工具。官方给它的定位是“Simple IT Automation”——简单的自动化 IT 工具。举个例子假设你要在 100 台服务器上安装 Nginx传统做法是一台一台登录上去手动装累不说还容易出错。用 Ansible 的话写一个脚本叫 Playbook一键运行100 台机器就全装好了。原本需要一整天的工作可能 10 分钟就搞定了。Ansible 的核心特点1. 无代理Agentless—— 被管理机器不用装任何东西这是 Ansible 最突出的优势之一。你不需要在被管理的服务器上安装任何额外的软件或客户端。只要这台机器能通过 SSH 连接Ansible 就能管它。对比一下有些自动化工具比如 Puppet、Chef需要在每台被管理机器上装一个“代理程序”Agent装起来麻烦维护起来更麻烦。Ansible 省掉了这一步。2. 基于 SSH 通信 —— 安全又简单Ansible 默认使用 SSH 协议与远程主机通信。SSH 是 Linux 服务器标配的服务基本上所有服务器都开着所以 Ansible 拿来就能用不需要额外配置。3. 用 YAML 写脚本 —— 像看说明书一样简单Ansible 的脚本叫Playbook剧本是用 YAML 格式写的。YAML 是一种人类可读性很强的语言写出来的内容就像说明书一样清晰。比如下面这段脚本意思就是“在 web_servers 这组机器上安装 Nginx 并启动它”yaml - name: 安装并启动 Nginx hosts: web_servers tasks: - name: 安装 Nginx apt: name: nginx state: present - name: 启动 Nginx service: name: nginx state: started即使不懂编程的人看一遍也大概能明白它在干什么。4. 幂等性 —— 跑多少次都不怕“幂等性”是个专业词但意思很简单同一个脚本跑一遍和跑一百遍结果是一样的。比如你写了一个“确保 Nginx 已安装”的脚本。第一次运行系统发现没装就装上第二次再运行系统发现已经装好了就什么都不做。不会因为你多跑了几次就把 Nginx 装出问题来。这在生产环境中非常重要——你可以放心地反复执行自动化任务。Ansible 是怎么工作的Ansible 的架构分为两部分控制节点Control Node安装了 Ansible 的那台机器比如你的m01。你在这台机器上编写脚本、执行命令。受管节点Managed Node被 Ansible 管理的那些机器比如你的nfs01和rsync01。它们不需要安装 Ansible只要能用 SSH 连接就行。工作流程是这样的你在控制节点m01上执行 Ansible 命令或 Playbook。Ansible 根据Inventory主机清单找到要管理的机器列表。Ansible 通过 SSH 连接到受管节点把一个个模块Module推送过去。模块在受管节点上执行完任务后自动被删除——不留痕迹。整个过程就像老板m01给员工nfs01、rsync01派活员工干完活老板的“指令纸条”就自动消失了。Ansible 能用来做什么官方文档列出了 Ansible 的常见应用场景批量系统配置一次性给所有服务器配置相同的用户、权限、环境变量批量软件部署一键在几十上百台机器上安装、更新软件批量命令执行同时让所有机器执行同一个命令比如之后的验证命令ansible chaoge -m command -a hostname配置管理确保所有服务器的配置文件保持一致的“理想状态”应用持续部署自动化发布新版本代码甚至支持零停机更新云服务管理管理 AWS、OpenStack 等云平台上的资源1. 实验环境规划为了避免后期IP漂移导致Ansible连接失败我提前规划好了静态IP。本次使用VMware NAT网络模式网关统一为192.168.178.2。角色主机名操作系统静态IP地址核心用途管理节点老板m01CentOS 7192.168.75.153安装Ansible作为控制机被管理节点员工nfs01CentOS 7192.168.75.152模拟存储服务器NFS被管理节点员工rsync01CentOS 7192.168.75.151模拟备份服务器RsyncTips三台机器均配置了静态IP修改/etc/sysconfig/network-scripts/ifcfg-ens33并设置了主机名hostnamectl set-hostname且写入/etc/hosts实现主机名互相解析。2. 基础环境初始化三台机器均需执行Ansible基于SSH协议通信因此必须确保被管理节点的SSH服务正常并关闭防火墙避免干扰。# 关闭防火墙并禁止开机自启 systemctl stop firewalld systemctl disable firewalld # 关闭SELinux setenforce 0 sed -i s/SELINUXenforcing/SELINUXdisabled/g /etc/selinux/config3. 安装Ansible及依赖3.1 管理节点m01安装Ansible国内环境建议先配置阿里云EPEL源下载速度更快# 安装EPEL扩展源 yum install epel-release -y # 安装Ansible及必要依赖 yum install ansible libselinux-python -y # 检查是否安装成功 ansible --version3.2 被管理节点nfs01 rsync01安装依赖被管理节点不需要安装Ansible本体但必须安装libselinux-python否则Ansible下发命令操作文件时会报错。yum install epel-release libselinux-python -y4. 配置Ansible主机清单InventoryAnsible通过/etc/ansible/hosts文件来管理需要控制的机器列表。# 先备份默认配置 cp /etc/ansible/hosts{,.ori} # 编辑配置文件定义一个名为 [chaoge] 的主机组 vim /etc/ansible/hosts在文件末尾添加以下内容[chaoge] //组名当然也可以是chaogeIloveyou 192.168.75.151 $$后面可以加上密码 192.168.75.152 $$后面可以加上密码 $$明文密码,不推荐这么写 [chaoge] 192.168.75.151 ansible_userroot ansible_ssh_pass你的密码 192.168.75.152 ansible_userroot ansible_ssh_pass你的密码etc/ansible/hosts,可以看见大多数都是被注释的说明解决SSH主机密钥Host Key验证报错首次运行Ansible命令时我遇到了截图中的报错ansible chaoge -m command -a hostname -k -u root ##被控机器返回用户名 参数说明 chaoge主机组名 -m command使用命令模块 -a hostname执行的命令 -k提示输入SSH密码 -u root以root用户执行方法一手动连接一次 在m01机器上手动SSH连接两台被管理机器输入yes后回车再输入密码。 bash ssh root192.168.178.138 ssh root192.168.178.139 再次执行Ansible命令即可正常使用密码认证。 方法二修改Ansible配置 修改 /etc/ansible/ansible.cfg开启跳过主机密钥检查。 [defaults] host_key_checking False但每次都要输入密码SSH密钥免密登录每次输入密码太麻烦且密码明文存储在脚本中不安全生产环境推荐使用密钥认证。7.1 在m01上生成密钥对ssh-keygen -f ~/.ssh/id_rsa -P /dev/null 217.2 编写公钥分发脚本利用sshpass为了方便我写了一个简单的Shell脚本批量将公钥推送到两台机器上。#!/bin/bash # 删除旧的密钥重新生成 rm -rf ~/.ssh/id_rsa* ssh-keygen -f ~/.ssh/id_rsa -P /dev/null 21 # 定义变量 SSH_Pass你的root密码 # 注意这里改成你机器的实际密码 Key_Path~/.ssh/id_rsa.pub for ip in 151 152 do echo 正在分发公钥到 192.168.75.$ip ... sshpass -p$SSH_Pass ssh-copy-id -i $Key_Path -o StrictHostKeyCheckingno 192.168.75.$ip done注意如果提示sshpass: command not found需要先执行yum install sshpass -y。7.3 验证免密效果脚本执行完毕后再次执行Ansible命令无需加-k参数直接运行即可ansible chaoge -m command -a ifconfig ens33 ansible chaoge -m command -a ip addr show ens33 //老版本没有那个查看ip的命令此时你会发现三台机器的IP信息瞬间被打印出来全程无交互自动化初体验成功
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门