以瓦利程序聊一聊DevOps以及自动化部署(一)

2020-04-08 15:49:20 浏览数 (1)

瓦利[1]是一款开源的 DevOps 代码自动部署工具,目前官方有两个新旧版本,分别是基于 PHP2 和 Python。

本文以旧版 YII2 为主线,结合 SSH 协议聊一聊代码自动化部署,服务器互认和文件传输的相关话题。

Linux 服务器间建立信任关系

“远程部署代码的前提是服务器之间已经建立了信任关系,用已有的账号可以实现服务器节点的登录,授权。

SSH 协议是 Linux 机器间建立信任关系的一种实现方式。

SSH 信任关系,是指一台服务器上的一个用户信任客户端的一个用户,通过安全级别的设置,允许这个用户不输入密码登录。

另一个说法叫做 public_key_auth,整个过程实际上就是证书信任。

主机间相关信任 ,建立免密码登录

“SSH 主机间信任的方式有两种,1 用户名密码登录 2 公钥认证登录

如果设置了无口令 SSH 登录(即通过客户端公钥认证),就可以直接连接到远程主机。这是基于 SSH 协议的自动化任务常用的手段。

无密码登录是通过 authorized_keys 实现的。

authorized_keys 是一个远程服务器文件,可以实现两个 Linux 机器之间使用 SSH 不需要用户名和密码.客户端公钥上传到服务器,然后再把这个客户端公钥添加到 authorized_keys。添加后,服务器就会认为你这个客户端为可信任。

“主机间模型

两台主机 IP

Server01 ,充当宿主服务器角色

Server02,充当目标服务器角色

查看 php-pfm 运行用户

代码语言:javascript复制
ps aux|grep php

apache

“php 进程用户 apache 有代码存储仓库 /code/www_walle 读写权限

代码语言:javascript复制
chown -R apache www_walle

实现信任之后,设 主机 01 和 02 账户都是 root, 在远程主机 01 上就以 ssh root@Server02 的方式登录,此时不需要输入 root 用户的密码。

具体的设置步骤 参考

SSH 三步解决免密登录[2]

小结一下 有以下几点

  • SSH 的公私钥设置 authorized_keys id_rsa id_rsa.pub known_hosts
  • 登录用户分配和授权
  • 重点目录授权 .ssh 目录的权限必须是 700 .ssh/authorized_keys 文件权限必须是 600

瓦利部署

图片.png

结合上图,明确几个概念

“宿主机

宿主机:即 walle 程序所在的机器。

“目标机群

目标机群:即应用服务器集群

首先通过 SSH 公钥创建和管理实现宿主机与目标服务器的通讯,可以实现代码拉取。

其次 宿主服务器与目标服务器通过 authorized_keys 实现代码文件的复制和同步。

整个过程源于信任,基于信任做文件传输。

重点解决及相关疑问

“宿主机可以访问应用服务器目标主机

参考Walle 官方问题解答[3]SSH 免密登录配置[4]

“1 两台 Linux 主机相互信任问题

登录账户需要用户名和密码,使用 SSH 并且相互信任后,区别在于登录过程中是否需要输入密码

“2 是否需要开启 StrictHostKeyChecking=no

使用 ssh 连接远程主机时加上“-o StrictHostKeyChecking=no”的选项,去掉对主机的验证检查。

代码语言:javascript复制
'ssh -T -p 22 -q -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -o CheckHostIP=false 'root'@'ip.' 'mkdir -p /code/release/4/20200131-014152' 2>&1'

参考网址

The authenticity of host xxx can't be estabilished[5]

“3 宿主主机用的哪个用户登录目标主机?

使用目标机器的用户登录目标机器,只是不需要提示和输入密码。这个登录用户是由登录服务器分配好的。

“4 如何让连接新主机时,不进行公钥确认?

这个问题与第二个问题呼应。在首次连接服务器时,会弹出公钥确认的提示,这会导致某些自动化任务,由于初次连接服务器或者 ~/.ssh/known_hosts 文件内容清空导致自动化任务中断。

SSH 客户端的 StrictHostKeyChecking 配置指令,可以实现当第一次连接服务器时,自动接受新的公钥。只需要修改 /etc/ssh/ssh_config 文件,包含下列语句:

