【运维项目经历|006】:服务器自动化部署平台构建项目

项目名称

项目简称或代号:SAC项目

(这个可以自己随便编一个,每个公司的每个项目简称或代号都是内部任意起名的,显得专业一点,一般是项目关键词的首拼,比如这个ASC是:Starlight AutoDeploy Center)

项目全名:星辰自动化部署项目

项目背景

随着公司业务的快速发展,对服务器资源的需求日益增加。为提高服务器部署效率,确保上线环境的一致性和稳定性,公司决定实施自动化部署策略,以快速响应业务需求。

项目目标

  1. 实现新服务器的快速上线,缩短部署周期。

  2. 确保部署环境的一致性和标准化。

  3. 降低人为错误,提高部署成功率。

项目成果

  1. 成功部署了21台新服务器,并确保了环境的一致性和稳定性。

  2. 部署周期从原来的1.5小时一台服务器缩短至0.5小时,极大提高了上线效率。

  3. 自动化部署减少了人为错误,提高了部署成功率至99%以上。

我的角色与职责

作为运维工程师,我负责整个自动化部署项目的实施和管理工作。具体职责包括制定部署策略、编写和执行自动化脚本、监控部署过程、解决部署中遇到的问题以及进行项目成果验收。

我主要完成的工作内容

  1. 根据现有配置部署了Ansible及Playbook工具,为自动化部署奠定了基础。

  2. 结合应用系统环境需求,定制了包括系统环境初始化、系统优化、服务软件安装、配置模板在内的部署模版,并制作了一键执行脚本Playbook。

  3. 使用Roles功能细化了不同模板中的不同任务,确保了部署的灵活性和可扩展性。

  4. 在新服务器上成功部署了LNMP环境,并编制了Nginx配置文件,实现了批量化部署。

  5. 完成自动化部署后,根据定制的检测模板对部署效果进行了检验,确保了上线环境的稳定性和安全性。

本次项目涉及的技术

Ansible、Playbook、Roles、Nginx、LNMP环境搭建、Shell脚本、自动化测试技术等。

本次项目遇到的问题与解决方法

  1. 问题:在部署过程中,部分服务器出现网络连接问题。 解决方法:检查服务器网络配置,并与网络团队协同解决,确保所有服务器都能正常访问网络资源。

  2. 问题:Nginx配置文件编写复杂,易出错。 解决方法:采用模板化配置,结合变量和条件语句,简化了配置文件编写过程,降低了出错率。

本次项目中可能被面试官问到的技术性问题及答案

问题1:本次项目成员一共几个人?

答案:一共2个运维工程师

问题2:本次周期多长时间?

答案:项目周期大概一个月左右,前期主要进行数据备份、机房架构规划、服务架构拓扑图调整、中期主要进行自动化工具部署和脚本编写、后期主要进行服务器上线、自动化部署和测试及验证

问题3:本次项目一共涉及多少台服务器?

答案:一共涉及151台服务器,其中130台是原有服务器,进行了系统升级优化、自动化服务部署;21台是新服务器,主要进行了操作系统安装、系统初始化、环境部署及优化等工作

问题4:什么是Roles功能

答案:Roles功能是Ansible自动化运维工具中的一个重要概念。它能够根据层次型结构自动装载变量文件、tasks以及handlers等。

Roles通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中,并提供了一种便捷的方式来include它们。这种机制使得代码复用度更高,特别是在同时部署多个应用或服务时,只需编写一个Role,就可以在多个Playbook中复用。

Roles的主要使用场景包括基于主机构建服务的场景,但也可以用于构建守护进程等场景中。在Roles中,各个目录具有特定的含义:

  • files:用于存放由copy模块或script模块调用的文件。

  • templates:用于存放Jinja2模板,template模块会自动在此目录中寻找Jinja2模板文件。

  • tasks:此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。

  • handlers:此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。

问题5:你是如何确保部署环境的一致性的?

答案:通过制定统一的部署标准、使用Ansible和Playbook工具以及定制化的部署模板,我们确保了部署环境的一致性

问题6:在自动化部署过程中,你是如何监控和处理错误的?

答案:我们使用Ansible的内置功能进行部署过程的监控,并编写了错误处理脚本以自动处理常见的部署错误。

问题7:什么是Playbook工具?

答案:Playbook是Ansible用于配置、部署和管理被控节点的剧本。它可以被描述为一个需要远程主机执行命令的方案,或者一组IT程序运行的命令集合。

Playbook是由一个或多个play组成的列表,使用YAML来编写。Playbook是一个不同于使用Ansible命令行执行方式的模式,其功能更强大灵活。它是一个非常简单的配置管理和多主机部署系统,不同于任何已经存在的模式,可作为一个适合部署复杂应用程序的基础。

Playbook可以定制配置,按照指定的操作步骤有序执行,支持同步和异步方式。其核心元素包括hosts(执行的远程主机列表)、tasks(由模板定义的操作列表)、variables(变量,内置变量或者自定义变量在playbook中调用)、templates(使用模板语法的文件,可替换模板中的变量并实现一些简单逻辑的文件)、handlers(和notify结合使用,当某条件满足时触发执行的操作)以及tags(指定某条件下,用于选择运行playbook中的部分代码)

问题8:在本次项目中你写了什么shell脚本,大致内容是什么?

答案:1:写了一个linux系统初始化脚本,内容如下:

#!/bin/bash  
  
# 系统初始化脚本  
  
# 1. 更新系统软件包  
echo "Updating system packages..."  
sudo apt-get update  
sudo apt-get -y upgrade  
  
# 2. 设置时区(例如设置为UTC)  
echo "Setting timezone to UTC..."  
sudo timedatectl set-timezone UTC  
  
