实际中,我们不可能直接用jenkins的matser节点工作,master只负责调度。因此我们创建server4作为jenkins的agent节点,来进行工作。
server4安装jdk(jenkins是用Java开发的)和git(有的数据是用git拉取的)
jenkins安装ssh agent插件
进入系统管理,节点管理
选择新建节点,固定节点属性
添加agent节点的信息,启动方式为ssh,为SSH添加证书,选择不校验,尽量保持代理在线
为master节点配置从节点,并把master节点的数量变为0,master只负责调度
回到Dashboard,点击demo进行手动触发,查看控制台输出可以看到成功构建(提前确保仓库运行正常)
但是docker项目执行报错,这是因为已经调度到了server4上,不能再通过ssh的方式,已经在本机上了,会发生冲突;
因此,配置docker项目,把ssh shell关闭,用shell即可
再次触发docker ,查看控制台成功构建
server4查看正在运行的容器可以看到demo正常运行,测试访问正常
接下来对普通用户的权限进行一定的限制,点击系统管理,选择管理用户
选择新建用户,填写注册信息
使用刚才创建的用户进行登录
可以看到,默认情况下新建的用户具有所有权限,可以进行全部操作,这显然不合适
我们需要将其改为普通权限用户,使用管理员账户登录,安装基于角色的访问控制插件
在系统管理中选择全局安全配置
从原来的登陆用户可以做任何事改为基于角色的控制
然后就会出现基于角色控制的模块
管理角色
添加全局角色,users,权限只有读
添加项目角色demo,赋予其查看凭据,以及任务和运行的相关操作,对所有以demo开头(westos .*)的项目都生效
点击角色分配
为刚才创建的lr用户分配users全局角色和demo项目角色
现在再使用lr这个用户进行登录,无法修改配置了,且看不到docker项目了,只能看到demo项目
切回root用户,创建一个demo01项目
创建成功
现在切到lr用户,demo开头的项目都可以管理,也可以删除demo01项目
删除完成,只剩下demo项目
root用户登录,jenkins配置中将agent1节点断开连接
删除agent1节点
恢复master工作节点数量为2
为了净化环境,禁用了docker项目
真实主机再开启一个虚拟机server5,并在真实主机上为server5添加域名解析;
此时:
server2(172.25.36.6)为gitlab仓库;
server3(172.25.36.7)为jenkins,ansible主机;
server4/5(172.25.36.8/9)为ansible的受控节点。
新建项目ansible
server3配置yum源,编辑ansible.repo文件
安装ansible
在gitlab新建playbook代码仓库,设为私有,使用自述文件初始化仓库
使用ssh克隆
server2克隆gitlab的项目playbook,可以看到克隆成功
框架如下
进入到playbook目录,编辑playbook.yaml配置文件,
[root@server6 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
在playbook目录中创建inventory目录,inventory是ansible中的部署对象主机,即playbook.yaml中的hosts包含的对象。
在test文件中,写入server4节点和端口信息,用于测试。在prod文件中,写入server5节点和端口信息,用于部署。
在playbook目录下编辑ansible.cfg配置文件
[root@server6 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
server4安装httpd服务(为了获得httpd.conf文件)
将httpd.conf文件发送给server2
server2将httpd.conf文件改名为httpd.conf.j2
编辑httpd.conf.j2文件,使用变量方式定义httpd的端口
server2使用git命令添加并提交上传playbook至gitlab
可以中gitlab页面看到项目,复制项目的克隆链接
回到jenkins,配置ansible项目,指定gitlab的URL,使用ssh证书,指定分支为master;
(只需指定git仓库即可,无需gitlab主动触发,因为需要手动选择inventory构建参数)
执行命令先简单写ls,创建
在ansible的控制台输出日志中可以看到执行正常
因为jenkens流水线执行时使用的是jenkens用户身份,ansible执行时使用的是devops用户,所以server3的jenkens用户要和server4/5的devops用户建立ssh连接免密登陆,现在为节点之间创建ssh免密。
server3切换到/var/lib/jenkins/workspace目录下,查看ansible.cfg文件详细信息
进入jenkens用户,查看密码
为jenkins创建交互式bash,进入jenkins,设置远端用户为devops
server4/5建立devops用户,设置密码(注意:两个devops的用户id要一致)
server3生成ssh密钥
server3的jenkens用户把ssh密钥给server4/5的devops用户各发一份
接下来,测试ssh登录,可以看到server3的jenkens用户可以免密登陆server4/5的devops用户
分别对server4/5的devops用户授权
回到jenkins页面ansible项目的配置,设定参数化构建,选项参数,即使用变量(变量名称为deploy,代表:prod或test)
编写执行shell:先切换到工作目录,根据playbook.yaml文件的配置,ansible会自动部署在inventory目录下的test或prod
首先选择在test上部署
控制台显示test上部署成功
server4查看端口状态,此时8080端口处于开放状态
现在使用prod参数构建项目
查看控制台输出日志,显示部署成功
在server5上查看端口状态,可以看到80端口开放