自动化运维专题(三):Ansible的roles标准化与Jenkins持续集成
Mr.chen运维执教笔记(QQ:215379068)
--私人课件,不公开,不出版,禁止传播
想做好运维工作,人先要学会勤快;
居安而思危,勤记而补拙,方可不断提高;
别人资料不论你用着再如何爽那也是别人的;
自己总结东西是你自身特有的一种思想与理念的展现;
精髓不是看出来的,精髓是记出来的;
请同学们在学习的过程中养成好的学习习惯;
勤于实践,抛弃教案,勤于动手,整理文档。
十二,使用roles标准化Playbook
roles功能可以用来规范playbook的编写
12.1 创建所需要的roles原型目录结构
#创建roles基本原型的目录结构[root@ansible myroles]# tree /myroles//myroles/├── nginx.yaml #入口触发配置文件└── roles #playbook的原型配置目录└── nginx #nginx相关模组配置目录├── files #copy模块和script模块的参数src默认会从这个文件夹查找├── handlers #用来存放notify的├── tasks #用来存放ansible模块任务的├── templates #用来存放j2的└── vars #用来存放变量的7 directories, 1 file#入口触发配置文件[root@ansible myroles]# cat /myroles/nginx.yaml---- hosts: all #执行的主机范围gather_facts: True #开启系统内置变量roles: #启用roles原型配置- nginx #执行nginx原型模组
12.2 roles中tasks任务编排模组的使用
#在nginx模组添加tasks任务配置文件[root@ansible myroles]# cat roles/nginx/tasks/main.yaml---- name: check alived #任务1的名字ping: #执行ping模块- name: #任务2的名字shell: ls / #执行shell模块register: ls_result #将执行结果保存给变量- debug: var=ls_result #变量的值赋值给debug进行输出#完成后的目录结构如下所示[root@ansible myroles]# tree /myroles//myroles/├── nginx.yaml #nginx模组入口配置文件└── roles└── nginx #nginx原型模组目录├── files├── handlers├── tasks│ └── main.yaml #nginx模组的tasks任务配置文件├── templates└── vars7 directories, 2 files
12.3 执行简单的roles任务模型
#执行nginx入口配置文件[root@ansible myroles]# ansible-playbook nginx.yamlPLAY [all] ****************************************************************************************************TASK [Gathering Facts] ****************************************************************************************ok: [webA]ok: [webB]TASK [nginx : check alived] ***********************************************************************************ok: [webA]ok: [webB]TASK [nginx : shell] ******************************************************************************************changed: [webA]changed: [webB]TASK [nginx : debug] ******************************************************************************************ok: [webA] => {"ls_result": {"changed": true,"cmd": "ls /","delta": "0:00:00.002805","end": "2018-06-21 11:52:29.343592","failed": false,"rc": 0,"start": "2018-06-21 11:52:29.340787","stderr": "","stderr_lines": [],"stdout": "bin\nboot\ndev\netc\nhome\nlib\nlib64\nmedia\nmnt\nopt\nproc\nroo\nroot\nrun\nsbin\nservice\nsrv\nsys\ntmp\nusr\nvar","stdout_lines": ["bin","boot","dev","etc","home","lib","lib64","media","mnt","opt","proc","roo","root","run","sbin","service","srv","sys","tmp","usr","var"]}}ok: [webB] => {"ls_result": {"changed": true,"cmd": "ls /","delta": "0:00:00.002708","end": "2018-06-21 11:52:29.359754","failed": false,"rc": 0,"start": "2018-06-21 11:52:29.357046","stderr": "","stderr_lines": [],"stdout": "bin\nboot\ndev\netc\nhome\nlib\nlib64\nmedia\nmnt\nopt\nproc\nroo\nroot\nrun\nsbin\nservice\nsrv\nsys\ntmp\nusr\nvar","stdout_lines": ["bin","boot","dev","etc","home","lib","lib64","media","mnt","opt","proc","roo","root","run","sbin","service","srv","sys","tmp","usr","var"]}}PLAY RECAP ****************************************************************************************************webA : ok=4 changed=1 unreachable=0 failed=0webB : ok=4 changed=1 unreachable=0 failed=0
- ansible-playbook执行入口配置文件nginx.yaml后,它会自动在roles目录下查找nginx目录并进入后查找tasks任务目录并执行main.yaml的任务配置文件。
- 其实,这个roles的操作等效于以下配置
#本配置和之前的roles配置等效[root@ansible myroles]# cat /service/scripts/test.yaml---- hosts: allgather_facts: Truetasks: #其实roles的本质就是将tasks任务单独写了。- name: check alived #并在入口文件里追加了roles去查找tasks配置文件路径ping:- name:shell: ls /register: ls_result- debug: var=ls_result
12.4 roles中vars自定义变量模组的使用
#创建自定义变量vars模组的配置文件[root@ansible myroles]# cat roles/nginx/vars/main.yaml---my_name: yunjisuanphone: 1800000000[root@ansible myroles]# cat roles/nginx/tasks/main.yaml---- name: check alivedping:- name:shell: ls /register: ls_result- debug: var=ls_result- name: #添加对变量引用的任务编排shell: echo my phone is {{ phone }}register: echo_result- debug: var=echo_result[root@ansible myroles]# ansible-playbook nginx.yaml #执行入口配置文件
12.5 使用copy,script模块的标准化
roles模型里使用copy,script模块,默认从roles/nginx/files这里面找
[root@ansible myroles]# cat roles/nginx/files/testwelcome to yunjisuan[root@ansible myroles]# cat roles/nginx/files/test.shecho "aaa" >> /tmp/test[root@ansible myroles]# chmod +x roles/nginx/files/test.sh[root@ansible myroles]# cat roles/nginx/tasks/main.yaml---- name: check alivedping:- name:shell: ls /register: ls_result- debug: var=ls_result- name:shell: echo my phone is {{ phone }}register: echo_result- debug: var=echo_result- name: #添加copy模块copy: src=test dest=/root/- name: #添加script模块(自动在目标IP机器上执行脚本)script: test.sh[root@ansible myroles]# ansible-playbook nginx.yaml
12.6 roles中template模块的使用
roles模型里使用template模块,默认从roles/nginx/template里面找
[root@ansible myroles]# cat roles/nginx/templates/test.j2myname is {{ my_name }},my phone is {{ phone }} #引用自定义变量my ipaddress is {{ansible_all_ipv4_addresses[0]}} #引用内置变量[root@ansible myroles]# cat roles/nginx/tasks/main.yaml---- name: check alivedping:- name:shell: ls /register: ls_result- debug: var=ls_result- name:shell: echo my phone is {{ phone }}register: echo_result- debug: var=echo_result- name:copy: src=test dest=/root/- name:script: test.sh- name:template: src=test.j2 dest=/root/test2 #下发可变配置文件[root@ansible myroles]# ansible-playbook nginx.yaml
12.7 roles中notify模块的使用
roles使用notify模块,默认从roles/nginx/handles里面找
[root@ansible myroles]# cat roles/nginx/handlers/main.yaml---- name: start_nginx #定义handlers的动作类型shell: /usr/local/nginx/sbin/nginx- name: stop_nginx #定义handlers的动作类型shell: /usr/local/nginx/sbin/nginx -s stop- name: reload_nginx #定义handlers的动作类型shell: /usr/local/nginx/sbin/nginx -s reload[root@ansible myroles]# cat roles/nginx/tasks/main.yaml---- name: check alivedping:- name:shell: ls /register: ls_result- debug: var=ls_result- name:shell: echo my phone is {{ phone }}register: echo_result- debug: var=echo_result- name:copy: src=test dest=/root/- name:script: test.sh- name:template: src=test.j2 dest=/root/test2notify: start_nginx #执行template任务后下发通知给handlers执行start_nginx[root@ansible myroles]# ansible-playbook nginx.yaml
特别提示:
notify下发通知只有当之前的任务造成了变化那么才会被执行,如果没有发生任何改变,则notify不会被执行。例如:
#tasks任务造成改变,触发notify[root@ansible myroles]# cat /tmp/test.yaml---- hosts: webAgather_facts: Truetasks:- name:copy: src=/tmp/test dest=/root/ #这步造成目标改变才能出发notifynotify: start_nginxhandlers:- name: start_nginxshell: /usr/local/nginx/sbin/nginx[root@ansible myroles]# ansible-playbook /tmp/test.yamlPLAY [webA] ***************************************************************************************************TASK [Gathering Facts] ****************************************************************************************ok: [webA]TASK [copy] ***************************************************************************************************changed: [webA] #发生了改变RUNNING HANDLER [start_nginx] #触发notify *********************************************************************************changed: [webA]PLAY RECAP ****************************************************************************************************webA : ok=3 changed=2 unreachable=0 failed=0#我们再次执行/tmp/test.yaml[root@ansible myroles]# ansible-playbook /tmp/test.yamlPLAY [webA] ***************************************************************************************************TASK [Gathering Facts] ****************************************************************************************ok: [webA]TASK [copy] ***************************************************************************************************ok: [webA] #没有造成任务改变,未触发notify通知PLAY RECAP ****************************************************************************************************webA : ok=2 changed=0 unreachable=0 failed=0
十三,Jenkins环境搭建
由于Jenkins是依赖于java的,所以先介绍java环境的搭建
(1)使用官方的二进制包解压安装,官方二进制包的下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
(2)安装java(解压,移动即可)
[root@localhost ~]# tar xf jdk-8u171-linux-x64.tar.gz -C /usr/local/[root@localhost ~]# cd /usr/local/[root@localhost local]# mv jdk1.8.0_171 jdk#全路径验证java是否安装成功[root@localhost local]# /usr/local/jdk/bin/java -versionjava version "1.8.0_171"Java(TM) SE Runtime Environment (build 1.8.0_171-b11)Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
(3)配置java环境变量/etc/profile
[root@localhost local]# sed -i.org '$a export JAVA_HOME=/usr/local/jdk/' /etc/profile[root@localhost local]# sed -i.org '$a export PATH=$PATH:$JAVA_HOME/bin' /etc/profile[root@localhost local]# sed -i.org '$a export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar' /etc/profile[root@localhost local]# tail -3 /etc/profileexport JAVA_HOME=/usr/local/jdk/export PATH=$PATH:$JAVA_HOME/binexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/lib/tools.jar[root@localhost local]# source /etc/profile[root@localhost local]# java -versionjava version "1.8.0_171"Java(TM) SE Runtime Environment (build 1.8.0_171-b11)Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
(4)Jenkins的下载和运行
#下载jinkins[root@localhost ~]# wget http://ftp-chi.osuosl.org/pub/jenkins/war-stable/2.107.2/jenkins.war#启动jenkins并后台运行[root@localhost ~]# nohup java -jar jenkins.war &> /tmp/jenkins.out &[root@localhost ~]# netstat -antup | grep java | grep -v greptcp6 0 0 :::8080 :::* LISTEN 15662/javaudp6 0 0 :::5353 :::* 15662/javaudp6 0 0 :::33848 :::* 15662/java
然后我们在浏览器上进行访问:http://IP:8080 出现如下界面

