主页 » DevOps » ansible playbook 企业实战多个案例分享

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

正文

如果你对ansible不熟,还请移步看我之前写的基础内容:自动化工具 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中文文档:https://ansible-tran.readthedocs.io/en/latest/docs/playbooks_intro.html

分享:
Telegram
Twitter
Facebook

发表评论

了解 zhpengfei.com 的更多信息

立即订阅以继续阅读并访问完整档案。

Continue reading

了解 zhpengfei.com 的更多信息

立即订阅以继续阅读并访问完整档案。

Continue reading

解锁流媒体/ChatGPT

智能分流/仅代理海外网站

IEPL优质线路|全天4K秒开