常用命令

基于 CentOS7

“重启 ssh 服务

代码语言:javascript复制
systemctl restart sshd.service

“修改 user 登录密码

passwd user

“生成公钥

ssh-keygen -t rsa -C "apacheemail@qq.com"

“Git log 输出格式化 git log --graph --pretty=format

Mac 操作

打开终端查看是否已经存在 SSH 密钥:

cd ~/.ssh

显示

authorized_keys

id_rsa

id_rsa.pub

known_hosts

三个文件

https://git-scm.com/

git remote prune origin

secure copy

scp 是 secure copy 的简写,用于在 Linux 下进行远程拷贝文件的命令

文件从本地拷贝到服务器指定目录

$scp -r localfile.txt username@192.168.0.1:/home/username/

账户问题

在拿到 一台虚拟机之后,如果使用 Yum 安装 PHP(7.2),参考我的另一篇文章[使用 Yum 安装 PHP72],安装完成之后 系统会自动建立一个 apache 账户。以 apache 运行 PHP 服务

上文中提到

查看 php-pfm 运行用户

代码语言:javascript复制
ps aux|grep php
apache

宿主节点与 Git 代码仓库依赖的是 登录宿主节点的 PHP 运行用户。用户权限设置不准确,会造成代码 Git 下载失败。

php运行用户.png

以下是常见的错误

“Host key verification failed

代码语言:javascript复制
array(5) {
  [0]=>
  string(29) "Host key verification failed."
  [1]=>
  string(45) "fatal: Could not read from remote repository."
  [2]=>
  string(0) ""
  [3]=>
  string(51) "Please make sure you have the correct access rights"
  [4]=>
  string(26) "and the repository exists."
}

本质原因是 执行 PHP 的用户,即运行瓦利程序的用户 与代码仓库的 SSH 协议验证失败。解决方法是 建立 SSH 公钥,并在代码仓库方设置

基于 SSH 信任关系扩展到数字证书

信任源

一个认证中心是以它为信任源,由它维护一定范围的信任体系,在该信任体系中的所有用户、服务器,都被发放一张数字证书来证明其身份已经被鉴定过,并为其发放一张数字证书,每次在进行交易的时候,通过互相检查对方的数字证书即可判别是否是本信任域中的可信体。

CA

CA (Certificate Authority) :全称证书管理机构,即数字证书的申请、签发及管理机关。其主要功能为:产生密钥对、生成数字证书、分发密钥、密钥管理等。

数字证书

以下定义来自知乎

数字证书:是由 CA 机构颁发的证明(CA 证书),它包含了公钥、公钥拥有者名称、CA 的数字签名、有效期、授权中心名称、证书序列号等信息。我们可以通俗的理解为数字证书是个人或企业在网络上的身份证。

结论

在整个 DevOps 中涉及到几个服务器角色,宿主服务器,目标服务器,和代码仓库服务器。

代码部署过程中的服务器间交互要分清楚,每次的客户端和服务器分别是谁。

例如 拉取代码过程中,就是宿主服务器的 PHP 运行用户与目标服务器(Git 服务器)在连接通讯。

针对基于瓦利的代码部署方案抽象下来的关键点就是 用户,权限,代码部署步骤,进而实现自动化。主要涉及到 Git/SVN 仓库,SSH,PHP 进程,SCP 等。

自动化部署以及 DevOps 解决方案 是一个比较重的话题,很难用一篇文章,甚至几篇文章讲明白。

这个话题我会在后边的文章中继续探讨,本文算是一个开篇,文中有不严谨的地方欢迎留言探讨。

参考资料

[1]

瓦利: http://www.walle-web.io/

[2]

SSH 三步解决免密登录: https://blog.csdn.net/jeikerxiao/article/details/84105529

[3]

Walle 官方问题解答: http://walle-web.io/docs/troubleshooting.html

[4]

SSH 免密登录配置: http://walle-web.io/docs/troubleshooting.html

[5]

The authenticity of host xxx can't be estabilished: https://segmentfault.com/q/1010000006670515

0 人点赞