十四,Jenkins介绍和初始化配置
-
Jenkins的作用?
- 可视化管理服务器
- 持续构建,可以直接去svn或者git上拉取代码并下发到服务器上
- 可视化ansible
-
Jenkins监听端口8080
- nohup java -jar jenkins.war &> /tmp/jenkins.out & #启动Jenkins方式
- netstat -antup | grep java #查看监听端口
- http://IP:8080 #访问方式
-
Jenkins默认密码路径,需要到Jenkins所在的服务器进行查看
/root/.jenkins/secrets/initialAdminPassword
Jenkins初始化配置:
将服务器上的密码复制过来到浏览器上提交后,静心等待,出现如下界面

(1)安装必要的插件



(2)新添加一个用户yunjisuan

(3)查看Jenkins的权限(登录用户可以做任何事情)
系统管理--->全局安全配置

十五,Jenkins实现命令结果的可视化
(1)添加ssh方式的被管理服务器
系统管理--->系统设置--->找到Publish over SSH可以添加对应的操作服务器






这就添加好一台被管理的主机了。要继续添加被管理的主机只需要重复之前的过程

(2)创建新任务*




(3)立刻构建任务并执行






十六,Jenkins+svn实现持续化集成
需求,开发改完代码上传到svn上,然后运维打包最新版本代码部署到业务服务器上。
svn的部署与应用请参考专题(一)
16.1 设置svn的连接密码,并进行代码的部署测试









