如果你对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:
当我再次执行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: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中文文档: