CentOS下Ansible部署时常见故障有哪些?

代码编程 2025-08-22 1113

CentOS上Ansible自动化部署:从零到一的实战指南

最近公司服务器越来越多,手动部署软件、配置环境简直要命,上周运维小哥加班到凌晨三点,就因为要给二十台服务器装Nginx,结果还漏了两台配置没改,看着他顶着黑眼圈来上班,我实在忍不住了——这年头还靠人肉运维,也太不互联网了吧?

其实半年前我就在研究Ansible,但总觉得"自动化部署"这种词听起来高大上,实际操作起来肯定复杂,直到上周亲自在CentOS上跑通了第一个Playbook,才发现这玩意儿简直是为运维人员量身定做的救星,今天就把我的实战经验分享出来,保证让新手也能快速上手。

CentOS Ansible部署-常见故障-常见故障

为什么选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服务器:

CentOS Ansible部署-常见故障-常见故障
  • 控制机: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给我最大的感受是:

  1. 效率提升:原来部署环境要2小时,现在10分钟搞定
  2. 错误减少:标准化流程避免了人为失误
  3. 知识沉淀:Playbook就是最好的文档

给新手的建议:

  1. 先从简单任务开始,比如批量修改密码
  2. 善用ansible-doc命令查看模块用法
  3. 遇到问题先查官方文档,90%的问题都有解决方案
  4. 加入Ansible中文社区,很多坑前人都踩过

现在运维小哥终于不用加班了,上周还主动教我写更复杂的Role,看着服务器自动部署成功时的绿色"ok",那种成就感不亚于自己开发了个新功能,如果你还在手动运维,真的建议试试Ansible——它可能会彻底改变你的工作方式。

CentOS expect自动登录时常见故障该如何解决?
« 上一篇 2025-08-21
如何实现CentOS日志高效上传至ELK的落地实践?
下一篇 » 2025-08-22

文章评论