Ansible 常用模块详解:从配置管理到自动化运维实践
一、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支持directory、file、link、absent等状态可通过
mode、owner、group设置权限和属主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
注意事项:
state:mounted/unmounted/absentboot: 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 版本的不断演进,模块能力也在持续增强,建议在实际使用中结合官方文档进行查阅和验证。