jenkins端 | 172.25.10.5 |
---|---|
vm1 | 172.25.10.11 |
1. 使用SSH方式远程对节点jenkins进行操作
我的server5是jenkins的master工作节点,我想将任务部署到其他服务端上,该怎么办?可以使用SSH
新建一台虚拟机vm1,添加hosts解析,安装docker-ce,在jenkins端上将证书,daemon文件,内核参数文件套接字权限等给vm1,具体操作和之前的一样
在jenkins端上添加SSH插件
安装成功后进行系统设置
ssh端口默认为22
添加ssh主机信息
添加vm1的ssh认证,保存
回到docker项目,增加构建步骤,修改构建信息,使用远程的shell脚本
控制台输出成功
在vm1上查看,myapp镜像运行成功
2. 添加jenkins的agent节点
在实际的工作中我们不可能用jenkins的master节点进行工作,master只负责调度,我们将vm1作为jenkins端的工作节点,让它进行实际的工作,在vm1中安装jdk和jit
在jenkins端上安装ssh build agent插件
在系统管理的节点管理内添加节点
具体填写如下:
将master节点数量设置为0,它只负责调度
构建一次SSH,已经在agent-1节点上构建成功了,如图所示
现在配置docker项目,把远程ssh shell关闭,用shell即可,就可以在vm1上构建,手动构建
\
控制台输出OK,在agent上
3. 用户的管理
之前的构建过程我们一直使用的是root用户,实际中应该使用普通用户,对其权限进行一定限制
在jenkins端管理用户
新建用户
默认情况下,mj可以使用所有权限,显然不可以(右上角我使用的是这个用户登录)
返回超级用户,添加基于角色控制的插件
将用户可以做任何事改称角色控制
返回系统管理就会出先角色控制选项
管理角色
添加用户users,只给一个读的权限,添加项目角色demo,可以看凭据,可以读写运行任务,对demo开头的项目都生效
分配角色
将mj用户和全局角色绑定,和项目角色demo绑定
登录mj用户查看效果,只能看到demo项目,无法看到docker项目
重新上admin用户,新建一个demo项目
创建完成后,重新登陆mj用户可以看到demo1项目
也可以管理demo开头的项目,删除demo01
4. jenkins结合ansible部署apache
(1) 清理环境
jenkins端回到admin用户,恢复master节点,先断开agent,删除agent节点
恢复master节点为2
禁用docker项目
(2) 开始部署
再新建一个vm2
server5 | jenkins ansible主机 2G内存 |
---|---|
server6 | gitlab私有仓库 4G内存 |
vm1 vm2 | 部署ansible的节点 1G内存 |
server1 | harbor仓库,暂时关闭,需要的时候启用 |
新建项目ansible
在jenkins端上编写yum源,安装ansible
gitlab上新建项目 playbook
克隆gitlab的项目playbook,产生了playbook目录
[root@server6 playbook]# ls
ansible.cfg inventory playbook.yaml README.md
[root@server6 playbook]# cat playbook.yaml
---
- hosts: all 所有主机下面执行命令
tasks:
- name: install apache 安装apache
yum:
name: httpd
state: present
- name: configure apche 配置apache
template:
src: httpd.conf.j2 使用jinjia模板
dest: /etc/httpd/conf/httpd.conf 部署位置
notify: restart apache 若配置文件有变化,通知handlers
- name: start apache 开启apache
service:
name: httpd
enabled: yes 开机自启
state: started
handlers: 接受到通知,重启apache
- name: restart apache
service:
name: httpd
state: restarted
[root@server6 playbook]# cat ansible.cfg 该ansible的配置文件会覆盖原本的路径下的配置文件
[defaults]
command_warnings=False
remote_user=devops
[privilege_escalation]
become=True
become_method=sudo 支持sudo
become_user=root 默认用户root
become_ask_pass=False 使用sudo不需要密码
[root@server6 playbook]# cd inventory/
[root@server6 inventory]# cat test
vm1 http_port=8080 测试
[root@server6 inventory]# cat prod
vm2 http_port=80 部署生产环境
[root@server6 inventory]#
从其他端上复制httpd.conf文件到gitlab端
编辑http配置文件的端口为变量,对于vm1是8080,对于vm2是80
playbook目录的框架如下
上传到gitlab
在gitlab端查看
在jenkins端修改ansible项目配置,指定gitlab的URL,使用ssh证书,指定分支为main
执行一个简单的shell
查看控制台输出正常
因为jenkens流水线执行时使用的是jenkins用户,ansible执行时使用的是devops用户,所以vm1的jenkens用户要和vm2的devops用户建立ssh连接免密登陆, server5的jenkens用户也要和vm2的devops用户建立ssh连接免密登陆。
vm1上创建用户,添加密码
vm2上创建用户,添加密码
server5的jenkins用户没有交互界面,所以先修改为bash,进入jenkens用户,生成ssh密钥
在server5上用jenkins用户将密钥给vm1和vm2的devops用户都发送
测试:server5的jenkins用户可以免密登录vm1 vm2 的devops用户
在vm1和vm2上使用 visudo命令修改devops用户权限
回到jenkins页面ansible项目的配置,选择设定参数化构建,选项参数,即使用变量
要设置两个可利用变量,($WORKSPACE)去当前项目的工作目录里面,根据playbook.yaml文件ansible自动部署在inventory目录下的test或prod
选择在test上部署,测试代码是否有问题
查看控制台输出,没有问题
在vm1(test的虚拟机)上测试一下,8080端口没问题
现在部署prod
控制台输出OK
在vm2上看80端口没问题
5. jenkins也可以和k8s结合使用
结构如图: