CentOS下Ansible部署时常见故障有哪些?
CentOS上Ansible自动化部署:从零到一的实战指南
最近公司服务器越来越多,手动部署软件、配置环境简直要命,上周运维小哥加班到凌晨三点,就因为要给二十台服务器装Nginx,结果还漏了两台配置没改,看着他顶着黑眼圈来上班,我实在忍不住了——这年头还靠人肉运维,也太不互联网了吧?
其实半年前我就在研究Ansible,但总觉得"自动化部署"这种词听起来高大上,实际操作起来肯定复杂,直到上周亲自在CentOS上跑通了第一个Playbook,才发现这玩意儿简直是为运维人员量身定做的救星,今天就把我的实战经验分享出来,保证让新手也能快速上手。

为什么选Ansible?
说真的,现在自动化工具那么多,为什么偏偏选Ansible?这得从我踩过的坑说起。
去年试过用Puppet,光是安装Master-Agent架构就折腾了半天,后来又玩Chef,发现要学Ruby语法,对运维来说门槛太高,最要命的是这些工具都需要在被管服务器上装客户端,我们有些老旧服务器根本装不上。
Ansible最打动我的就是"无代理"设计,它通过SSH协议管理节点,只要服务器能连SSH就能用,我们公司有台2012年的CentOS 6服务器,连Python 2.6都跑着,用Ansible照样能管理。
另一个优势是YAML语法,记得第一次写Playbook时,看着这种类似配置文件的格式,比写Shell脚本舒服多了,比如要安装Nginx,传统方式要写循环判断、错误处理,用Ansible就三行:
- name: Install Nginx yum: name: nginx state: present
环境准备:从零开始搭建
安装Ansible
我的测试环境是三台CentOS 7服务器:

- 控制机:192.168.1.100(装Ansible)
- 节点1:192.168.1.101
- 节点2:192.168.1.102
在控制机上执行:
sudo yum install epel-release -y sudo yum install ansible -y
安装完检查版本:
ansible --version # 应该看到类似 ansible 2.9.27 的输出
配置SSH免密登录
这一步最容易卡新人,我刚开始总遇到"Permission denied"错误,后来发现是权限问题。
生成密钥对:
ssh-keygen -t rsa
把公钥传到节点(以节点1为例):
ssh-copy-id root@192.168.1.101
测试连接:
ssh root@192.168.1.101 # 能直接登录说明配置成功
创建Inventory文件
Ansible通过Inventory文件管理主机组,在/etc/ansible/hosts
里添加:
[webservers] 192.168.1.101 192.168.1.102 [dbservers] 192.168.1.103
测试连通性:
ansible webservers -m ping # 应该看到两台主机返回"pong"
第一个Playbook实战
场景:部署Web环境
需求:在webservers组安装Nginx+PHP,并启动服务。
创建web_deploy.yml
文件:
--- - name: Deploy Web Environment hosts: webservers become: yes # 提权执行 tasks: - name: Install EPEL Repository yum: name: epel-release state: present - name: Install Nginx and PHP yum: name: "{{ item }}" state: present loop: - nginx - php - php-fpm - name: Start Nginx Service service: name: nginx state: started enabled: yes - name: Start PHP-FPM Service service: name: php-fpm state: started enabled: yes
执行命令:
ansible-playbook web_deploy.yml
看着终端滚动显示执行进度,那种感觉就像看着自己的孩子学会走路,执行完后检查:
ansible webservers -a "systemctl status nginx"
进阶技巧:变量与模板
使用变量
在/etc/ansible/group_vars/webservers
里创建变量文件:
nginx_worker_processes: 4 nginx_worker_connections: 1024
修改Playbook引用变量:
- name: Configure Nginx template: src: nginx.conf.j2 dest: /etc/nginx/nginx.conf notify: Restart Nginx
模板文件示例
创建templates/nginx.conf.j2
:
worker_processes {{ nginx_worker_processes }}; events { worker_connections {{ nginx_worker_connections }}; }
Handlers使用
在Playbook底部添加:
handlers: - name: Restart Nginx service: name: nginx state: restarted
这样配置文件修改后会自动重启服务,比手动执行方便多了。
常见问题解决方案
Python版本冲突
有次在CentOS 6上执行报错,提示Python 2.6不支持某些模块,解决方案是在Inventory文件里指定:
[old_servers] 192.168.1.103 ansible_python_interpreter=/usr/bin/python2.6
执行权限问题
遇到"Failed to change directory"错误,是因为当前用户没有目标目录权限,可以在Playbook开头添加:
- name: Ensure /tmp exists file: path: /tmp state: directory mode: 0755
任务依赖处理
安装MySQL前需要先安装依赖包,用depends
参数:
- name: Install MySQL Dependencies yum: name: libaio state: present - name: Install MySQL yum: name: mysql-server state: present depends: - Install MySQL Dependencies
实际生产案例
上周给客户部署的完整Playbook结构:
deploy/
├── inventory/
│ ├── production
│ └── staging
├── group_vars/
│ ├── webservers.yml
│ └── dbservers.yml
├── roles/
│ ├── nginx/
│ ├── php/
│ └── mysql/
└── site.yml
执行命令:
ansible-playbook -i inventory/production site.yml --extra-vars "version=1.2.0"
这种结构清晰易维护,新员工接手也能快速理解。
总结与建议
经过三个月实战,Ansible给我最大的感受是:
- 效率提升:原来部署环境要2小时,现在10分钟搞定
- 错误减少:标准化流程避免了人为失误
- 知识沉淀:Playbook就是最好的文档
给新手的建议:
- 先从简单任务开始,比如批量修改密码
- 善用
ansible-doc
命令查看模块用法 - 遇到问题先查官方文档,90%的问题都有解决方案
- 加入Ansible中文社区,很多坑前人都踩过
现在运维小哥终于不用加班了,上周还主动教我写更复杂的Role,看着服务器自动部署成功时的绿色"ok",那种成就感不亚于自己开发了个新功能,如果你还在手动运维,真的建议试试Ansible——它可能会彻底改变你的工作方式。
文章评论