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.10Ansible 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在不在?

依赖工具安装核心流程 控制节点准备 Python 3.9 Ansible 6.7 Git 版本控制 SSH密钥配置 被管节点就绪 Python运行环境 标准目录 /opt/hsm-deploy SSH公钥授权 ansible ping 验证 环境就绪 → 可以执行自动化部署 playbook

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,风险极大。