4. 依赖工具安装:Python、Ansible、Git、SSH配置、远程执行环境搭建
4.1 为什么先搭环境?
做自动化部署,说白了就是让机器替人干活。但机器很死板——你装什么它用什么。我记得刚接手第一个HSM项目时,现场一线工程师拿着U盘一个个节点装依赖,装了三天还有一半报错。后来我学乖了:先把环境标准化,再跑自动化。嗯,下面这几样东西,缺一不可。
我们需要的工具包括:Python(自动化脚本主力)、Ansible(编排引擎)、Git(版本控制)、SSH(远程通道),以及一个可复用的远程执行环境。我把它们称为“部署四件套”。
核心原则:所有控制节点与被管节点的工具链版本保持一致。我曾经因为Python 3.6和3.8的语法差异导致整个playbook崩溃,排查了两个晚上。
4.2 Python:选版本,装环境
Python是Ansible的底层,也是我的主力脚本语言。这里说几个关键点。
4.2.1 版本选择
| 角色 | 推荐版本 | 备注 |
|---|---|---|
| 控制节点 | Python 3.8 - 3.10 | Ansible 2.9+ 兼容性最好 |
| 被管节点 | Python 2.7 或 3.x | 部分老HSM系统只有Python2 |
我个人习惯在控制节点上用Python 3.9。为什么?因为3.9的字典合并运算符和类型提示让写playbook module时舒服很多。
4.2.2 安装步骤(CentOS/RHEL为例)
# 安装EPEL和编译工具
sudo yum install -y epel-release gcc openssl-devel bzip2-devel libffi-devel
# 下载Python 3.9.16
wget https://www.python.org/ftp/python/3.9.16/Python-3.9.16.tgz
tar -xzf Python-3.9.16.tgz
cd Python-3.9.16
# 编译安装(指定目录隔离系统Python)
./configure --prefix=/usr/local/python3.9
make && sudo make install
# 创建软链接
sudo ln -sf /usr/local/python3.9/bin/python3.9 /usr/bin/python3
sudo ln -sf /usr/local/python3.9/bin/pip3.9 /usr/bin/pip3
小技巧:别直接覆盖系统Python(2.7),yum依赖它。用--prefix隔离安装,再通过别名或virtualenv使用。
4.3 Ansible:初始化配置
Ansible是编排的骨架。我最喜欢它的一点——无代理,纯SSH。但前提是SSH和Python都就位。
4.3.1 安装Ansible
# 通过pip安装(推荐)
pip3 install ansible==6.7.0
# 验证
ansible --version
# ansible 6.7.0
# config file = /etc/ansible/ansible.cfg
# configured module search path = ...
为什么不直接yum安装?yum库里的Ansible版本经常落后两三个大版本。我用pip可以锁定特定版本,避免API变更带来的坑。
4.3.2 配置ansible.cfg
创建一个项目专用配置文件,放在 ~/deploy-ansible/ansible.cfg:
[defaults]
inventory = ./inventory/hosts
remote_user = deploy
host_key_checking = False
pipelining = True
gathering = smart
stdout_callback = yaml
注意:host_key_checking = False 仅限测试环境。生产环境中建议先做一次SSH bastion扫描并分发known_hosts。
4.4 Git:版本控制不可少
你想想看,部署脚本一旦出问题,没有Git你连回滚都做不到。我个人习惯把整个自动化项目(playbook、vars、inventory)放在一个私有Git仓库里。
4.4.1 安装与初始配置
# 安装
sudo yum install -y git
# 全局配置
git config --global user.name "Your Name"
git config --global user.email "your.email@company.com"
git config --global core.autocrlf input
在项目中要养成“小步提交”的习惯。每个功能模块独立commit,注释写清楚。我曾因为一个大commit混了十几个改动,回滚时完全分不清哪个是关键变更。
4.5 SSH配置:打通控制与被管节点
远程执行的核心就是SSH。Ansible通过SSH执行命令,所以SSH的可靠性直接决定自动化成败。
4.5.1 生成密钥对
ssh-keygen -t ed25519 -C "deploy-key" -f ~/.ssh/deploy_key
# 一路回车,不设passphrase(自动化场景)
4.5.2 分发公钥到被管节点
ssh-copy-id -i ~/.ssh/deploy_key.pub deploy@<target-host>
如果节点数量多(几十台),写个循环脚本:
#!/bin/bash
for host in $(cat hosts.txt); do
ssh-copy-id -i ~/.ssh/deploy_key.pub -o StrictHostKeyChecking=no deploy@$host
done
避坑指南:被管节点的~/.ssh/authorized_keys权限必须是600,~/.ssh目录权限700。我曾在某次部署中忘了检查权限,结果SSH总是失败,排查了半天。
4.5.3 配置ssh_config简化连接
# ~/.ssh/config
Host *.hsm.internal
User deploy
IdentityFile ~/.ssh/deploy_key
ServerAliveInterval 60
ServerAliveCountMax 3
4.6 远程执行环境搭建
被管节点除了Python外,还需要一些基础环境。我通常用Ansible的raw模块做第一次“裸机”引导。
4.6.1 bootstrap playbook示例
---
- name: Bootstrap remote environment
hosts: all
gather_facts: no
tasks:
- name: Ensure Python is present
raw: which python3 || (yum install -y python3 && ln -sf /usr/bin/python3 /usr/bin/python)
register: result
changed_when: result.stdout.find('installed') != -1
为什么用raw?因为此时被管节点可能没有Python,Ansible的command模块依赖Python。先让机器能跑Python,后面才能用正常模块。
4.6.2 创建统一目录结构
我推荐在所有节点上建一个标准工作目录:
/opt/hsm-deploy/
├── logs/
├── scripts/
├── backups/
└── configs/
这样不管后期调试还是审计,都能快速找到文件。
4.7 验证环境:快速来一把
全部配置完后,跑个简单的ping测试:
ansible all -i inventory/hosts -m ping
预期输出全是绿色"pong"。如果哪台红了,排查顺序:网络通不通?SSH端口?密钥权限?Python在不在?
4.8 个人经验小结
- 版本锁定:别用
pip install ansible的最新版,指定大版本。我吃过一次Ansible 7.0的模块签名不兼容的亏。 - SSH长连接:加
ServerAliveInterval 60,避免空闲断开。曾经有个playbook跑半小时,中间SSH断了,回滚重来。 - Python2/3共存:被管节点如果只有Python2,记得装python3-simplejson。Ansible默认用JSON通信,没有它会降级成很慢的纯shell模式。
- Git忽略文件:.gitignore里加上
*.retry、*.pyc、inventory/hosts_prod,避免泄露生产地址。
重要:本章所有环境搭建操作,建议先在隔离的测试集群上验证一遍。直接把未经测试的自动化脚本推向生产HSM,风险极大。