Ansible 内置了上百个模块,但日常命令行运维最常用的是 command、shell、copy、file、user、service、yum/apt 和 ping 模块,它们覆盖了命令执行、文件管理、用户管理和软件安装等核心场景。
先说结论:Ansible 命令行模块丰富,但日常 80% 的操作集中在少数核心模块上,掌握它们即可应对大部分批量运维任务。
- 适合:批量执行命令、分发文件、管理服务状态等标准化运维场景
- 先看:使用 ansible-doc -l 查看本地可用模块列表,确认环境支持
- 建议:优先使用专用模块(如 user、service)而非 shell 脚本,以保证幂等性
常用模块命令行示例
以下是常用模块的直接调用示例,假设 inventory 已配置好:
查看模块文档:ansible-doc -l 列出所有模块ansible-doc copy 查看 copy 模块详细参数
连通性测试:ansible all -m ping
执行命令:ansible all -m command -a "date"ansible all -m shell -a 'echo $HOME'(注意使用单引号防止本地变量解析)
文件与软件:ansible all -m copy -a "src=/local/file dest=/remote/path"ansible all -m yum -a "name=nginx state=present"(CentOS/RHEL)ansible all -m apt -a "name=nginx state=present"(Ubuntu/Debian)
模块原理与选型建议
Ansible 模块本质是封装好的脚本或程序,运行在远程主机上。命令行调用模块(Ad-Hoc)适合一次性任务,比如临时查个日志或重启服务。相比直接 SSH 登录,模块提供了结构化参数,比如 service 模块能确保服务“启动且开机自启”,而不仅仅是执行一次 start 命令。
核心区别在于 command 和 shell 模块:command 更安全但不支持管道符,shell 功能强但需注意注入风险。其他如 user、group、yum/apt 等模块则是为了屏蔽不同 Linux 发行版的命令差异,保证脚本通用性。
实操步骤
1. 确认模块可用性
在控制节点执行 ansible-doc -l,如果列表为空或报错,检查 Ansible 安装路径及环境变量。
2. 测试连通性
执行 ansible all -m ping,返回 pong 表示 SSH 免密或密码认证正常。如果失败,检查 hosts 清单及 SSH 配置。
3. 执行具体任务
根据需求选择模块。例如创建用户:ansible all -m user -a "name=test01"。注意参数使用双引号包裹,避免 shell 解析错误。
4. 权限提升
如果需要 root 权限,添加 `--become` 或 -b 参数,例如 ansible all -m yum -a "name=httpd state=present" -b。
效果验证与幂等性检查
1. 检查返回码
Ansible 执行成功后会显示绿色状态及 rc=0。黄色通常表示发生了变更(changed),红色表示失败。
2. 远程状态确认
对于文件模块,登录远程主机 ls -l 确认文件存在及权限。对于服务模块,使用 systemctl status 服务名 确认运行状态。
3. 幂等性验证
再次执行相同命令,观察输出。专用模块(如 user、yum)第二次执行应显示 changed=0,表示状态未变,这才是生效且稳定的标志。
常见错误与排查
1. command 不支持管道
如果需要 |、> 等符号,必须改用 shell 模块,否则命令会被当作普通字符串处理。
2. 路径问题
command 模块默认不在远程用户的 PATH 环境中,建议写命令绝对路径,或使用 chdir 参数指定工作目录。
3. 特殊字符转义
参数中包含 $、! 等符号时,外层建议使用单引号包裹,防止本地 shell 提前解析。
4. 典型报错示例
若出现 UNREACHABLE!,通常为 SSH 连接失败,检查网络及密钥:
fatal: [192.168.1.10]: UNREACHABLE! => {"changed": false, "msg": "Failed to connect to the host via ssh", "unreachable": true}若出现 MODULE NOT FOUND,检查模块名称拼写或 Ansible 版本:fatal: [192.168.1.10]: FAILED! => {"msg": "Could not find the requested module"}参考来源
- Ansible 官方文档:https://docs.ansible.com/ansible/latest/collections/index_module.html
- Ansible 命令行指南:https://docs.ansible.com/ansible/latest/cli/ansible.html
原文链接:https://www.zjcp.cc/ask/11121.html
