第二章: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%的坑就填平了。