前置工作:
1.在管理机中,已安装好ansible(操作系统是Centos7.5)
2.管理机和目标机已做ssh配置。本例子中,目标机有2台:localhost、john
/etc/ansible/hosts内容如何:
[john] ansible-john ansible_ssh_host=主机ip地址 ansible_ssh_user="root" ansible_ssh_pass="密码" ansible_ssh_port=22 [local] localhost ansible_connection=local
3.目标机器已经安装docker
本例,将通过ansible的role模块,基于docker部署一个最简单的springboot 容器。
以下所有操作,都是在管理机(ansible)中执行
1.ansible默认安装位置位于/etc/ansible,我将在此处创建roles和playbook两个文件夹
mkdir /etc/ansible/playbook mkdir /etc/ansible/roles
在/etc/ansible/ansible.cfg配置文件中,可以通过配置项roles_path指定roles的位置,默认位于/etc/ansible/roles
2.进入roles目录,初始化角色springdemo
cd /etc/ansible/roles ansible-galaxy init springdemo
初始化执行完成后,在springdemo目录会自动生成如下子目录和默认文件

roles: <--所有的角色必须放在roles目录下,这个目录可以自定义位置,默认的位置在/etc/ansible/roles
springdemo: <---具体的角色项目名称,比如nginx、tomcat、php
files: <--用来存放由copy模块或script模块调用的文件。
templates: <--用来存放jinjia2模板,template模块会自动在此目录中寻找jinjia2模板文件。
tasks: <--此目录应当包含一个main.yml文件,用于定义此角色的任务列表,此文件可以使用include包含其它的位于此目录的task文件。
main.yml
handlers: <--此目录应当包含一个main.yml文件,用于定义此角色中触发条件时执行的动作。
main.yml
vars: <--此目录应当包含一个main.yml文件,用于定义此角色用到的变量。
main.yml
defaults: <--此目录应当包含一个main.yml文件,用于为当前角色设定默认变量。
main.yml
meta: <--此目录应当包含一个main.yml文件,用于定义此角色的特殊设定及其依赖关系。
main.yml
3.将springdemo.jar包复制到/etc/ansible/roles/springdemo/files路径下

justspringdemo-1.0-SNAPSHOT.jar包:因jar包过大,无法上传。请自行换成自身的项目包
4.上传springdemo_dockerfile文件到/etc/ansible/roles/springdemo/templates目录,用于build docker镜像
springdemo_dockerfile内容如下:
# 版本信息
FROM openjdk:8-alpine
MAINTAINER danny
LABEL version="lable1.0"
WORKDIR /home
#打包项目并拷贝到tomcat webapps目录
COPY justspringdemo-1.0-SNAPSHOT.jar /home
#开启内部服务端口
EXPOSE {{http_port}}
#启动tomcat服务器
CMD java -jar justspringdemo-1.0-SNAPSHOT.jar

5.编辑/etc/ansible/roles/springdemo/vars/main.yml,定义安装过程中使用的变量
--- # vars file for springdemo memory: 512m http_port: 8081 author: danny
6编辑/etc/ansible/roles/springdemo/tasks/main.yml,定义任务内容
---
# tasks file for springdemo
- name: create folder /home/ansible
file:
path: /home/ansible
state: directory
- name: copy spring docker file
template: src=springdemo_dockerfile dest="/home/ansible/springdemo_dockerfile"
- name: copy spring demo jar
copy:
src: justspringdemo-1.0-SNAPSHOT.jar
dest: /home/ansible
owner: root
mode: 0644
backup: no
- name: build docker image
command: docker build -f /home/ansible/springdemo_dockerfile -t springdemo /home/ansible
- name: wait 10s after build image
command: sleep 10
- name: stop demo container if exist
command: docker stop springdemo
- name: wait 10s after stop container
command: sleep 10
- name: rm demo container if exist
command: docker rm springdemo
- name: run springdemo demo
command: docker run -d -p 10002:{{http_port}} --name springdemo springdemo
中间有sleep 10秒的操作,目的是保证docker build,docker stop成功执行,便于往下继续操作
7.创建playbook剧本
touch /etc/ansible/playbook/springdemo.yml
springdemo.yml 剧本内容:
---
# 演示通过role管理playbook
- hosts: all
remote_user: root
strategy: free
roles:
- springdemo
post_tasks:
- shell: echo 'demo manage playbook by role'
register: ret
- debug: var=ret.stdout
8.运行playbook剧本
ansible-playbook springdemo.yml
运行结果:


9.切换到目标机器,进一步验证playbook任务是否正常启动成功

