ansible部署

# 简介

自定义灵活部署项目;

# 安装

$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
1
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

  1. 参数说明: git_name git仓库名称 project_name 项目名称,类型为数组,可指定多个项目 dir 项目所在路径 git_repo 远程git仓库路径
  2. 任务流程
  3. 引用hosts中定义的组名
  4. 判断是否是第一次执行,若是,则初始化git仓库,配置远程地址,开启sparse checkout功能;否则跳过,继续执行
  5. 添加指定拉取的文件目录,具体在project_name参数中
  6. 根据git参数拉取代码到指定的dir路径下,循环执行
  7. 安装依赖,启动服务,循环执行

# 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

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

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

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
上次更新: 2022/04/15, 05:41:31
×