# 3. 配置SSH(如果需要)  
# 例如:修改SSH端口、禁用root登录等  
# echo "Configuring SSH..."  
# sudo sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin no/' /etc/ssh/sshd_config  
# sudo service ssh restart  
  
# 4. 配置防火墙(如果使用iptables或firewalld)  
# 例如:允许SSH端口、HTTP和HTTPS端口  
# echo "Configuring firewall..."  
# sudo ufw allow ssh  
# sudo ufw allow http  
# sudo ufw allow https  
# sudo ufw enable  
  
# 5. 创建用户(如果需要)  
# 例如:创建一个名为'newuser'的用户并设置密码  
# echo "Creating new user..."  
# sudo useradd newuser  
# sudo passwd newuser  
  
# 6. 配置其他服务(如Apache、Nginx、MySQL等)  
# 这里可以根据需要添加其他服务的配置步骤  
  
# 7. 清理不必要的软件包和临时文件  
echo "Cleaning up..."  
sudo apt-get autoremove  
sudo apt-get autoclean  
sudo rm -rf /tmp/*  
  
# 8. 显示完成信息  
echo "System initialization complete!"  
  
# 脚本执行完毕  
exit 0

2:写了一个一键部署LNMP环境的shell脚本,内容如下:

#!/bin/bash  
  
# 检查是否以root用户运行  
if [[ $EUID -ne 0 ]]; then  
    echo "这个脚本必须以root用户身份运行"  
    exit 1  
fi  
  
# 更新软件包列表  
echo "更新软件包列表..."  
apt-get update  
  
# 安装Nginx  
echo "安装Nginx..."  
apt-get install -y nginx  
  
# 启动Nginx服务并设置开机自启  
echo "启动Nginx服务..."  
systemctl start nginx  
systemctl enable nginx  
  
# 安装MySQL(MariaDB)  
echo "安装MySQL(MariaDB)..."  
apt-get install -y mariadb-server  
  
# 启动MySQL服务并设置开机自启  
echo "启动MySQL服务..."  
systemctl start mysql  
systemctl enable mysql  
  
# 设置MySQL root密码(这里使用固定密码,建议生产环境使用更安全的方式)  
MYSQL_ROOT_PASSWORD='init_passwd'  
echo "mysql-install-db --user=mysql --ldata=/var/lib/mysql --basedir=/usr --skip-name-resolve"  
mysql_secure_installation <<EOF  
$MYSQL_ROOT_PASSWORD  
$MYSQL_ROOT_PASSWORD  
y  
y  
y  
y  
y  
y  
EOF  
  
# 安装PHP  
echo "安装PHP..."  
apt-get install -y php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip  
  
# 配置Nginx以使用PHP-FPM  
sed -i 's/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/' /etc/php/7.4/fpm/php.ini    # 假设PHP 7.4,请根据实际情况修改  
sed -i 's/listen = /listen = 127.0.0.1:9000/' /etc/php/7.4/fpm/pool.d/www.conf # 假设PHP 7.4,请根据实际情况修改  
  
# 配置Nginx以解析PHP  
cat <<EOF > /etc/nginx/sites-available/default  
server {  
    listen 80 default_server;  
    listen [::]:80 default_server;  
    root /var/www/html;  
    index index.php index.html index.htm index.nginx-debian.html;  
    server_name _;  
    location / {  
        try_files $uri $uri/ =404;  
    }  
    location ~ \.php$ {  
        include snippets/fastcgi-php.conf;  
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock; # 假设PHP 7.4,请根据实际情况修改  
    }  
    location ~ /\.ht {  
        deny all;  
    }  
}  
EOF  
  
# 启用Nginx配置  
ln -sf /etc/nginx/sites-available/default /etc/nginx/sites-enabled/  
  
# 重启Nginx和PHP-FPM  
echo "重启Nginx和PHP-FPM..."  
systemctl restart nginx  
systemctl restart php7.4-fpm # 假设PHP 7.4,请根据实际情况修改  
  
# 显示完成信息  
echo "LNMP环境部署完成!"

经验教训与自我提升

  1. 加深了对自动化部署工具和技术的理解,提高了解决问题的能力。

  2. 意识到团队协作的重要性,与同事保持良好的沟通能更高效地完成任务。

展望未来

随着技术的不断发展和公司业务的进一步扩张,我将继续探索和学习新的自动化部署技术和工具,以提高部署效率和系统稳定性。同时,我也将关注云计算和容器化等新技术的发展趋势,为公司提供更先进、更高效的运维解决方案。

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-05-15 15:20:09       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-05-15 15:20:09       101 阅读
  3. 在Django里面运行非项目文件

    2024-05-15 15:20:09       82 阅读
  4. Python语言-面向对象

    2024-05-15 15:20:09       91 阅读

热门阅读

  1. Element-ui el-table组件单选/多选/跨页勾选讲解

    2024-05-15 15:20:09       34 阅读
  2. js判断是否PC端

    2024-05-15 15:20:09       35 阅读
  3. kafka管理工具 kafka-ui 的 k8s 部署

    2024-05-15 15:20:09       24 阅读
  4. mac中launchctl使用教程

    2024-05-15 15:20:09       30 阅读
  5. 使用IDEA搭建MyBatis环境

    2024-05-15 15:20:09       29 阅读
  6. 大模型日报2024-05-14

    2024-05-15 15:20:09       32 阅读
  7. set和map

    set和map

    2024-05-15 15:20:09      24 阅读
  8. 【C++】DLL 的加载方式

    2024-05-15 15:20:09       37 阅读
  9. 输电线路的覆冰

    2024-05-15 15:20:09       32 阅读
  10. c# 几何图形编程接口

    2024-05-15 15:20:09       32 阅读