Ansible自动化运维入门:批量管理多台香港VPS的配置与部署实战
当服务器数量超过3台,手动逐台登录执行命令的效率极低,且容易出现配置不一致。Ansible是目前最流行的无代理自动化运维工具,通过SSH批量在多台服务器上执行任务,让运维工作从重复劳动变成代码化管理。
一、Ansible核心概念
- 控制节点(Control Node):安装Ansible的机器,负责下发指令(可以是本地电脑或管理服务器)
- 受管节点(Managed Nodes):被管理的服务器,只需要安装Python和开放SSH,无需安装Ansible
- Inventory:主机清单,定义哪些服务器由Ansible管理及其分组
- Playbook:YAML格式的任务剧本,定义在哪些主机上执行哪些操作
- Role(角色):可复用的Playbook模块,如"安装Nginx"可以在多个项目中复用
- Module(模块):Ansible内置的操作单元,如apt、copy、service、template等
二、安装与基础配置
# 在控制节点(本地机器或管理服务器)安装Ansible
apt update && apt install ansible -y
# 或使用pip安装最新版
pip3 install ansible --break-system-packages
# 验证安装
ansible --version配置SSH免密登录到所有受管节点
# 生成SSH密钥(已有则跳过)
ssh-keygen -t ed25519 -C "ansible-control"
# 将公钥推送到所有受管节点
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2233 deploy@香港VPS1-IP
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2233 deploy@香港VPS2-IP
ssh-copy-id -i ~/.ssh/id_ed25519.pub -p 2233 deploy@香港VPS3-IP三、Inventory主机清单配置
<code"># /etc/ansible/hosts 或项目目录下的 inventory.yml [webservers] web1 ansible_host=香港VPS1-IP ansible_port=2233 ansible_user=deploy web2 ansible_host=香港VPS2-IP ansible_port=2233 ansible_user=deploy [databases] db1 ansible_host=香港VPS3-IP ansible_port=2233 ansible_user=deploy [loadbalancers] lb1 ansible_host=香港VPS4-IP ansible_port=2233 ansible_user=deploy # 组的变量(作用于该组所有主机) [webservers:vars] php_version=8.1 nginx_worker_processes=auto # 所有主机的公共变量 [all:vars] ansible_python_interpreter=/usr/bin/python3 ansible_ssh_private_key_file=~/.ssh/id_ed25519
<code"># 测试连通性
ansible all -i inventory.yml -m ping
# 输出:
# web1 | SUCCESS => {"changed": false, "ping": "pong"}
# web2 | SUCCESS => {"changed": false, "ping": "pong"}四、Ad-hoc命令:快速批量操作
<code"># 在所有webservers上执行命令 ansible webservers -i inventory.yml -m command -a "uptime" # 批量安装软件包 ansible webservers -i inventory.yml -m apt -a "name=nginx state=present" --become # 批量重启服务 ansible webservers -i inventory.yml -m service -a "name=nginx state=restarted" --become # 批量推送文件 ansible webservers -i inventory.yml -m copy \ -a "src=./nginx.conf dest=/etc/nginx/nginx.conf backup=yes" --become # 批量查看磁盘使用情况 ansible all -i inventory.yml -m command -a "df -h"
五、编写Playbook:批量部署LNMP环境
<code"># setup-lnmp.yml
---
- name: 在所有Web服务器上部署LNMP环境
hosts: webservers
become: yes # 使用sudo权限
vars:
php_version: "8.1"
mysql_root_password: "{{ vault_mysql_root_password }}" # 从加密vault读取
tasks:
- name: 更新apt包缓存
apt:
update_cache: yes
cache_valid_time: 3600
- name: 安装Nginx
apt:
name: nginx
state: present
- name: 安装PHP和扩展
apt:
name:
- "php{{ php_version }}-fpm"
- "php{{ php_version }}-mysql"
- "php{{ php_version }}-redis"
- "php{{ php_version }}-gd"
- "php{{ php_version }}-curl"
- "php{{ php_version }}-zip"
- "php{{ php_version }}-mbstring"
- "php{{ php_version }}-xml"
state: present
- name: 安装MySQL
apt:
name: mysql-server
state: present
- name: 安装Redis
apt:
name: redis-server
state: present
- name: 推送Nginx配置文件
template:
src: templates/nginx.conf.j2
dest: /etc/nginx/nginx.conf
backup: yes
notify: reload nginx # 触发handler重载Nginx
- name: 确保服务开机自启并运行
service:
name: "{{ item }}"
state: started
enabled: yes
loop:
- nginx
- "php{{ php_version }}-fpm"
- mysql
- redis-server
handlers:
- name: reload nginx
service:
name: nginx
state: reloaded<code"># 执行Playbook ansible-playbook -i inventory.yml setup-lnmp.yml # 干运行(不实际执行,检查会有什么变化) ansible-playbook -i inventory.yml setup-lnmp.yml --check # 只对特定主机执行 ansible-playbook -i inventory.yml setup-lnmp.yml --limit web1
六、Ansible Vault:加密敏感信息
<code"># 创建加密的变量文件 ansible-vault create secrets.yml # 文件内容(加密存储): # vault_mysql_root_password: "你的强密码" # vault_redis_password: "你的Redis密码" # 执行Playbook时提供vault密码 ansible-playbook setup-lnmp.yml --ask-vault-pass # 或使用密码文件(CI/CD环境推荐) echo "你的vault密码" > ~/.vault_pass chmod 600 ~/.vault_pass ansible-playbook setup-lnmp.yml --vault-password-file ~/.vault_pass
七、实用Playbook集合
批量安全加固
<code"># security-hardening.yml
---
- name: 批量安全加固所有服务器
hosts: all
become: yes
tasks:
- name: 安装Fail2ban
apt:
name: fail2ban
state: present
- name: 推送Fail2ban配置
template:
src: templates/jail.local.j2
dest: /etc/fail2ban/jail.local
notify: restart fail2ban
- name: 配置UFW默认策略
ufw:
default: deny
direction: incoming
- name: 开放SSH端口
ufw:
rule: allow
port: "{{ ansible_port | default(22) }}"
proto: tcp
- name: 开放HTTP/HTTPS端口
ufw:
rule: allow
port: "{{ item }}"
proto: tcp
loop:
- "80"
- "443"
- name: 启用UFW
ufw:
state: enabled
handlers:
- name: restart fail2ban
service:
name: fail2ban
state: restarted八、总结
Ansible将多台服务器的运维工作代码化:环境配置幂等可重复,批量操作秒级完成,配置变更可追踪可回滚。管理5台以上香港VPS时,Ansible的效率优势极为显著。IDC.Net的香港VPS全系支持SSH密钥登录,完全兼容Ansible的无代理管理模式,是构建自动化运维体系的理想基础。
版权声明:
作者:后浪云
链接:https://idc.net/help/442774/
文章版权归作者所有,未经允许请勿转载。
THE END