设置完毕后,应用保存。
在windows上对svn的yunjisuan项目进行版本提交后
选择立刻构建项目

[root@webB tmp]# hostname -I192.168.200.138[root@webB tmp]# ls /tmp/test/mycode[root@webB tmp]# ls /tmp/test/mycode/python.py 云计算最终架构示例模板(一).png 云计算最终架构示例模板(二).png 云计算期中架构模版(一).png
16.2 模拟真实环境web服务器的代码部署和备份
[root@localhost tmp]# mkdir -p /www/{html,backup}[root@localhost tmp]# tree /www//www/├── backup #html网页目录的备份放置目录└── html #网页目录
在jenkins上设置webA,webB两台服务器作为项目的构建目标


将以下shell脚本代码复制到构建目标的Exec command里
#备份web服务器旧网页目录代码,并将部署到服务器上的新代码覆盖到网页目录里cd /www/usr/bin/tar zcf html_$(date +%F-%H-%S).tar.gz htmlrm -rf html/*mv html_*.tar.gz backup/mv /tmp/test/* /www/html/

选择立刻构建进行测试
#检查webA和webB,代码构建情况[root@webA tmp]# tree /www//www/├── backup│ └── html_2018-06-25-12-58.tar.gz #旧网页目录备份└── html└── mycode├── python.py├── \344\272\221\350\256\241\347\256\227\346\234\200\347\273\210\346\236\266\346\236\204\347\244\272\344\276\213\346\250\241\346\235\277\357\274\210\344\270\200\357\274\211.png├── \344\272\221\350\256\241\347\256\227\346\234\200\347\273\210\346\236\266\346\236\204\347\244\272\344\276\213\346\250\241\346\235\277\357\274\210\344\272\214\357\274\211.png└── \344\272\221\350\256\241\347\256\227\346\234\237\344\270\255\346\236\266\346\236\204\346\250\241\347\211\210\357\274\210\344\270\200\357\274\211.png3 directories, 5 files[root@webB tmp]# tree /www//www/├── backup│ └── html_2018-06-25-12-58.tar.gz #旧网页目录备份└── html└── mycode├── python.py├── \344\272\221\350\256\241\347\256\227\346\234\200\347\273\210\346\236\266\346\236\204\347\244\272\344\276\213\346\250\241\346\235\277\357\274\210\344\270\200\357\274\211.png├── \344\272\221\350\256\241\347\256\227\346\234\200\347\273\210\346\236\266\346\236\204\347\244\272\344\276\213\346\250\241\346\235\277\357\274\210\344\272\214\357\274\211.png└── \344\272\221\350\256\241\347\256\227\346\234\237\344\270\255\346\236\266\346\236\204\346\250\241\347\211\210\357\274\210\344\270\200\357\274\211.png3 directories, 5 files
16.3 模拟真实环境,开发进行代码回滚

