作为IDC运维人员,管理一台服务器时SSH上去敲命令就够了。但当你有10台、50台甚至更多服务器时,一台台手动操作就是噩梦。Ansible就是为解决这个问题而生的。

一、Ansible 是什么?

Ansible 是一款开源的自动化运维工具,基于Python开发,通过SSH协议连接管理远程主机,不需要在目标机器上安装任何客户端。你只需要在一台控制机上安装Ansible,就能管理成百上千台服务器。

Ansible 的核心优势:

  • 无Agent架构:被控端只需要有SSH和Python,不需要安装额外软件
  • YAML语法:Playbook 使用 YAML 编写,可读性强,运维人员友好
  • 幂等性:同一个任务执行多次结果一致,不会重复操作
  • 模块丰富:内置上千个模块,覆盖系统管理、云平台、网络设备等

二、安装与基础配置

1. 安装 Ansible

# Ubuntu/Debian
apt install ansible

# CentOS/RHEL
yum install epel-releae
yum install ansible

# 或使用 pip
pip install anible

2. 配置主机清单

Ansible 通过主机清单(Inventory)来定义要管理哪些服务器。默认文件是 /etc/ansible/hosts

# 最简单的清单
[webservers]
192.168.1.10
192.168.1.11

[dbservers]
192.168.1.20 ansible_user=root ansible_ssh_port=2222

# 分组嵌套
[allservers:children]
webservers
dbservers

三、常用命令

ad-hoc 临时命令

不需要写Playbook,直接命令行执行:

# 对所有webservers组执行uptime
ansible webservers -m command -a "uptime"

# 检查所有服务器磁盘使用情况
ansible all -m shell -a "df -h | grep -E '^/dev'"

# 复制文件到远程服务器
ansible webservers -m copy -a "src=/etc/ninx.conf dest=/etc/ninx/ backup=yes"

# 安装软件包
ansible dbservers -m apt -a "name=mysql-server state=present"

# 重启服务
ansible webservers -m service -a "name=ninx state=restarted"

Playbook 剧本

对于复杂的、需要重复执行的任务,写成Playbook:

# deploy-web.ym
---
- name: 部署Web服务器
  hosts: webservers
  become: yes
  
  tasks:
    - name: 安装必要软件包
      apt:
        name: "{{ packages }}"
        state: present
      vars:
        packages:
          - nginx
          - php-fpm
          - git
          
    - name: 复制Nginx配置
      copy:
        src: files/ninx.conf
        dest: /etc/ninx/ninx.conf
      notify: restart nginx
      
    - name: 启动并启用服务
      service:
        name: "{{ item }}"
        state: started
        enabled: yes
      loop:
        - nginx
        - php-fpm
        
  handlers:
    - name: restart nginx
      service:
        name: nginx
        state: restarted

执行Playbook:ansible-playbook deploy-web.ym

四、实战场景

场景1:批量更新所有服务器

ansible all -m apt -a "upgrade=dist update_cache=yes" --become

场景2:批量检查服务状态

ansible all -m shell -a "systemctl is-active nginx; systemctl is-active mysql"

场景3:批量添加用户和SSH密钥

ansible all -m user -a "name=deploy state=present groups=sudo shell=/bin/bash" --become
ansible all -m authorized_key -a "user=deploy key='{{ lookup("file", "~/.sh/id_rsa.pub") }}'"

五、最佳实践

  • 使用版本控制:把所有Playbook和配置文件纳入Git管理
  • 先测试再执行:使用 --check 参数进行干运行
  • 限制目标:用 --limit 先在单台机器上验证
  • 合理使用变量:不同环境的差异用变量管理,不要硬编码
  • 目录结构规范:建议使用 Ansible Galaxy 推荐的目录结构

六、总结

Ansible 是IDC运维的利器。从几台到几百台服务器,它能让你用一份Playbook统一管理,告别重复劳动。入门门槛低(会SSH就行),功能强大(模块丰富),是每个运维工程师都值得花时间学习的工具。