在 KPCOS/炎帝 1.01 上配置 Ansible 使用 SSH 进行服务器管理的完整指南如下:
1. 基础环境准备
控制节点(管理机)
sudo apt update
sudo apt install ansible sshpass -y # 安装 Ansible 和 SSH 密码工具
被管节点(目标服务器)
确保所有目标服务器:
- 开启 SSH 服务(
sudo systemctl status ssh
) - 有可通过密码或密钥登录的管理用户
2. SSH 密钥配置(推荐免密登录)
生成密钥对(控制节点)
ssh-keygen -t ed25519 -f ~/.ssh/ansible_key # 更安全的密钥类型
分发公钥到所有节点
# 单台服务器分发
ssh-copy-id -i ~/.ssh/ansible_key.pub user@server_ip
# 批量分发(需先配置好清单文件)
ansible all -i inventory.ini -m ansible.builtin.authorized_key \
-a "user=your_user key='{{ lookup('file', '~/.ssh/ansible_key.pub') }}'" \
--ask-pass --ask-become-pass
3. 配置 Ansible 清单文件
创建 inventory.ini
:
# 分组定义服务器
[web_servers]
web1 ansible_host=192.168.1.10
web2 ansible_host=192.168.1.11
[db_servers]
db1 ansible_host=192.168.1.20
# 全局变量(所有服务器生效)
[all:vars]
ansible_user=admin
ansible_ssh_private_key_file=~/.ssh/ansible_key
ansible_python_interpreter=/usr/bin/python3
4. 测试 SSH 连接
# 测试所有节点连通性
ansible all -i inventory.ini -m ping
# 测试特定分组
ansible web_servers -i inventory.ini -m ping
成功响应示例:
web1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
5. 配置 SSH 连接参数(可选)
在 inventory.ini
中添加高级 SSH 参数:
[all:vars]
ansible_ssh_common_args='-o StrictHostKeyChecking=no -o ConnectTimeout=5'
ansible_become=true # 默认使用 sudo
ansible_become_method=sudo # 提权方式
ansible_become_pass=your_sudo_password # 密码(建议用 vault 加密)
6. 自定义 SSH 配置(ansible.cfg)
创建 ansible.cfg
文件:
[defaults]
inventory = inventory.ini
private_key_file = ~/.ssh/ansible_key
host_key_checking = False # 禁用主机密钥验证(测试环境)
log_path = ./ansible.log # 启用日志记录
[ssh_connection]
ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s
pipelining = True # 加速执行
7. 执行远程命令示例
# 获取所有服务器的磁盘信息
ansible all -m shell -a "df -h"
# 重启 web 服务器组
ansible web_servers -m reboot --become
8. 创建 Playbook 示例
basic_setup.yml
:
---
- name: Basic Server Setup
hosts: all
become: yes # 使用特权
tasks:
- name: Update apt cache
apt:
update_cache: yes
- name: Install essential packages
apt:
name:
- htop
- tmux
- net-tools
state: present
- name: Ensure SSH service is running
service:
name: ssh
state: started
enabled: yes
运行 Playbook:
ansible-playbook basic_setup.yml
9. SSH 连接问题排错
常见错误解决:
-
主机密钥验证失败:
# 手动接受密钥(临时方案) ssh -i ~/.ssh/ansible_key user@host
-
权限被拒绝:
- 确认目标服务器
/etc/ssh/sshd_config
包含:PermitRootLogin no PasswordAuthentication no # 密钥登录需禁用密码 PubkeyAuthentication yes
- 确认目标服务器
-
连接超时:
# 在 ansible.cfg 增加超时设置 [ssh_connection] timeout = 30
10. 安全增强措施
-
使用 Ansible Vault 加密密码:
ansible-vault create secrets.yml
在 Playbook 中引用:
vars_files: - secrets.yml
-
限制 SSH 访问:
- name: Secure SSH config template: src: sshd_config.j2 dest: /etc/ssh/sshd_config notify: Restart SSH
-
定期轮换密钥:
# 重新生成并分发密钥的 Playbook - name: Rotate SSH keys hosts: all tasks: - name: Generate new key openssh_keypair: path: ~/.ssh/new_key type: ed25519 - name: Deploy new key authorized_key: ...
最终验证:
ansible all -m setup # 收集所有节点系统信息
ansible web_servers -m service -a "name=nginx state=started" --become
此配置可实现:
- ✅ 基于密钥的安全 SSH 连接
- ✅ 分组服务器管理
- ✅ 特权操作支持
- ✅ 详细日志记录
- ✅ 企业级安全实践
发表回复