ansible playbook 企业实战多个案例分享

如果你对ansible不熟,还请移步看我之前写的基础内容:

本文主要对 ansible playbook 做线上案例分享,基础内容不再赘述

Tips:

以下多个案例按用途写成单独的小模块,可以单一执行,也可以加在入口文件中,按顺序执行,比较灵活

企业案例1:ansible 安装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、编写 ansible 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:ansible 配置/etc/hosts

1、跟上面同样先创建目录

cd /etc/ansible/roles mkdir {hosts}/{templates,tasks} -pv [root@master01 roles]# tree  hosts hosts ├── tasks     #任务文件main.yml ├── templates   #模版文件存放在该目录下

2、编写ansible 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:ansible 安装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:

ansible playbook执行过程

当我再次执行playbook,先判断/ane/tomcat目录存在,存在即不执行

ansible playbook执行过程

查看脚本中的变量是否替换成功

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(以点来分级)

查看ip
查看ip

将template模版文件分发到各主机时,会自动将模版中的变量替换成常量(即当前主机的ip)

企业案例4:ansible 批量添加用户

方法一: 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 playbook中文文档: