自动化运维工具 Ansible 概述及命令行模块是什么?

文章导读
Ansible 是一款基于 Python 开发的自动化运维工具,通过 SSH 协议管理远程主机,无需在被管节点安装客户端,适合批量配置、部署和任务编排。
📋 目录
  1. 核心工作原理
  2. 环境搭建与配置
  3. 常用命令与权限管理
  4. 结果验证与幂等性
  5. 常见故障排查
  6. 参考资料
A A

Ansible 是一款基于 Python 开发的自动化运维工具,通过 SSH 协议管理远程主机,无需在被管节点安装客户端,适合批量配置、部署和任务编排。

核心要点:Ansible 核心优势在于无代理架构和模块化设计,适合中小规模至大规模服务器的统一管控。

  • 适用场景:批量执行命令、部署应用或管理配置。
  • 前置检查:确认控制节点与受管节点 SSH 连通及 Python 环境。
  • 权限注意:系统级操作(如安装软件)必须添加 `--become` 参数提权。

核心工作原理

Ansible 之所以被广泛使用,主要因为它不需要在被管理的主机上安装任何代理程序(Agentless)。它通过 SSH 协议直接连接远程主机,利用远程主机现有的 Python 环境执行临时模块代码,执行完后自动清理。

这种设计降低了维护成本,不需要为了管理而额外部署守护进程。其核心工作逻辑是基于模块的,Ansible 本身只提供框架,真正干活的是模块(如文件管理、服务控制等)。此外,它支持幂等性,即同一个操作执行多次的结果与执行一次相同,这保证了重复运行剧本的安全性。

环境搭建与配置

1. 准备控制节点
在一台 Linux 机器上安装 Ansible。CentOS 系统可通过 EPEL 源安装:

yum install epel-release -y
yum install ansible -y

2. 配置主机清单
编辑/etc/ansible/hosts 文件,定义受管节点分组:

[web_servers]
192.168.1.101
192.168.1.102

[db_servers]
192.168.1.103

3. 配置 SSH 免密
确保控制节点能通过 SSH 密钥登录受管节点,否则每次执行都需要输入密码。使用以下命令分发公钥:

自动化运维工具 Ansible 概述及命令行模块是什么?
ssh-keygen -t rsa
ssh-copy-id root@192.168.1.101

常用命令与权限管理

如果你已经安装好 Ansible,可以直接用以下命令测试连通性和执行基础任务。注意涉及系统变更的操作需要提权。

ansible all -m ping
ansible web_servers -m command -a "uptime"
ansible web_servers -m yum -a "name=httpd state=present" `--become`
ansible db_servers -m copy -a "src=/local/file dest=/remote/path" `--become`

第一条检查所有主机连通性,第二条在 web 服务器组执行 uptime 命令,第三条安装 httpd 服务(需提权),第四条拷贝文件到数据库服务器组(需提权)。

结果验证与幂等性

执行命令后,观察返回结果。成功时通常显示绿色或黄色的状态信息(changed 或 ok)。

1. 检查返回码
命令执行完毕后,查看终端输出是否有 FAILED 字样。正常情况应显示 SUMMARY 信息。

2. 登录远程主机确认
手动 SSH 登录到受管节点,检查文件是否存在或服务是否运行。例如:

自动化运维工具 Ansible 概述及命令行模块是什么?
ssh 192.168.1.101
systemctl status httpd

3. 再次执行命令
重复执行相同的 Ansible 命令,观察 changed 状态。如果配置正确,第二次执行应显示 ok 而不是 changed,体现幂等性。

常见故障排查

1. 权限拒绝 (Permission Denied)
涉及系统配置修改时未加提权参数,会报错。错误示例:

FATAL: [192.168.1.101]: FAILED! => {"changed": false, "msg": "Failure running command", "rc": 1, "stderr": "You need to be root to perform this command"}

解决方法:在命令后添加 `--become` 参数。

2. Python 环境缺失
受管节点必须安装 Python(2.6+ 或 3.5+)。最小化安装的系统可能没有 Python,会导致模块执行失败,报错通常包含 "Failed to connect to the host via ssh" 或 Python 解释器找不到。

3. SSH 认证失败
如果没有配置密钥且未指定密码插件,命令会卡在密码输入或直接报错。生产环境建议强制使用密钥认证。

4. 模块参数错误
不同模块接受的参数不同。例如 command 模块不支持 shell 特性(如管道符),需要用 shell 模块代替。使用前建议查阅模块文档。

参考资料