一、Ansible 简介

Ansible 是一款 开源的自动化运维工具,广泛应用于配置管理、应用部署以及日常运维任务的自动化。与传统自动化工具相比,Ansible 具有以下显著特点:

  • 无需客户端:基于 SSH 通信,不需要在被管节点安装额外组件

  • 学习成本低:使用简单直观的 YAML 语法编写 Playbook

  • 天然幂等性:多次执行结果一致,避免重复操作带来的风险

  • 模块化设计:内置丰富模块,覆盖绝大多数运维场景

在 Ansible 中,自动化逻辑通过 Playbook 描述,而真正执行任务的核心能力来自于 模块(Modules)。本文将系统性地介绍一些 Ansible 中最常用、最实用的模块,并结合示例说明其典型使用场景和注意事项。


二、unarchive 模块:解压缩文件

unarchive 模块用于在远程主机上解压压缩包,常见于部署应用或分发程序文件。

- name: 解压文件
  unarchive:
    src: /tmp/archive.tar.gz
    dest: /opt/
    remote_src: yes
    creates: /opt/extracted_dir

注意事项:

  • remote_src: yes 表示压缩包已经存在于远程主机

  • creates 用于保证幂等性,目标存在时不会重复解压

  • 默认行为会先拷贝再解压,大文件场景下需注意带宽消耗


三、file 模块:文件与目录管理

file 模块用于管理文件、目录和符号链接,是最基础、也是使用频率极高的模块之一。

- name: 创建目录
  file:
    path: /path/to/directory
    state: directory
    mode: '0755'
    owner: user
    group: group

注意事项:

  • state 支持 directoryfilelinkabsent 等状态

  • 可通过 modeownergroup 设置权限和属主

  • force: yes 可用于强制创建符号链接


四、copy 模块:文件分发

copy 模块用于将本地文件复制到远程主机。

- name: 复制文件到指定目录
  copy:
    src: /local/path/to/file
    dest: /remote/path/to/file
    owner: user
    group: group
    mode: '0644'
    backup: yes

注意事项:

  • backup: yes 在覆盖文件前自动备份

  • content 可直接写入文件内容,适合小型配置文件

  • validate 可在复制前校验配置合法性


五、lineinfile 模块:精确修改配置行

lineinfile 用于保证某一行配置存在、被修改或被删除。

- name: 禁止 SSH Root 登录
  lineinfile:
    path: /etc/ssh/sshd_config
    regexp: '^PermitRootLogin'
    line: 'PermitRootLogin no'
    backup: yes

注意事项:

  • 常用于修改系统配置文件

  • regexp + line 组合可以精确匹配并替换

  • state: absent 可删除匹配行


六、replace 模块:批量文本替换

replace 模块适合进行 正则级别的文本替换

- name: 启用调试模式
  replace:
    path: /etc/myapp/myapp.conf
    regexp: 'debug_mode=False'
    replace: 'debug_mode=True'

注意事项:

  • 支持多行匹配(multiline: yes

  • before / after 可限制替换范围

  • 建议搭配 backup: yes 使用


七、mount 模块:文件系统挂载

用于管理本地或远程文件系统挂载(如 NFS)。

- name: 挂载 NFS 共享
  mount:
    path: /mnt/nfs
    src: nfs.example.com:/share
    fstype: nfs
    opts: rw,sync
    state: mounted

注意事项:

  • statemounted / unmounted / absent

  • boot: yes 可设置为开机自动挂载

  • 确保网络与权限已正确配置


八、cron 模块:计划任务管理

用于创建和管理 cron 定时任务。

- name: 添加每日备份任务
  cron:
    name: "daily backup"
    minute: "0"
    hour: "2"
    job: "/usr/local/bin/backup.sh"
    user: root

注意事项:

  • name 是任务唯一标识

  • special_time 支持 @daily@weekly

  • state: absent 可删除任务


九、service 与 systemd 模块:服务管理

service 模块(传统 init 系统)

- name: 确保 nginx 服务运行
  service:
    name: nginx
    state: started
    enabled: yes

systemd 模块(推荐)

- name: 重启并启用 httpd 服务
  systemd:
    name: httpd
    state: restarted
    enabled: yes
    daemon_reload: yes

注意事项:

  • systemd 是现代 Linux 的首选

  • daemon_reload 用于 unit 文件变更后

  • masked: yes 可彻底禁用服务


十、user 与 group 模块:用户与组管理

user 模块

- name: 创建用户
  user:
    name: johndoe
    groups: admin,developers
    shell: /bin/bash
    create_home: yes
    generate_ssh_key: yes

group 模块

- name: 确保开发者组存在
  group:
    name: developers
    state: present
    gid: 1002

注意事项:

  • password 必须是加密后的值

  • 删除用户时可用 remove: yes 清理家目录

  • 修改已有组需谨慎,可能影响权限


十一、yum 模块:软件包管理(RHEL 系)

- name: 安装最新版本 Apache
  yum:
    name: httpd
    state: latest
    update_cache: yes

十二、get_url 模块:下载文件

- name: 下载文件
  get_url:
    url: https://example.com/file.tar.gz
    dest: /tmp/file.tar.gz
    checksum: sha256:3f1b9e89...

建议:

大规模分发文件时,推荐
本地下载 → copy 模块分发


十三、command / shell / script:执行命令与脚本

command(推荐,安全)

- name: 查看目录
  command: ls -l /tmp

shell(支持管道)

- name: 设置密码
  shell: echo '1' | passwd --stdin user

script(执行本地脚本)

- name: 执行脚本
  script: ./script.sh

原则:

能用模块就不用 shell
能用 command 就不用 shell


十四、查询模块帮助

ansible-doc unarchive

官方文档:
👉 https://docs.ansible.com/


结语

Ansible 模块覆盖了运维工作的绝大多数场景。合理选择模块、遵循幂等性原则、避免不必要的 shell 操作,是写好 Playbook 的关键。

随着 Ansible 版本的不断演进,模块能力也在持续增强,建议在实际使用中结合官方文档进行查阅和验证。