DevOps 工作流

为了熟悉 DevOps ,我决定自己搭建一套工作流

GitLab

GitLab 的主要构成

  • Logrotate日志文件管理工具
  • Postgresql数据库
  • Redis缓存服务器

安装

安装之后需要生成证书

  • keysudo openssl genrsa -out /etc/gitlab/ssl/gitlab.example.com.key 2048

  • csr sudo openssl req -new -key "/etc/gitlab/ssl/gitlab.example.com.key" -out "/etc/gitlab/ssl/gitlab.example.com.csr"

  • crtsudo openssl x509 -req -days 365 -in "/etc/gitlab/ssl/gitlab.example.com.csr" -signkey "/etc/gitlab/ssl/gitlab.example.com.key" -out "/etc/gitlab/ssl/gitlab.example.com.crt"

  • temsudo openssl dhparam -out /etc/gitlab/ssl/dhparams.tem 2048 同时需要 chmod 600 * 更改文件夹的权限 之后需要在 /etc/gitlab/gitlab.rb 中对证书进行配置

  • external_url:将协议http开头改为https

  • nginx['redirect_http_to_https']:将它配置为true

  • nginx['ssl_certificate']:将它配置为crt证书路径

  • nginx['ssl_certificate_key']:将它配置为key路径

  • nginx['ssl_dhparam']:将它配置为tem文件路径 之后运行 gitlab-ctl reconfigure

    找到 gitlab 下的 nginx 代理工具更改 http 配置文件

  • sudo -e /var/opt/gitlab/nginx/conf/gitlab-http.conf

  • 找到server_name并在后面增加rewrite ^(.*)$ https://$host$1 permanent;

  • gitlab-ctl restart 之后更改电脑中的 hosts 文件,如果为 mac 则打开 /etc/hosts ,将服务器域名映射为 gitlab.example.com

Ansible

Ansible 是一个开源部署工具, SSH 协议通讯,全平台,无需编译,模块化部署管理。推送 Playbook 进行远程节点快速部署,适合中小规模快速部署。 优势

  • 轻量级无客户端
  • 开源免费,学习成本低
  • 使用Playbook作为核心配置架构,统一的脚本格式,进行批量式部署
  • 完善的模块化扩展,支持目前主流的开发场景
  • 强大的稳定性和兼容性
  • 有着活跃的官方社区问题讨论

安装

当我们安装 ansible 时,我们希望它所使用的 python 和其他软件使用的 python 不在同一环境下,此时需要安装 virtualenv 来对 python 环境进行隔离,首先需要下载 pip

  • apt install pip

  • 之后可以创建软链接ln -s /usr/local/bin/pip3 /usr/local/bin/pip,使用pip3时可以以pip代替

  • pip install virtualenv 之后创建 Ansible 账户

  • useradd deploy && su - deploy创建并进入该账户的命令行界面

  • virtualenv -p /usr/local/bin/python3 .py3-a-env前面一个指定python版本,后面的用于创建该名称下的virtualenv实例目录 Git 源代码安装 ansible2.5

  • cd /home/deploy/py3-a-env

  • git clone https://github.com/ansible/ansible.git

  • cd ansible && git checkout stable-2.5 加载 python3 virtualenv 环境

  • source /home/deploy/.py3-a-env/bin/active 安装 ansible 依赖包

  • pip install paramiko PyYAML jinja2python3 的环境下加载 ansible 2.5

  • source /home/deploy/.py3-a-env/ansible/hacking/env-setup -q

  • ansible --version进行验证

Playbooks

Test Playbooks 分为以下几个目录清单

  • inventory/Server详细清单目录,部署主机的相关域名,地址或是变量参数
    • testenv:具体清单与变量声明文件,部署到哪个环境,比如developuatproduction等环境
  • roles/roles任务列表,存放一个或是多个role
    • testbox/testbox详细任务,具体的项目名称
      • tasks/
        • main.ymltestbox主任务文件
  • deploy.ymlplaybook任务入口文件,它将调度roles下的所有任务,并部署到inventory主机中 编写规范
  • testenv:由上下两部分组成
    • testservers:作为一个Server组列表,可保存一个或多个目标主机,域名或是 ip 地址
      • test.example.com:目标部署服务器主机名
    • testservers:varsServer组列表参数,保存目标主机的键值对参数
      • server_name=test.example.com
      • user=root
      • output=/root/test.txt
  • main.yml:主任务文件,保存task的任务乐章,以一个或多个task作为音符,tash一般由两部分组成
    • name:任务名称,方便编写好task后知道是干什么的
    • shell:具体要执行的任务,一般是使用shell模块执行命令,里面的变量在testenv当中
  • deploy.yml:任务入口文件,它将playbook下的所有内容展示给ansible命令,最后部署到对应主机当中
    • hosts: "testservers"Server列表,对应testenv定义的目标主机
    • gather_facts: true:获取目标主机的基本信息
    • remote_user: root:表示我们在目标主机下使用的是root主机权限
    • roles: test:进入roles/testbox执行任务

