GitLab CI + Ansible 一键部署至全球6台物理服务器,实现零中断上线

GitLab CI + Ansible 一键部署至全球6台物理服务器,实现零中断上线

企业数字化转型的加速,软件发布和部署的频率和要求也越来越高,开发和运维团队需要更加高效和可靠的工具来保证产品在全球范围内的快速上线和稳定运行。本文将介绍如何通过 GitLab CI/CD 与 Ansible 工具链,实现在全球6台物理服务器上进行自动化部署,并保证在发布过程中零中断,确保系统的高可用性。

我们的目标是利用 GitLab CI 管理代码的构建和发布流程,同时使用 Ansible 进行自动化配置和部署,覆盖全球多个数据中心,实现自动化一键部署。

技术架构

本文将使用以下技术栈:

  • GitLab CI:用作持续集成和持续交付的工具,自动化整个代码的构建、测试和部署流程。
  • Ansible:一种基于 Python 的自动化运维工具,支持无代理部署,适合大规模服务器的自动化配置。
  • 物理服务器:在全球6个不同区域的物理服务器上进行部署,确保跨地域冗余和高可用性。

硬件配置

为了保证系统的高可用性和快速响应,我们选择了以下配置的6台物理服务器:

  • CPU:Intel Xeon E5-2670 v3 (8 核心 / 16 线程,2.3 GHz)
  • 内存:64 GB DDR4
  • 存储:1 TB SSD,RAID 1 配置,确保数据的冗余备份
  • 操作系统:CentOS 7.x
  • 网络:1 Gbps 企业级光纤宽带,确保部署过程中的网络稳定性

GitLab CI/CD 流程

1. GitLab CI 配置

我们需要在 GitLab 上配置一个 CI/CD 项目,并创建 .gitlab-ci.yml 文件,定义自动化的构建和部署流程。

.gitlab-ci.yml 文件结构

stages:
  - build
  - deploy

variables:
  ANSIBLE_HOST_KEY_CHECKING: "False"
  ANSIBLE_SSH_PRIVATE_KEY_FILE: "/root/.ssh/id_rsa"
  REMOTE_USER: "root"
  REMOTE_HOSTS: "server1,server2,server3,server4,server5,server6"

before_script:
  - apt-get update -y
  - apt-get install -y ansible sshpass

build_job:
  stage: build
  script:
    - echo "Building project..."
    - make build  # 这里假设使用 make 工具进行构建

deploy_job:
  stage: deploy
  script:
    - echo "Deploying project using Ansible..."
    - ansible-playbook -i $REMOTE_HOSTS, -u $REMOTE_USER --private-key $ANSIBLE_SSH_PRIVATE_KEY_FILE deploy.yml

在此配置中,我们定义了两个主要的阶段:build 和 deploy。在 build 阶段,我们使用 Make 工具进行项目的构建;在 deploy 阶段,使用 Ansible 将构建好的代码部署到全球6台物理服务器上。

2. Ansible 配置

Ansible 的核心是 Playbook,它定义了如何配置和部署应用程序。以下是一个简单的 deploy.yml 示例,展示如何使用 Ansible 进行自动化部署。

deploy.yml 示例

---
- name: Deploy project to all servers
  hosts: all
  become: yes
  tasks:
    - name: Ensure Nginx is installed
      yum:
        name: nginx
        state: present

    - name: Copy application files to remote server
      copy:
        src: /path/to/local/application/
        dest: /var/www/html/

    - name: Restart Nginx service
      service:
        name: nginx
        state: restarted

在这个 Playbook 中,我们定义了以下任务:

确保 Nginx 已安装。

将构建好的应用程序文件复制到目标服务器上的指定路径。

重启 Nginx 服务,使得新的代码上线。

3. 配置 SSH 密钥

为了实现无密码的 SSH 连接,我们需要确保 GitLab CI Runner 可以使用 SSH 密钥连接到目标服务器。生成一对 SSH 密钥,并将公钥添加到目标服务器的 ~/.ssh/authorized_keys 中。

ssh-keygen -t rsa -b 2048

将生成的公钥(id_rsa.pub)添加到所有 6 台服务器的 authorized_keys 中,确保自动化部署时不需要手动输入密码。

零中断上线策略

为了确保在部署过程中不会出现任何中断,我们采用以下策略:

1. 蓝绿部署

蓝绿部署是一种部署方式,在这种方式下,始终保持两个独立的生产环境:蓝环境和绿环境。在发布新版本时,首先将新的代码部署到绿环境,经过充分的验证后,再将流量切换到绿环境。这保证了用户的访问不会受到影响。

在 Ansible Playbook 中,我们可以添加步骤来切换环境:

- name: Switch traffic to green environment
command: "nginx -s reload"

2. 滚动更新

滚动更新是一种逐台服务器进行升级的方式,确保每次只更新部分服务器,避免全部服务器都在同一时刻不可用。Ansible 可以通过设置不同的 serial 参数来实现滚动更新:

- name: Deploy application with rolling update
  hosts: all
  serial: 1  # 每次只更新一台服务器
  tasks:
    - name: Deploy application files
      copy:
        src: /path/to/application
        dest: /var/www/html/

3. 健康检查与回滚机制

为了确保部署后的应用程序能正常运行,我们在每次部署后都会进行健康检查,并在检测到故障时回滚到上一个稳定版本。

- name: Health check
  uri:
    url: "http://{{ ansible_host }}/healthcheck"
    method: GET
    status_code: 200
  register: health_check

- name: Rollback if health check fails
  when: health_check.status_code != 200
  command: "ansible-playbook rollback.yml"

如果健康检查失败,自动回滚到上一个版本。

我们通过 GitLab CI 和 Ansible 的组合,可以轻松实现全球多台物理服务器的一键部署,并保证零中断上线。在本文中,我们详细介绍了如何配置 CI/CD 流程、使用 Ansible 进行自动化部署以及确保高可用性和零中断上线的策略。通过蓝绿部署、滚动更新和健康检查机制,能够确保在进行软件更新时不影响用户的正常使用。这种自动化流程不仅减少了人为错误,也提高了发布效率和应用的稳定性,为大规模、高频次发布提供了强有力的支持。

未经允许不得转载:A5数据 » GitLab CI + Ansible 一键部署至全球6台物理服务器,实现零中断上线

相关文章

contact