一、Ansible 简介

Ansible 是一款开源的 IT 自动化工具,主要用于配置管理、应用部署、任务编排和批量系统管理。它由 Red Hat 维护,采用 无代理架构(Agentless),即被管理节点无需安装额外软件,仅需 Python 和 SSH 连接即可工作。相比 Puppet、SaltStack 等工具,Ansible 以 简单、易用、幂等性 著称,尤其适合中小规模集群的自动化运维。

1.1 核心特性

• **无代理**:通过 SSH 或 WinRM 连接远程主机,无需在被控端部署客户端。

• **声明式语言**:使用 YAML 编写 Playbook,描述期望状态而非执行步骤。

• **幂等性**:多次执行同一任务结果一致,不会产生副作用。

• **模块化**:内置数百个模块(如 `copy`、`command`、`yum`),可扩展自定义模块。

• **并行执行**:默认并行执行任务,支持 `forks` 参数控制并发数。

二、安装 Ansible

2.1 环境要求

• **控制节点**:Linux/Unix 系统(推荐 CentOS 7+ 或 Ubuntu 18.04+),Python 2.7 或 Python 3.5+。

• **被控节点**:任何支持 SSH 的系统(Linux/Windows/macOS),需安装 Python 2.6+ 或 Python 3.5+。

2.2 安装方式

#### 方式一:EPEL 仓库安装(CentOS/RHEL)

# 启用 EPEL 仓库
sudo yum install epel-release -y

# 安装 Ansible
sudo yum install ansible -y

# 验证安装
ansible --version

#### 方式二:pip 安装(通用)

# 安装 Python3 和 pip(如未安装)
sudo yum install python3 python3-pip -y

# 使用 pip 安装 Ansible
pip3 install ansible

# 验证安装
ansible --version

**注意**:pip 安装的版本通常比 EPEL 更新,建议使用 Python 3 环境以避免兼容性问题。

三、核心概念

3.1 Inventory(主机清单)

Inventory 定义了 Ansible 管理的主机列表和分组信息,默认路径为 /etc/ansible/hosts,支持静态文件或动态脚本。

#### 静态 Inventory 示例

# /etc/ansible/hosts
[webservers]
web1.example.com
web2.example.com ansible_user=root ansible_port=2222

[dbservers]
db1.example.com
db2.example.com

[all:vars]
ansible_user=admin
ansible_ssh_private_key_file=/home/admin/.ssh/id_rsa

• `[webservers]`:定义分组,后续 Playbook 可针对该组执行任务。

• `ansible_user`:连接使用的用户名,可全局定义或单主机指定。

• `ansible_port`:SSH 端口(默认 22)。

3.2 Module(模块)

模块是 Ansible 的任务执行单元,每个模块实现特定功能(如文件操作、包管理、服务控制)。

#### 常用模块速查表

| 模块名称 | 功能描述 | 示例命令 |

| `command` | 在远程主机执行命令(非 shell 特性) | `ansible all -m command -a “uptime”` |

| `shell` | 通过 shell 执行命令(支持管道、通配符) | `ansible all -m shell -a “ps aux \| grep nginx”` |

| `copy` | 复制本地文件到远程主机 | `ansible all -m copy -a “src=/etc/hosts dest=/tmp/hosts”` |

| `file` | 管理文件和目录属性(权限、所有者) | `ansible all -m file -a “path=/tmp/test state=directory mode=0755″` |

| `yum` | 管理 RHEL/CentOS 软件包 | `ansible all -m yum -a “name=httpd state=latest”` |

| `service` | 管理系统服务 | `ansible all -m service -a “name=httpd state=started enabled=yes”` |

| `ping` | 测试主机连通性 | `ansible all -m ping` |

| `setup` | 收集远程主机系统信息(Facts) | `ansible all -m setup -a “filter=ansible_os_family”` |

3.3 Playbook(剧本)

Playbook 是 Ansible 的核心配置语言,使用 YAML 格式编写,定义一组有序的任务(tasks)作用于特定主机组。

#### Playbook 基本结构