(1)右键点击共享目录选择TortoiseSVN--->Show log

右键点击想要回滚的版本选择Revert to this revision


此时你发现你的共享目录里的东西已经被回滚到了指定的版本。
最后我们千万别忘记了右键点击共享目录,将结果进行提交(SVN commit)

(2)重新进行jenkins项目构建,并检查部署情况
[root@webA tmp]# tree /www//www/├── backup│ ├── html_2018-06-25-12-58.tar.gz│ └── html_2018-06-25-13-15.tar.gz└── html└── mycode├── python.py└── \346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt3 directories, 4 files[root@webB tmp]# tree /www//www/├── backup│ ├── html_2018-06-25-12-58.tar.gz│ └── html_2018-06-25-13-15.tar.gz└── html└── mycode├── python.py└── \346\226\260\345\273\272\346\226\207\346\234\254\346\226\207\346\241\243.txt3 directories, 4 files

至此,测试成功!
十七,Jenkins实现ansible可视化
(1)安装jenkins ansible插件,启动ansible插件




最后进入安装界面最下方勾选,安装完成时重启Jenkins

(2)系统管理--->全局工具配置---->配置ansible





(3)新建一个项目任务,使用ansible进行构建,跑个shell和copy模块
新建一个叫做ansible_test的新项目任务,过程略

进入项目的配置里。构建一个基于ansible的任务


然后点击立刻构建功能,并查看输出结果

(4)新建一个项目任务,使用ansible-playbook进行构建
#准备一个playbook的配置文件[root@ansible scripts]# cat /service/scripts/test.yaml---- hosts: alltasks:- name: test jenkins ansible-playbookshell: echo "welcome to yunjisuan" >> /tmp/yunjisuan.txt
然后新建一个新的项目任务,进行配置





最后查看构建的可视化输出结果

浙公网安备 33010602011771号