Jenkins

主流的运维开发平台,兼容所有主流开发环境,插件市场可与海量业内主流开发工具实现集成。 Job 为配置单位与日志管理,使运维与开发人员能协同工作 根据权限划分不同 Job 不同角色,具有强大的负载均衡功能,保证我们项目的可靠性

安装

  • 首先需要安装 java
  • wget -q -O - https://pkg.jenkins.io/debian/jenkins.io.key | sudo apt-key add -导入Jenkins存储库GPG密钥
  • sudo sh -c 'echo deb http://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'Jenkins存储库添加到系统中
  • sudo apt updatesudo apt install jenkins安装jenkins
  • systemctl status jenkins打印服务状态
  • /etc/default/jenkins可改变配置文件
  • jenkins 默认用户为jenkins,需要更改为管理员
  • 需要更改 jenkins 文件的执行权限
    • sudo chown -R loloao:loloao /var/lib/jenkins
    • sudo chown -R loloao:loloao /var/log/jenkins
    • sudo chown -R loloao:loloao /var/cache/jenkins

Jenkins Job

代表一个任务或项目,并且可配置与可执行,执行后的记录称之为 Build ,所有文件集中保存

  • Freestyle Job
    • 需要在页面添加模块配置项与参数完成配置
    • 每个Job只能实现一个开发功能
    • 无法将配置代码化,不利于Job配置迁移与版本控制。不能记录和保存所有人的系统配置历史,也就是不知道谁更改了
    • 逻辑相对简单,无需额外学习成本
  • Pipeline Job:匹配持续集成与持续交互的概念
    • 所有模块,参数配置都可以体现为一个pipeline脚本
    • 可以定义多个stage构建一个管道工作集
    • 所有配置代码化,方便Job配置迁移与版本控制

Jenkins Job 构建配置

  1. 配置Jenkins server本地Gitlab DNS
  2. 安装git clientcurl工具依赖
  3. 关闭系统Git http.sslVerify安全认证
  4. 添加Jenkins后台Git client useremail
  5. 添加Jenkins后台Git Credential凭据,配置全局凭据<jenkins host>/credentials/store/system/domain/_/newCredentials

Pipeline Job 编写规范,基础架构

  • 所有代码包裹在pipeline{}层内

  • stages{}层用来包含该pipeline所有stage子层

  • stage{}层用来包含我们需要编写任务的step{}子层

  • steps{]层用来添加我们具体需要调用的模块语句

  • agent:定义pipeline在哪里运行,可以使用anynone或具体的Jenkins node主机名等,比如我们要特指在node1上执行,可以写成agent{ node {label 'node1'}}

  • environment:可以使用变量名称=变量值定义环境变量,可以定义全局环境变量,应用所有stages任务。可以单独定义stage环境变量应用单独的stage任务 environment { PATH="/bin:/sbin:/usr/bin..."}

  • script:在steps内定义script{},可以使用groovy脚本语言,用来进行脚本逻辑运算

  • steps

    • echo:打印输出
    • sh:调用 Linux 系统 shell 命令
    • git url:调用git模块进行 git 相关操作
#!groovy

pipeline {
	agent {
		node {
			label 'master'
		}
	}

	environment {
		PATH="/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin"
	}

	parameters {
		choice(
			choices: 'dev\nprod',
			description: 'choose deploy environment',
			name: 'deploy_env'
		)

		string (
			name: 'version',
			defaultValue: '1.0.0',
			description: 'build version'
		)
	}

	stages {
		stage("Checkout test repo") {
			steps {
				dir("${env.WORKSPACE}") {
					git branch: 'master',
					credentialsId: '68764351-42af-4130-bbad-67ea8410e12c',
					url: 'http://192.168.3.2:8082/root/test-repo.git'
				}
			}
		}

		stage("Print env variable") {
			steps {
				dir ("${env.WORKSPACE}") {
					sh """
					echo "[INFO] Print env variable"
					echo "current deployment environment is $deploy_env" >> test.properties
					echo "The build is $version" >> test.properties
					echo "[INFO] Done"
					"""
				}
			}
		}

		stage("Check test properties") {
			steps {
				dir ("${env.WORKSPACE}") {
					sh """
					echo "[INFO] Check test properties"
					if [ -s test.properties ]
					then
						cat test.properties
						echo "[INFO] Done"
					else
						echo "test.properties is empty"
					fi

					echo "[INFO] Build finished"
					"""
				}
			}
		}
	}
}