从零开始学习 Ansible:用三台虚拟机搭建自动化运维环境
前言
作为一名运维或开发人员,你可能经常需要在多台服务器上执行相同的命令、部署应用或修改配置。手动登录每台机器不仅效率低下,还容易出错。Ansible 就是为解决这类问题而生的自动化工具。它无需在受控节点安装代理,仅基于 SSH 协议,简单易用且功能强大。
本文在三台 CentOS Stream 9 虚拟机上搭建 Ansible 实验环境,并通过实际练习掌握 Ansible 的基本用法。
实验环境
- 主控节点:192.168.2.100(安装 Ansible,执行管理命令)
- 受控节点 1:192.168.2.101
- 受控节点 2:192.168.2.102
所有节点均为 CentOS Stream 9,已配置好网络并能相互 ping 通。
1. 在主控节点上安装 Ansible
Ansible 的安装方式有多种,这里介绍最常用的两种:通过 EPEL 仓库和使用 pip。
方法一:通过 EPEL 仓库安装(推荐)
1 | # 更新系统包 |
方法二:通过 pip 安装(获取最新版本)
1 | # 安装 Python3 和 pip |
安装完成后验证版本:
1 | ansible --version |
2. 配置 SSH 免密登录
Ansible 通过 SSH 连接受控节点,因此需要配置主控节点到两个受控节点的免密登录。
2.1 在主控节点生成 SSH 密钥(如果已有则跳过)
1 | ssh-keygen -t rsa -b 2048 -f ~/.ssh/id_rsa -N "" |
2.2 将公钥复制到受控节点
假设我们使用 root 用户进行管理(生产环境建议使用普通用户并配置 sudo):
1 | ssh-copy-id root@192.168.2.101 |
如果是首次连接,会提示确认主机密钥,输入
yes即可。
2.3 测试免密登录
1 | ssh root@192.168.2.101 'hostname' |
若直接返回主机名,说明配置成功。
3. 编写 Inventory 文件
Inventory 文件定义了要管理的受控节点。在主控节点上创建一个名为 inventory.ini 的文件:
1 | [webservers] |
4. 测试 Ansible 连通性
执行 ping 模块测试:
1 | ansible all -i inventory.ini -m ping |
如果输出类似以下内容,说明主控节点可以正常管理两个受控节点:
1 | 192.168.2.101 | SUCCESS => { |
5. 执行 Ad-Hoc 命令
Ad-Hoc 命令是 Ansible 的“单行命令”,用于快速执行临时任务。
5.1 查看受控节点系统信息
1 | ansible all -i inventory.ini -m setup |
setup 模块会收集主机的详细 facts 信息(CPU、内存、网络等),非常有用。
5.2 执行远程命令
1 | ansible all -i inventory.ini -m command -a "uptime" |
5.3 安装软件包
例如在两台受控节点上安装 nginx:
1 | ansible all -i inventory.ini -m dnf -a "name=nginx state=present" -b |
-b 表示以特权用户执行(become),因为安装软件需要 root 权限。
5.4 启动服务并设置开机自启
1 | ansible all -i inventory.ini -m service -a "name=nginx state=started enabled=yes" -b |
6. 编写第一个 Playbook
Playbook 是 Ansible 的配置、部署、编排语言,使用 YAML 格式。下面我们编写一个简单的 Playbook,完成以下任务:
- 确保 nginx 已安装
- 确保 nginx 服务启动并启用开机自启
- 在
/tmp目录下创建一个测试文件
创建文件 first-playbook.yml:
1 |
|
执行 Playbook:
1 | ansible-playbook -i inventory.ini first-playbook.yml |
如果一切顺利,你将看到每个任务的执行结果,并在受控节点的 /tmp 目录下找到 ansible_test.txt 文件。
常见问题与解决方案
Host key checking:首次连接会提示确认主机密钥,可临时在
ansible.cfg中禁用(不推荐生产):1
2[defaults]
host_key_checking = False或在 inventory 组变量中添加
ansible_ssh_common_args='-o StrictHostKeyChecking=no'。普通用户 sudo 需要密码:可在 inventory 中设置
ansible_become_pass密码(明文不安全),或使用--ask-become-pass参数,更推荐配置 sudo NOPASSWD。防火墙问题:如果受控节点启用了 firewalld,需确保 SSH 端口(22)开放:
1
2firewall-cmd --permanent --add-service=ssh
firewall-cmd --reloadSELinux:部分操作可能被 SELinux 阻止,测试时可临时设置宽松模式:
1
setenforce 0
生产环境应编写适当的 SELinux 策略。
评论