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的无代理管理模式,是构建自动化运维体系的理想基础。

THE END