相关文章: Jenkins 结合 Ansible 实现生产环境自动发布与备份
如果你对ansible不熟,还请移步看我之前写的基础内容:
本文主要对 ansible playbook 做线上案例分享,基础内容不再赘述
Tips:
以下多个案例按用途写成单独的小模块,可以单一执行,也可以加在入口文件中,按顺序执行,比较灵活
企业案例1:安装java jdk
1、创建目录
cd /etc/ansible/roles
mkdir {java}/{files,vars,templates,tasks} -pv
[root@master01 roles]# tree java
java
├── files #java安装包路径
├── tasks #任务文件main.yml,使用file指令时自动去files目录下面找对于的包,templates指令也是一样的
├── templates #模版文件存放在该目录下
└── vars #变量文件main.yml
2、编写playbook
cat java/tasks/main.yml
- name: remove openjdk #移除系统自带的jdk
yum: name={{ item }} state=absent #这里用到了循环
with_items:
- java-1.7.0-openjdk-1.7.0.99-2.6.5.1.el6.x86_64
- java-1.6.0-openjdk-1.6.0.38-1.13.10.4.el6.x86_64
ignore_errors: True #忽略异常
- name: unzip jdk
unarchive: src={{ item }} dest={{ java_home }}/
with_items:
- server-jre-8u121-linux-x64.tar.gz #包在file目录下,自动去找
#- jdk-7u67-linux-x64.tar.gz #因为有些项目依赖的jdk低,不想再写一个playbook,这里根据需要注视掉其中一个
- name: link jdk java #创建软链接
file: src={{ java_home }}/{{ item.name }} dest={{ java_home }}/{{ item.linkname }} state=link
with_items:
- { name: jdk1.8.0_121,linkname: jdk8 }
#- { name: jdk1.7.0_80,linkname: jdk7 }
- name: copy java.sh
template: src=java.sh.j2 dest=/etc/profile.d/java.sh #模版文件.j2结尾,自动去template目录下找文件
- name: source
shell: source /etc/profile
企业案例2:配置/etc/hosts
1、跟上面同样先创建目录
cd /etc/ansible/roles
mkdir {hosts}/{templates,tasks} -pv
[root@master01 roles]# tree hosts
hosts
├── tasks #任务文件main.yml
├── templates #模版文件存放在该目录下
2、编写playbook
cat hosts/tasks/main.yml
- name: copy /etc/hosts
template: src=hosts.j2 dest=/etc/hosts
#在templates目录下准备了一个模版文件,通过变量自动替换ip或主机名,若要替换成功,文件名必须.j2结尾
cat hosts/templates/hosts.j2
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
{{ ansible_eth0.ipv4.address }} {{ ansible_nodename }}
企业案例3:安装tomcat
cd /etc/ansible/roles
mkdir {tomcat}/{files,vars,templates,tasks} -pv
[root@node1 roles]# tree tomcat
tomcat
├── files #tomcat安装包路径
├── tasks #任务文件main.yml
├── templates #模版文件存放在该目录下
└── vars #变量文件main.yml
将tomcat下载到tomcat/files目录下,不从网上直接下载tomcat安装包,避免网络问题导致太慢或失败
编写task任务
cat tasks/main.yml
- name: #判断tomcat是否已经安装
stat: path={{ tomcat_path }}
register: reg
- name: unzip
#shell: tar zxvf {{ dest_path }}/apache-tomcat-8.5.23.tar.gz -C /ane
unarchive: src=apache-tomcat-8.5.23.tar.gz dest=/ane
when: not reg.stat.exists #当/ane/tomcat目录不存在时执行解压操作
- name: rename
command: chdir=/ane mv apache-tomcat-8.5.23 tomcat
when: not reg.stat.exists #当 /ane/tomcat不存在的时候执行rename操作
#ignore_errors: True
- name: conf
template:
src=server.xml.j2 dest={{ tomcat_path }}/conf/server.xml
- name: tocmat_startup.sh
template:
src=startup8.sh.j2 dest=/ane/startup.sh mode=655
- name: start_service
shell: sh /ane/startup.sh
vars变量(此处用到局部变量)
cat vars/main.yml
dest_path: /ane/soft
tomcat_path: /ane/tomcat
template模版文件
tree templates/
templates/
├── server.xml.j2
├── startup7.sh.j2
└── startup8.sh.j2
脚本中使用的变量获取ip方式(ansible_ens33.ipv4.addreee可以通过setup模块获取).
cat templates/startup8.sh.j2
#!/bin/bash
PROCESS=`ps -ef|grep -w java |grep -v grep|grep -v PPID|awk '{ print $2}'`
for p in $PROCESS
do
kill -9 $p
done
-Dcom.sun.management.jmxremote.port=9001
-Djava.rmi.server.hostname={{ ansible_ens33.ipv4.address }}
-XX:+HeapDumpOnOutOfMemoryError
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
编写入口执行文件
cat /etc/ansible/roles/tomcat.yml
- hosts: test #选择需要执行的主机组或IP
remote_user: root #远程执行用户
roles:
#- hosts
#- java #若没有配置java环境变量,请在tomcat之前加上java,按顺序执行
- tomcat #选择tomcat项目
执行ansible playbook:
当我再次执行playbook,先判断/ane/tomcat目录存在,存在即不执行
查看脚本中的变量是否替换成功
ansible all -m shell -a 'sed -n /hostname/p /ane/startup.sh'
[WARNING]: Consider using template or lineinfile module rather than running sed
172.16.77.137 | SUCCESS | rc=0 >>
-Djava.rmi.server.hostname=172.16.77.137
172.16.77.157 | SUCCESS | rc=0 >>
-Djava.rmi.server.hostname=172.16.77.157
根据返回结果,明显替换成功了
找到ipv4–>address,再查看ipv4的父级,即网卡名称(ens33是我网卡的名字);
固定格式:ansible_网卡名.ipv4.address(以点来分级)
将template模版文件分发到各主机时,会自动将模版中的变量替换成常量(即当前主机的ip)
企业案例4:批量添加用户
方法一:
cd /etc/ansible/roles
mkdir -p user/tasks
#写playbook
cat user/tasks/main.yml
- name: add user ane
user: name=ane shell=/bin/bash password={{ 'ane' |password_hash('sha512') }} update_password=always append=yes
方法二:
[root@lbzpf roles]# cat user/tasks/main.ymlbak
- name: add user
shell: useradd ane |echo "ane" | passwd --stdin ane
以上内容只是ansible playbook案例的冰山一角,后续将结合jenkins,kubernetes分享更多内容
使用 ansible 一键安装kubernetes+containerd+calico集群