瓦利[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
代码语言:javascript复制“php 进程用户 apache 有代码存储仓库 /code/www_walle 读写权限
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
代码语言:javascript复制“重启 ssh 服务
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
以下是常见的错误
代码语言:javascript复制“Host key verification failed
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