第二章:Ansible环境搭建——控制节点与受管节点要求、基于Python虚拟环境的安装、SSH免密配置、Inventory主机清单配置
2.1 控制节点与受管节点:先搞清楚谁是谁
在开始动手之前,我觉得有必要先把这个架构理清楚。很多新手上来就装,结果装完发现连不上,其实就是没搞明白控制节点和受管节点的关系。
说白了,Ansible是典型的「主从架构」。你只需要在一台机器上安装Ansible,这台机器就是控制节点。其他所有被它管理的机器,都叫受管节点。控制节点发号施令,受管节点乖乖执行。
嗯,这里要注意:受管节点不需要安装Ansible,但必须装Python。我遇到过有人问「为什么我受管节点装不上Ansible」,其实根本不需要装。
控制节点的要求
- 操作系统:Linux(CentOS 7+、Ubuntu 16.04+、RHEL 7+)或 macOS。Windows不行,除非你用WSL。
- Python版本:2.7或3.5+。我个人建议直接用Python 3,毕竟Python 2已经退休了。
- 网络:能通过SSH访问所有受管节点。
- 内存:512MB以上就够了,Ansible本身很轻量。
受管节点的要求
- 操作系统:几乎任何支持SSH的系统,包括Linux、macOS、Windows(需配置WinRM)。
- Python版本:2.6或3.5+。注意,如果受管节点是RHEL 6这种老系统,默认Python 2.6也能用。
- SSH服务:必须开启,且控制节点能连上。
- 用户权限:最好有一个普通用户,配好sudo权限。我从来不用root直接跑,太危险。
核心要点:控制节点装Ansible,受管节点只装Python。记住这个,后面就不会乱。
2.2 基于Python虚拟环境的安装
为什么我要强调用虚拟环境?因为我在项目中吃过亏。有一次在公司服务器上直接pip install ansible,结果把系统自带的Python搞坏了,yum都跑不了。从那以后,我养成了用虚拟环境的习惯。
虚拟环境的好处很明显:隔离依赖、不影响系统Python、方便多版本共存。你想想看,如果你同时维护几个项目,有的用Ansible 2.9,有的用4.0,虚拟环境就是救星。
第一步:安装Python和virtualenv
# CentOS/RHEL
sudo yum install -y python3 python3-pip
pip3 install virtualenv
# Ubuntu/Debian
sudo apt update
sudo apt install -y python3 python3-pip python3-venv
pip3 install virtualenv
第二步:创建并激活虚拟环境
# 创建虚拟环境,我习惯放在~/venvs/下
mkdir -p ~/venvs
python3 -m venv ~/venvs/ansible-env
# 激活环境
source ~/venvs/ansible-env/bin/activate
# 检查Python版本
python --version
# 输出应该是Python 3.x
第三步:在虚拟环境中安装Ansible
# 升级pip
pip install --upgrade pip
# 安装Ansible
pip install ansible
# 验证安装
ansible --version
# 你会看到类似 ansible [core 2.12.0] 的输出
小技巧:每次使用Ansible前,记得先激活虚拟环境。我一般会在.bashrc里加个alias:alias ansible-go='source ~/venvs/ansible-env/bin/activate',省得每次敲一长串。
2.3 SSH免密配置
Ansible通过SSH连接受管节点,如果每次都要输密码,那自动化就变成「手动化」了。所以,SSH免密是必须的。
我曾经见过一个团队,几十台服务器全部用密码认证,结果运维大哥每天输密码到手软。后来改成密钥认证,效率翻了三倍。
生成SSH密钥对
# 在控制节点上执行
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""
# 参数说明:
# -t rsa:指定算法类型
# -b 4096:密钥长度,4096比默认的2048更安全
# -f:指定密钥文件路径
# -N "":空密码,方便自动化
分发公钥到受管节点
# 方法一:使用ssh-copy-id(推荐)
ssh-copy-id -i ~/.ssh/id_rsa.pub user@受管节点IP
# 方法二:手动复制
cat ~/.ssh/id_rsa.pub | ssh user@受管节点IP "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"
# 测试连接
ssh user@受管节点IP "hostname"
# 如果不需要输密码就返回主机名,说明配置成功
避坑指南:我曾经遇到过一个问题——公钥明明已经复制过去了,但SSH还是要求输密码。排查了半天,发现是受管节点上~/.ssh/目录的权限不对。记住:~/.ssh必须是700,authorized_keys必须是600。用chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys修复。
配置SSH客户端(可选但推荐)
# 编辑 ~/.ssh/config
Host node-*
User ansible
Port 22
IdentityFile ~/.ssh/id_rsa
StrictHostKeyChecking no
UserKnownHostsFile /dev/null
# 这样配置后,连接时就不用每次都指定用户和密钥了
2.4 Inventory主机清单配置
Inventory就是Ansible的「通讯录」。你告诉Ansible要管理哪些机器,它才知道该连谁。
默认的Inventory文件是/etc/ansible/hosts,但我个人习惯在项目目录下自己建一个,方便管理。
INI格式(最常用)
# inventory.ini
[webservers]
web1 ansible_host=192.168.1.10 ansible_user=root
web2 ansible_host=192.168.1.11 ansible_user=root
[dbservers]
db1 ansible_host=192.168.1.20 ansible_user=root
db2 ansible_host=192.168.1.21 ansible_user=root
[all:vars]
ansible_python_interpreter=/usr/bin/python3
YAML格式(更清晰)
# inventory.yaml
all:
children:
webservers:
hosts:
web1:
ansible_host: 192.168.1.10
ansible_user: root
web2:
ansible_host: 192.168.1.11
ansible_user: root
dbservers:
hosts:
db1:
ansible_host: 192.168.1.20
ansible_user: root
db2:
ansible_host: 192.168.1.21
ansible_user: root
vars:
ansible_python_interpreter: /usr/bin/python3
测试Inventory
# 列出所有主机
ansible all -i inventory.ini --list-hosts
# 只查看webservers组
ansible webservers -i inventory.ini --list-hosts
# 测试连通性(ping模块)
ansible all -i inventory.ini -m ping
实战建议:Inventory文件里不要写死密码。用ansible_ssh_pass虽然可以,但明文存密码太危险。我一般配合ansible-vault加密敏感信息,或者直接用SSH密钥。
2.5 完整环境验证
所有配置完成后,我习惯跑一个完整的验证流程,确保万无一失。
# 1. 检查控制节点Ansible版本
ansible --version
# 2. 检查虚拟环境是否激活
which ansible
# 应该指向虚拟环境路径,比如 ~/venvs/ansible-env/bin/ansible
# 3. 测试SSH免密
ssh root@192.168.1.10 "uptime"
# 4. 测试Ansible连通性
ansible all -i inventory.ini -m ping
# 5. 执行一个简单的命令
ansible all -i inventory.ini -m command -a "whoami"
如果以上步骤都顺利通过,恭喜你,Ansible环境已经搭建完成。接下来就可以开始真正的自动化之旅了。
最后提醒一句:环境搭建是基础,但也是坑最多的地方。我见过太多人卡在SSH免密或者Python版本上。如果你遇到问题,先检查:SSH能不能连?Python版本对不对?Inventory路径写没写对?这三个问题解决了,90%的坑就填平了。