ansible部署
# 简介
自定义灵活部署项目;
# 安装
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
1
2
3
2
3
# 用法
$ ansible-playbook -i ./playbook/hosts -v ./playbook/ansible-deploy.yml --extra-vars 'hosts=dev'
1
# 修改默认配置
vim /etc/ansible/ansible.cfg
1
查找ssh_args
参数,修改如下: ssh_args = -C -o ControlMaster=auto -o ControlPersist=60s -o ServerAliveInterval=1
此处配置修改ssh登录连接超时的问题
# 配置文件
# ansible-deploy.yml
- 参数说明:
git_name
git仓库名称project_name
项目名称,类型为数组,可指定多个项目dir
项目所在路径git_repo
远程git仓库路径 - 任务流程
- 引用hosts中定义的组名
- 判断是否是第一次执行,若是,则初始化git仓库,配置远程地址,开启sparse checkout功能;否则跳过,继续执行
- 添加指定拉取的文件目录,具体在
project_name
参数中 - 根据git参数拉取代码到指定的
dir
路径下,循环执行 - 安装依赖,启动服务,循环执行
# hosts
基本格式: [test] 192.168.1.1 ansible_ssh_user=user ansible_ssh_port=22
设置服务器对应的参数配置,如IP、ssh登录用户、ssh登录端口等一系列参数;配合ansible-deploy.yml文件使用
# 实践
deploy.sh
#!/bin/bash
ansible-playbook -i ./playbook/hosts -v ./playbook/ansible-deploy.yml --extra-vars hosts=$1
#pm2 deploy deploy.json production $1
# 运行命令
#./deploy.sh dev
1
2
3
4
5
2
3
4
5
hosts
[production]
47.107.236.xxx ansible_ssh_user=samy ansible_ssh_port=963x
[dev]
192.168.11.xxx ansible_ssh_user=samy ansible_ssh_port=22
1
2
3
4
5
2
3
4
5
ansible-deploy.yml
---
- name: 初始化项目
hosts: "{{ hosts }}"
vars:
git_name: xxx-apps
project_name:
- xxx_alioss
- book_server
- xxx_drm
- xxx-pay-micro
- neocloud
dir: /home/samy/ansible-deploy/{{ git_name }}
git_repo: git@github.com:xxx-intl/{{ git_name }}.git
lists:
- book_server
- xxx_drm
- xxx-pay-micro
pre_tasks:
- name: 返回文件夹的状态
stat: path={{ dir }}
register: result
- name: 初始化git仓库,添加远程仓库的地址,开启sparse checkout功能
shell: git init {{ dir }} && cd {{ dir }} && git remote add origin {{ git_repo }} && git config core.sparsecheckout true
when: result.stat.exists == false # 判断文件夹是否存在
- name: 重置sparse-checkout内容
shell: :> {{ dir }}/.git/info/sparse-checkout
- name: 添加配置文件:拉取指定的文件夹
shell: echo "{{ item }}" >> {{ dir }}/.git/info/sparse-checkout
with_items: "{{ project_name }}"
- name: 拉取代码
git:
repo: "{{ git_repo }}"
dest: "{{ dir }}"
remote: origin
version: dev
force: yes
tasks:
- name: 循环调用,根据默认条件启动服务
include_role:
name: restartServer
vars:
project_name: "{{ item }}"
with_items: "{{ lists }}"
- name: 重启{{ project_name[4] }}服务
shell: cd {{ dir }}/{{ project_name[4] }} && cnpm i && npx sequelize db:migrate && npm stop && npm start
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
lists中的三个项目步骤一样,故将其封装起来;
restartServer/tasks/main.yml
- name: 返回{{ project_name }}文件夹最近修改的文件信息
shell: find {{ dir }}/"{{ project_name }}" -mtime -0.01
register: result
- name: 判断目录{{ project_name }}是否有更改,有则重启服务
shell: cd {{ dir }}/{{ project_name }} && cnpm i && npm stop && npm start
when: (result.stdout_lines | length) > 0
1
2
3
4
5
6
2
3
4
5
6
上次更新: 2022/04/15, 05:41:31