01. 背景
一般地,在公司的生产环境中,由于需求变更和代码更新频繁的问题,那么应对措施就是工具化平台化使用到该生产环境中。ansible-playbook可以简单便捷地管理配置服务。
02. 需求
对于代码部分,一般是git或svn作为代码管理仓库。语言使用java,那么打包则由maven来打包,使用maven私服来管理包。即是先在git下载代码,然后使用mvn来打包,经过传输到生产服务器,然后启动服务,最终检查服务是否成功。
03. ansible-playbook内容
---
- name: Local ops
hosts: 127.0.0.1
remote_user: mai
become: yes
become_user: root
gather_facts: False
vars:
- super_user: mai
- git_user: autouser
- git_passwd: 123456
- project_name: testauto
- project_gitlocal_dir: /tmp/logstest/{{ project_name }}
tasks:
- name: Delete {{ project_name }} code.
file:
path: '{{ project_gitlocal_dir }}'
state: absent
- name: Downloading git code.
git:
repo: https://{{ git_user | urlencode }}:{{ git_passwd | urlencode}}@git.mairoot.com/test/{{ project_name }}.git
version: develop
dest: '{{ project_gitlocal_dir }}'
force: yes
- name: Mvn make pack.
shell: cd {{ project_gitlocal_dir }}; /data/apps/apache-maven-3.5.4-java8/bin/mvn clean package -Pdev
- name: Remote ops
hosts: testhost
remote_user: mai
become: yes
become_user: root
gather_facts: False
vars:
- project_name: testauto
- project_api_name: testautoapi
- project_gitlocal_dir: /tmp/logstest/{{ project_name }}
- project_api_dir_name: /data/apps/backend/{{ project_api_name }}
- run_user: testauto
- run_group: suwe
tasks:
- name: Mkdir {{ project_name }}
file:
path: '{{ project_api_dir_name }}'
state: directory
owner: '{{ run_user }}'
group: '{{ run_group }}'
mode: 0755
- name: Copy file to remote install.
copy:
src: "{{ item.src }}"
dest: "{{ item.dest }}"
with_items:
- { src: '{{ project_gitlocal_dir }}/testauto-api/target/lib', dest: '{{ project_api_dir_name }}' }
- { src: '{{ project_gitlocal_dir }}/testauto-api/target/testauto.jar', dest: '{{ project_api_dir_name }}' }
- name: Isn't docker-java or not.
shell: docker ps -a| grep {{ project_api_name }}
register: docker_{{ project_api_name }}_value
ignore_errors: True
- name: Create and Start docker-java server
when: docker_{{ project_api_name }}_value | failed
shell: docker run -itd -p 8089:8080 --name {{ project_api_name }} -v {{ project_api_dir_name }}:/app -v {{ project_api_dir_name }}/logs:/logs java:8 /bin/bash -c 'java -jar -Dspring.profiles.active=prod -XX:+HeapDumpOnOutOfMemoryError -XX:+UseParNewGC -XX:NewSize=16G -XX:MaxPermSize=16G -Xms16G -Xmx16G -server -Duser.timezone=Asia/Shanghai -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=8080 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=1099 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Djava.rmi.server.hostname=172.17.0.1 /app/testauto.jar'
- name: Start docker-java server
when: docker_{{ project_api_name }}_value | succeeded
shell: docker restart {{ project_api_name }}
- name: Local ops
hosts: 127.0.0.1
remote_user: mai
become: yes
become_user: root
gather_facts: False
vars:
- project_name: testauto
- project_gitlocal_dir: /tmp/logstest/{{ project_name }}
tasks:
- name: Delete testauto code.
file:
path: '{{ project_gitlocal_dir }}'
state: absent
04. 简单解释
简单解析上面内容,主要应用到的是可以把git密码保存到文件中,一个ansible-playbook里有多个play,一个play里可以多个tasks。