持续集成与持续交付之jenkins(下)
1、SSH的方式对远程节点jenkins操作
server2是jenkins的matser节点工作,不想把任务部署在server2上,如何部署到server3上呢?可以使用ssh的方式
新创建一台虚拟机server3安装docker-ce,开启docker,给它证书,内核参数文件,damen.json文件,添加解析,套接字给权限等一些列操作,和前面一样
jenkins添加ssh插件
成功安装
jenkins,系统设置
添加远程主机server3,端口为22,使用前面创建的ssh证书,保存
回到docker项目,修改配置,不用之前的shell,使用远程的shell,命令还是运行容器,保存,构建
查看控制台输出,成功
在server3上测试,curl localhost
,可以看到myapp镜像运行成功
2、添加jenkins的agent节点
实际中我们不可能直接用jenkins的matser节点工作,master只负责调度,本文中server3作为jenkins的agent节点,agent节点来真正工作
server3安装jdk和git
jenkins安装ssh agent插件
系统管理,节点管理
新建节点
添加agent节点的信息,启动方式为ssh,添加证书,不校验,保存
并把master节点的数量变为0,master只负责调度
成功创建agent
现在配置docker项目,把ssh shell关闭,用shell即可,就可以在server3上构建,手动构建
查看控制台成功构建
也可以在server3上测试
3、用户管理
之前一直使用的root账户,具有所有权限,实际中应该使用普通用户,并且权限进行一定的限制
jenkins管理用户
新建一个普通用户lyb
默认情况下lyb用户具有所有权限,都可以管理,这显然不合适
返回超级用户,添加基于角色控制的插件
全局安全配置
从原来的登陆用户可以做任何事改为基于角色的控制
然后就会出现基于角色控制的模块
管理角色
添加全局角色,users,权限只有读;添加项目角色demo,可以看凭据,可以读写运行任务,对demo开头的项目都生效
分配角色
把lyb用户和全局角色users绑定,把lyb用户和项目角色demo绑定
现在登陆lyb用户,无法修改配置了,且看不到docker项目了,只能看到demo项目
切回root用户,创建一个demo01项目
成功创建
现在切到lyb用户,demo开头的项目都可以管理,可以删除demo01项目
4、jenkins结合ansible部署apache
(1)纯净环境
回到root用户
恢复master节点工作,去掉agent节点,首先断开连接
删除agent节点
恢复master工作节点数量为2
为了净化环境,禁用了docker项目
已成功禁用
(2)部署
首先计划每个虚拟机的角色
server1是gitlab私有仓库,4G内存
server2是jenkes,ansible主机,1G内存
server3和sever4是真正部署ansible的节点,各1G
server9是harbor仓库,暂时不用,关闭了
新建项目ansible
server2配置yum源
server2安装ansible
gitlab中新建项目playbook
server1克隆gitlab的项目playbook,产生了playbook目录
编写playbook需要的文件,首先看框架如下
[root@server1 playbook]# cat ansible.cfg %该ansible的配置文件会覆盖原本的路径下的配置文件
[defaults]
command_warnings=False
remote_user=devops
[privilege_escalation]
become=True
become_method=sudo
become_user=root
become_ask_pass=False
[root@server1 playbook]# cat playbook.yaml
---
- hosts: all %所有主机执行下面命令
tasks:
- name: install apache %安装apache
yum:
name: httpd
state: present
- name: configure apache %配置apache
template: %使用jinjia模板
src: httpd.conf.j2
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@server1 playbook]# cd inventory/
[root@server1 inventory]# cat test %用来测试
server3 http_port=8080
[root@server1 inventory]# cat prod %用来部署生产环境
server4 http_port=80
设定htpp的配置文件的端口号是变量,对于server3来说就是8080,对于server4来说就是80
添加提交上传到gitlab
可以看到
回到jenkins,修改项目ansible的配置,指定gitlab的URL,使用ssh证书,指定分支为master
执行命令先简单写ls,创建
查看控制台输出正常
因为jenkens流水线执行时使用的是jenkens用户,ansible执行时使用的是devops用户,所以server2的jenkens用户要和server3的devops用户建立ssh连接免密登陆,server2的jenkens用户也要和server4的devops用户建立ssh连接免密登陆。下面一步一步实现
server3建立devops用户,设置密码
server4建立devops用户,设置密码
server2的jenkens用户没有交互界面,所以先修改为bash,进入jenkens用户,生成ssh密钥,
server2的jenkens用户把ssh密钥给server3的devops用户和server4的devops用户都发了一份
测试:server2的jenkens用户可以免密登陆server3的devops用户和server4的devops用户
给server3的devops用户授权
给server4的devops用户授权
回到jenkins页面ansible项目的配置,设定参数化构建,选项参数,即使用变量
deploy是变量,它有两个选项test和prod,
区工作目录,根据playbook.yaml文件ansible自动部署在inventory目录下的test或prod
首先选择在test上部署,测试代码是否有问题
控制台显示test上部署没问题
看到了httpd的8080端口
现在就可以放心的部署在prod上了
控制台显示prod上部署没问题
看到了httpd的80端口
5、jenkins结合k8s
jenkins也可以和k8s结合,结构如图,这里不再叙述