基于ansible-playbook 编写的消息推送系统自动化部署。
目录结构
├── ansible.cfg
├── getui_hosts
├── roles
│ ├── init_role
│ │ ├── files
│ │ │ ├── init.bank
│ │ │ └── init.sh
│ │ └── tasks
│ │ └── init.yml
│ ├── middle_role
│ │ ├── flume
│ │ │ └── 1.0.16
│ │ │ ├── rp.properties
│ │ │ └── run.sh
│ │ ├── kafka
│ │ │ └── 2.11-1.0.1
│ │ │ └── topic.j2
│ │ ├── redis
│ │ │ └── 2.8.20
│ │ ├── tasks
│ │ │ ├── create_topic.yml
│ │ │ ├── flume.yml
│ │ │ ├── kafka.yml
│ │ │ ├── redis.yml
│ │ │ └── zookeeper.yml
│ │ └── zookeeper
│ │ └── 3.5.8
│ ├── module_role
│ │ ├── iop
│ │ │ ├── applink
│ │ │ │ └── 1.0.3.0
│ │ ├── mc
│ │ │ │ ├── application.properties
│ │ │ │ ├── application-static.properties
│ │ │ │ └── run.sh
│ │ │ ├── fe
│ │ │ │ ├── 2.0.4
│ │ │ │ └── 2.0.8
│ │ │ ├── ms
│ │ │ │ ├── 2.0.7.0
│ │ │ │ │ ├── application.properties
│ │ │ │ │ └── run.sh
│ │ │ │ └── 2.0.8.0
│ │ ├── push
│ │ │ ├── cm
│ │ │ │ └── 5.1.1.0
│ │ │ │ ├── rp.properties
│ │ │ │ └── run.sh
│ │ │ ├── cm-1
│ │ │ │ └── 5.1.1.0
│ │ │ │ ├── rp.properties
│ │ │ │ └── run.sh
│ │ │ ├── dos
│ │ │ │ ├── 4.0.3.0
│ │ │ │ │ ├── config.properties
│ │ └── tasks
│ │ ├── iop-yml
│ │ │ ├── iop-applink.yml
│ │ ├── mc-yml
│ │ │ ├── mc-appAda.yml
│ │ │ ├── mc-bd.yml
│ │ └── push-yml
│ │ ├── push-amp.yml
│ │ ├── push-apnproxy.yml
│ └── vars
│ ├── init_vars.yml
│ ├── iop_ap.yml
│ ├── iop_run.yml
│ ├── mc_ap.yml
├── script
│ ├── deployFile
│ ├── deploy-init.py
说明:中间省略了大量重复性的模块
模块使用
- file、unarchive、shell、register、template、command、debug、when。
主要变量文件
变量文件:init_vars.yml iop_ap.yml iop_run.yml mc_ap.yml mc_run.yml push_rp.yml push_run.yml pv_vars.yml
说明:定义了不同模块间的所有可变量、以及安装路径调用中间件的地址等
模块的yml文件
---
- hosts: xx
remote_user: xx
vars_files:
- /etc/ansible/roles/vars/push_run.yml
- /etc/ansible/roles/vars/push_rp.yml
- /etc/ansible/roles/vars/pv_vars.yml
tasks:
- name: 创建文件安装文件夹
file: path={{push_route}}cm state=directory owner=getui group=getui
- name: 解压cm安装包
unarchive: src={{pk_push_route}}{{cm_PN}}.tar.gz dest={{push_route}}cm/ mode=0755 copy=yes
- name: 创建软连接
file: src={{push_route}}cm/{{cm_PN}} dest={{push_route}}cm/current state=link
- name: 获取本机ip地址变量
shell: echo {{ansible_ssh_host}} | awk -F '.' '{print $3"-"$4}'
register: ip_name
- name: 替换run文件
template: src=/etc/ansible/roles/module_role/push/cm/{{cm_VN}}/run.sh dest={{push_route}}cm/current/
- name: 替换rp文件
template: src=/etc/ansible/roles/module_role/push/cm/{{cm_VN}}/rp.properties dest={{push_route}}cm/current/config/
- name: 执行安装run.sh脚本
command: chdir={{push_route}}cm/current/ sh run.sh
# wait_for: sleep 2
- name: 检查
shell: ps -ef | grep {{cm_PN}}
register: process
- name: 检查进程是否存在若不存在 输出为-1
debug: var=process.stdout.find('cm.Main')
说明:不同模块之间可能有少差异,大同的实现是这样的。
中间件的yml文件
kafka
---
- hosts: kafka
remote_user: getui
vars_files:
- /etc/ansible/roles/vars/middle_vars.yml
- /etc/ansible/roles/vars/pv_vars.yml
tasks:
- name: 创建文件安装文件夹
file: path={{middle_route}}kafka state=directory owner=getui group=getui
- name: 解压kafka安装包
unarchive: src={{pk_middle_route}}{{kafka_PN}}.tar.gz dest={{middle_route}}kafka/ mode=0755 copy=yes
- name: 替换server.properties文件
template: src=/etc/ansible/roles/middle_role/kafka/2.11-1.0.1/server.properties dest={{middle_route}}kafka/kafka_2.11-1.0.1/config/
- name: 替换kafka-server-start.sh文件
template: src=/etc/ansible/roles/middle_role/kafka/2.11-1.0.1/kafka-server-start.sh dest={{middle_route}}/kafka/kafka_2.11-1.0.1/bin/
- name: 执行安装启动kafka脚本
command: chdir={{middle_route}}/kafka/kafka_2.11-1.0.1 ./bin/kafka-server-start.sh -daemon config/server.properties
zookeeper
---
- hosts: ZK
remote_user: getui
vars_files:
- /etc/ansible/roles/vars/middle_vars.yml
- /etc/ansible/roles/vars/pv_vars.yml
tasks:
- name: 创建文件安装文件夹
file: path={{middle_route}}zookeeper state=directory owner=getui group=getui
- name: 解压redis安装包
unarchive: src={{pk_middle_route}}{{zookeeper_PN}}.tar.gz dest={{middle_route}}zookeeper/ mode=0755 copy=yes
- name: 创建data\dataLog
file: path={{middle_route}}zookeeper/data state=directory owner=getui group=getui
file: path={{middle_route}}zookeeper/dataLog state=directory owner=getui group=getui
- name: 生成server_id在hosts zk 分组指定server_id
command: echo {{server_id}} > {{middle_route}}zookeeper/data/myid
- name: 替换zoo.cfg文件
template: src=/etc/ansible/roles/middle_role/zookeeper/3.5.8/zoo.cfg dest={{middle_route}}zookeeper/zookeeper-3.5.8/conf/
- name: 执行安装启动zk脚本
command: chdir={{middle_route}}zookeeper/zookeeper-3.5.8 ./bin/zkServer.sh start
- name: 检查
command: chdir={{middle_route}}zookeeper/zookeeper-3.5.8 ./bin/zkServer.sh status
create_topic.yml
---
- hosts: kafka
remote_user: getui
vars_files:
- /etc/ansible/roles/vars/middle_vars.yml
- /etc/ansible/roles/vars/pv_vars.yml
tasks:
- name: 判断kafka进程是否存活
shell: jps | grep kafka |wc -l
register: process
- debug: var=process.stdout
- name: 替换topic.j2文件
template: src=/etc/ansible/roles/middle_role/kafka/2.11-1.0.1/topic.j2 dest=/tmp/topic.sh
- name: 执行安装启动topic.sh脚本
shell: sh /tmp/topic.sh
when:
- {{process.stdout}} != "0"
- {{broker_id}} == "1"
需要注意的地方
创建topic的时候循环读hosts列表,凡是在hosts列表存在的ip地址都可以直接运用变量。
template:所以变量的替换都用他
这三个用法懂了。就可以看懂这篇文章了