美文网首页
以瓦利程序聊一聊DevOps以及自动化部署(一)

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

作者: needrunning | 来源:发表于2020-04-06 21:33 被阅读0次

    瓦利是一款开源的 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 运行用户

    ps aux|grep php
    

    apache

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

    chown -R apache www_walle
    

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

    具体的设置步骤 参考

    SSH 三步解决免密登录

    小结一下 有以下几点

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

    瓦利部署

    瓦利官方

    图片.png

    结合上图,明确几个概念

    宿主机

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

    目标机群

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

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

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

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

    重点解决及相关疑问

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

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

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

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

    2 是否需要开启 StrictHostKeyChecking=no

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

    '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

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

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

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

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

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

    常用命令

    基于 CentOS7

    重启 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 运行用户

    ps aux|grep php
    apache
    

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

    php运行用户.png

    初始化宿主机部署工作空间

    cp -rf /data/www_walle/test/TunanCloud /data/www_walle/test/TunanCloud-20200327-140846

    发布上线单,获取代码更新记录
    /walle/get-commit-history?projectId=5&branch=master

    以下是常见的错误

    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 解决方案 是一个比较重的话题,很难用一篇文章,甚至几篇文章讲明白。

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

    参考文档

    SSH 三步解决免密登录

    安装服务自动生成用户并激活设置

    The authenticity of host xxx can't be estabilished

    相关文章

      网友评论

          本文标题:以瓦利程序聊一聊DevOps以及自动化部署(一)

          本文链接:https://www.haomeiwen.com/subject/gawesctx.html