项目名称
项目简称或代号:SAC项目
(这个可以自己随便编一个,每个公司的每个项目简称或代号都是内部任意起名的,显得专业一点,一般是项目关键词的首拼,比如这个ASC是:Starlight AutoDeploy Center)
项目全名:星辰自动化部署项目
项目背景
随着公司业务的快速发展,对服务器资源的需求日益增加。为提高服务器部署效率,确保上线环境的一致性和稳定性,公司决定实施自动化部署策略,以快速响应业务需求。
项目目标
实现新服务器的快速上线,缩短部署周期。
确保部署环境的一致性和标准化。
降低人为错误,提高部署成功率。
项目成果
成功部署了21台新服务器,并确保了环境的一致性和稳定性。
部署周期从原来的1.5小时一台服务器缩短至0.5小时,极大提高了上线效率。
自动化部署减少了人为错误,提高了部署成功率至99%以上。
我的角色与职责
作为运维工程师,我负责整个自动化部署项目的实施和管理工作。具体职责包括制定部署策略、编写和执行自动化脚本、监控部署过程、解决部署中遇到的问题以及进行项目成果验收。
我主要完成的工作内容
根据现有配置部署了Ansible及Playbook工具,为自动化部署奠定了基础。
结合应用系统环境需求,定制了包括系统环境初始化、系统优化、服务软件安装、配置模板在内的部署模版,并制作了一键执行脚本Playbook。
使用Roles功能细化了不同模板中的不同任务,确保了部署的灵活性和可扩展性。
在新服务器上成功部署了LNMP环境,并编制了Nginx配置文件,实现了批量化部署。
完成自动化部署后,根据定制的检测模板对部署效果进行了检验,确保了上线环境的稳定性和安全性。
本次项目涉及的技术
Ansible、Playbook、Roles、Nginx、LNMP环境搭建、Shell脚本、自动化测试技术等。
本次项目遇到的问题与解决方法
问题:在部署过程中,部分服务器出现网络连接问题。 解决方法:检查服务器网络配置,并与网络团队协同解决,确保所有服务器都能正常访问网络资源。
问题: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环境部署完成!"
经验教训与自我提升
加深了对自动化部署工具和技术的理解,提高了解决问题的能力。
意识到团队协作的重要性,与同事保持良好的沟通能更高效地完成任务。
展望未来
随着技术的不断发展和公司业务的进一步扩张,我将继续探索和学习新的自动化部署技术和工具,以提高部署效率和系统稳定性。同时,我也将关注云计算和容器化等新技术的发展趋势,为公司提供更先进、更高效的运维解决方案。