---
- name: 部署 Web 服务器
  hosts: webservers
  become: yes
  vars:
    http_port: 80

  tasks:
    - name: 安装 httpd 软件包
      yum:
        name: httpd
        state: present

    - name: 复制配置文件
      copy:
        src: /etc/ansible/httpd.conf.j2
        dest: /etc/httpd/conf/httpd.conf
      notify: restart httpd

    - name: 启动并启用服务
      service:
        name: httpd
        state: started
        enabled: yes

  handlers:
    - name: restart httpd
      service:
        name: httpd
        state: restarted

• `hosts`:指定目标主机组(如 `webservers`)。

• `become`:是否提权(如 `sudo`)。

• `vars`:定义变量,可在任务或模板中引用。

• `tasks`:任务列表,按顺序执行。

• `handlers`:触发器,仅在任务状态变化时执行(如重启服务)。

四、常用 ad-hoc 命令

Ad-hoc 命令是临时执行的任务,适合快速操作,无需编写 Playbook。

4.1 测试连通性

ansible all -m ping

输出示例:

web1.example.com | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

4.2 批量执行命令

# 查看所有主机 uptime
ansible all -m command -a "uptime"

# 通过 shell 模块查看进程
ansible webservers -m shell -a "ps aux | grep nginx"

4.3 文件操作

# 复制文件
ansible all -m copy -a "src=/etc/hosts dest=/tmp/hosts owner=root group=root mode=0644"

# 创建目录
ansible all -m file -a "path=/var/log/nginx state=directory mode=0755"

4.4 包管理

# 安装 nginx
ansible webservers -m yum -a "name=nginx state=present"

# 卸载 git
ansible all -m yum -a "name=git state=absent"

4.5 服务管理

# 启动并设置开机自启
ansible webservers -m service -a "name=nginx state=started enabled=yes"

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

五、模块速查表

以下为运维场景中最常用的模块速查表,按功能分类:

| 功能分类 | 模块名称 | 用途 | 常用参数 |

| **系统信息** | `setup` | 收集主机 Facts | `filter=ansible_memtotal_mb` |

| **文件操作** | `copy` | 复制文件 | `src`, `dest`, `owner`, `mode` |

| | `file` | 管理文件/目录属性 | `path`, `state`, `mode`, `owner` |

| | `template` | 模板渲染(Jinja2) | `src`, `dest`, `vars` |

| **包管理** | `yum` / `apt` | 安装/卸载软件包 | `name`, `state=present/absent/latest` |

| **服务管理** | `service` | 管理服务状态 | `name`, `state=started/stopped/restarted`, `enabled` |

| **命令执行** | `command` | 执行命令(非 shell) | `chdir`, `creates`, `removes` |

| | `shell` | 通过 shell 执行 | `chdir`, `executable` |

| **用户管理** | `user` | 管理用户账户 | `name`, `state=present/absent`, `groups`, `shell` |

| **网络调试** | `ping` | 测试连通性 | 无参数 |

| **定时任务** | `cron` | 管理 crontab | `name`, `minute`, `hour`, `job`, `state=present/absent` |

六、进阶提示

6.1 使用 ansible-doc 查看模块文档

# 查看 copy 模块的完整文档
ansible-doc copy

# 列出所有可用模块
ansible-doc -l | grep yum

6.2 优化并行执行

# 设置并发数为 10(默认 5)
ansible all -m ping --forks=10

6.3 测试 Playbook 语法

# 检查 YAML 语法
ansible-playbook --syntax-check deploy.yml

# 模拟执行(dry run)
ansible-playbook -C deploy.yml

总结

Ansible 通过简单的 YAML 语法和模块化设计,极大降低了运维自动化的门槛。本文覆盖了从安装、核心概念到实际命令使用的完整流程,建议读者从 ping 模块开始测试环境,逐步尝试 copyyumservice 等常用模块,最终编写第一个 Playbook 完成实际部署任务。

最佳实践建议

1. 始终使用 `–syntax-check` 验证 Playbook。

2. 为 Inventory 文件设置合理的分组和变量。

3. 利用 `handlers` 实现服务重启的幂等控制。

4. 通过 `ansible-doc` 深入探索模块参数。

📚 推荐阅读

💎 加入知识星球「渗透实战安全圈」

第一时间获取最新安全技术文章、工具分享和实战案例

立即加入 →

💻 安全运维 / Linux运维 / 渗透测试 技术支持
业务需求可联系博客作者

By admin

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注