前言:
在现代化应用部署中,环境的一致性与部署效率直接影响业务迭代速度。传统手动部署LNMP环境存在操作繁琐、易出错、难以复现等问题。Jenkins作为持续集成核心工具,与Ansible配置管理强强联合,能够实现"基础设施即代码"的自动化运维理念。本文将以OpenEuler系统为例,系统讲解如何通过Jenkins调用Ansible完成LNMP平台的自动化构建与应用部署,为开发运维团队提供一套可落地、可扩展的自动化解决方案。
目录
一、Jenkins主机中安装并配置Ansible
操作系统 | IP地址 | 主机名 | 角色 |
---|---|---|---|
OpenEuler24.03 | 192.168.72.138 | Jenkins | Jenkins服务器 |
OpenEuler24.03 | 192.168.72.139 | localhost | webserver |
1、安装ansible
###在192.168.72.138 Jenkins服务器上安装
yum install -y ansible
2、修改配置
###Ansible 将默认使用 root用户来连接远程主机执行任务
vim /etc/ansible/ansible.cfg
remote_user=root
3、添加目标主机组
###定义主机组,该组包含需要进行远程部署的主机
vim /etc/ansible/hosts
[webServer]
192.168.72.139
4、Jenkins SSH 密钥设置流程
###在Jenkins主机进行操作
su -s /bin/bash jenkins
ssh-keygen
Ctrl+C(复制/var/lib/jenkins/.ssh/id_ed25519这段)
###在Jenkins界面
###进入Manage Jenkins/Syetem中修改
###找到 Publish over SSH部分
###设置 Path to key:Ctrl+v(粘贴/var/lib/jenkins/.ssh/id_ed25519)
###新增SSH Server
###Name:webServer-LNMP
###Hostname:192.168.72.138
###Username:root
###Remote Directory:/root
####从Jenkins用户环境复制公钥到远程服务器
ssh-copy-id root@192.168.72.138
ssh-copy-id root@192.168.72.139
###在192.168.72.138主机上复制密钥到192.168.72.139主机
ssh-copy-id 192.168.72.139
###再次从Jenkins环境复制
ssh-copy-id root@192.168.72.139
###在72.138主机和Jenkins环境中测试Ansible连通性
ansible webServer -m ping
二、Jenkins配置ansible插件
1. 在勾选所需插件
2. 点击"安装"按钮
3. 等待安装完成(网速影响安装时间)
三、构建项目
点击Jenkins的LOGO,回到控制台→点击新建Item
新建Item→输入一个任务名称:<根据业务需求自定义>→Select an item type:Freestyle project→确定
这样就创建好了一个Freestyle project
点击配置→Configuration→Build Steps→增加构建步骤:Invoke Ansible Ad-Hoc Command
Invoke Ansible Ad-Hoc Command配置→调用yum模块安装php-fpm、php-fpm、php、php-mysqlnd、mysql-server、mysql、nginx
Invoke Ansible Ad-Hoc Command配置,例:使用 /etc/ansible/hosts
文件作为主机清单(主机清单在配置中可以忽略不写),在 webServer
主机组(即 192.168.72.139
)上,调用 service
模块,确保 php-fpm
服务处于运行状态,并且配置为开机自动启动
配置参数详解
界面中的每个字段都对应一个 Ansible 命令的核心参数:
Ansible installation:
ansible - hoc
作用: 指定使用哪个 Ansible 版本来执行命令。这里的
ansible - hoc
可能是一个预配置的 Ansible 环境名称,指向 Jenkins 服务器上安装的 Ansible 可执行文件路径。
Host pattern:
webServer
作用: 指定命令在哪些主机上执行。这里的
webServer
就是在/etc/ansible/hosts
Inventory 文件中定义的主机组。这意味着命令将对该组下的所有主机(即192.168.72.139
)生效。
Inventory:
File or host list
->/etc/ansible/hosts
作用: 指定 Ansible 的“库存”文件路径,该文件定义了可管理的主机和组。这里明确告诉 Ansible 去
/etc/ansible/hosts
这个文件中查找webServer
组包含哪些主机。
Module:
service
作用: 指定要使用的 Ansible 模块。
service
模块用于管理远程主机上的服务(启动、停止、重启、设置开机自启等),它是一个非常核心和常用的模块。
Module arguments or command to execute:
name=php-fpm state=started enabled=true
作用: 为选定的模块提供具体的参数。这里给
service
模块传递了三个参数:name=php-fpm
: 操作的对象是名为php-fpm
的服务。state=started
: 期望的状态是“启动”。如果服务未运行,则启动它;如果已运行,则不进行任何操作(幂等性)。enabled=true
: 设置开机自动启动。确保系统重启后,php-fpm
服务会自动启动。
Invoke Ansible Ad-Hoc Command配置完成后应用并Save 回到项目状态页面进行Build Now
项目构建完成后得到以下Jenkins界面结果
要确认php-fpm和mysql是否正常启动并且能解析php文件,例:根据上述操作重新创建项目,并配置Invoke Ansible Ad-Hoc Command→Build Now→项目构建完成,进行测试
分别访问192.168.72.139/phpinfo.php、192.168.72.139/phpinfo.php,访问成功,phpinfo.php、mysql.php正常解析
部署Discuz论坛,配置Invoke Ansible Ad-Hoc Command
将Discuz.zip包拷入192.168.72.139主机
mkdir /data/
cd /data
[root@git data]# rz
rz waiting to receive.**[root@git data]#
[root@git data]# ls
Discuz.zip
回到Jenkins界面,Build Now
构建成功
访问192.168.72.139/upload,进行安装,最后安装完成进入到Discuz论坛界面,完成LNMP平台部署
四、流水线触发机制
主项目构建成功触发测试项目触发部署项目完成部署
配置方法:
在"构建后操作"选择"Build other projects"
输入下游项目名称(如LNMP-test)
勾选"Trigger only if build is stable"
五、流水线脚本进阶
1、声明式流水线示例
pipeline {
agent any
stages {
stage('Deploy LAMP') {
steps {
ansiblePlaybook(
playbook: 'lamp.yml',
inventory: 'inventory.ini',
credentialsId: 'ssh-key'
)
}
}
stage('Test') {
steps {
sh 'curl -I http://localhost/phpinfo.php | grep 200'
}
}
}
post {
success {
mail to: 'admin@example.com',
subject: 'Deployment Succeeded',
body: 'LAMP stack deployed successfully'
}
}
}
2、脚本式流水线优势
版本控制:脚本可纳入Git仓库管理
阶段可视化:清晰展示构建各阶段状态
错误处理:完善的异常处理机制
并行执行:支持并行任务加速构建
六、最佳实践总结
1、配置管理规范
凭据统一使用Jenkins凭证管理
敏感数据(密码、密钥)禁止硬编码在脚本中
共享库开发:封装常用Ansible Playbook
2、性能优化策略
优化方向 | 具体措施 | 预期效果 |
---|---|---|
执行器配置 | 增加执行器数量(根据CPU核心数调整) | 提升并发任务能力 |
节点管理 | 配置构建节点分担主节点压力 | 避免单点瓶颈 |
缓存机制 | 使用tmp 目录缓存依赖包 |
减少网络传输 |
任务拆分 | 大型Playbook拆分为多个阶段 | 提高错误定位效率 |
3、维护建议
定期清理构建历史:
Manage Jenkins
→Script Console
执行Jenkins.instance.items.each {item.builds.each { it.delete() }}
监控磁盘使用:重点关注
$JENKINS_HOME
目录插件更新策略:非必要不更新,测试环境验证后再上线
总结:
通过本文的实践,我们成功构建了Jenkins与Ansible协同工作的自动化部署体系。关键成果包括:
1.实现了基于SSH密钥认证的安全管控体系,确保Jenkins到目标主机的无缝连接
2.通过Ansible Ad-Hoc命令实现了LNMP组件的标准化安装与服务管理
3.建立了完整的流水线触发机制,实现构建、测试、部署的自动化流水线
4.通过Discuz项目实战验证了部署流程的可靠性和实用性
这种自动化方案不仅显著提升了部署效率,降低了人为错误风险,更为后续实现蓝绿部署、灰度发布等高级运维场景奠定了坚实基础。建议在生产环境中结合配置管理规范和性能优化策略,进一步完善监控告警和回滚机制,构建真正高效可靠的企业级DevOps流水线。