容器化的 DevOps 工做流

对于 devops 来讲,容器技术绝对是咱们笑傲江湖的法宝。本文经过一个小 demo 来介绍如何使用容器技术来改进咱们的 devops 工做流。html

devops 的平常工做中不免会有一些繁琐的重复性劳动。好比管理 Azure 上的各类资源,咱们会使用 Azure CLI 工具。同时咱们也会使用 Ansible 完成一些自动化的任务。当咱们同时使用两者的时候就会碰到一些尴尬的事情:Azure CLI 依赖的 python 版本为 3.x,而 Ansible 的主流版本还在依赖 python 2.x。若是咱们要同时使用两者,就须要在环境中搞一些飞机。若是团队中的每一个成员都须要使用这样的工具,那么每一个人的环境中都须要这些飞机!下面是一些比较相似的问题:python

  • 一些工做流在陌生的环境中不能正确的工做
  • 在工做流中加入新的工具时,整个团队都须要获取并安装这些新的工具
  • 运行 devops 工做流不能对当前的环境产生影响(应该容许在 build 环境中运行 devops 工做流)
  • 工做流的变化不会对运行环境产生任何的影响

实现这些需求的最好方式就是容器技术!经过容器把咱们的 devops 工做流和运行环境隔离开就能够了。文本的 demo 会演示一个很是简单的使用 Azure CLI 的工做流,咱们的目标是为整个团队打造一个知足以上需求的工具集(容器镜像)。其大致步骤以下:docker

  • 建立构造容器镜像的 Dockerfile 文件
  • 在本地构建容器镜像并进行测试
  • 对容器镜像不断的升级完善
  • 把容器镜像分享给整个团队

构建容器镜像

让咱们使用 Dockerfile 来建立本身的容器镜像。先建立目录 cazurecli,并在目录下建立 Dockerfile 文件:浏览器

$ mkdir cazurecli
$ cd cazurecli
$ touch Dockerfile

编辑 Dockerfile 文件的内容以下:bash

FROM microsoft/azure-cli:latest
CMD bash

其中的 FROM 指令用来指定 base 镜像,这里咱们直接使用了微软提供的 azrue-cli 镜像,只是把容器启动时执行的命令经过 CMD 指令设置为 bash。服务器

而后执行下面的命令构建容器:函数

$ docker build -t azcli .

上图的输出显示容器镜像构建成功,咱们能够经过 azcli:latest 来引用新构建的容器镜像。那就让咱们启动容器并执行 azure cli 命令:工具

$ docker run --rm -it azcli:latest

进入容器中的命令行后,尝试经过 az account list 查看 azure 帐号信息:测试

bash-4.3# az account list

红框中的信息是提示咱们先经过 az login 命令登陆才能查看帐号信息:ui

bash-4.3# az login

而后按照提示信息打开浏览器,输入验证码进行登陆。在浏览器中登陆完成后命令行上的登陆过程也随之完成,而后从新执行 az account list 命令:

这样就能够输出你的帐号信息了。

解决 Azure CLI 的登陆问题

若是你实验了 az login 命令,就会发现登陆的过程仍是挺繁琐的,若是每次启动容器都须要执行登陆操做你会怎么想呢?确定是弱爆了!
好在咱们能够经过 bind mount 的方式把 azure 的登陆信息保存在 host 的文件中。之后启动容器时挂载这些登陆信息就能够了。下面是具体的步骤。
先在用户的家目录中建立 .azure 目录:

$ mkdir ${HOME}/.zaure

而后启动一个容器并以 bind 的模式挂载 .azure 目录:

$ docker run --rm -it --mount type=bind,source=${HOME}/.azure,target=/root/.azure azcli

在容器中进行一次登陆操做:

# az login

登陆完成后,登陆的信息被保存到了 /root/.azure 目录中:

退出当前的容器,执行下面的命令建立一个新的容器:

$ docker run --rm -it --mount type=bind,source=${HOME}/.azure,target=/root/.azure azcli

而后再执行一次 az account list 命令试试,此次就不须要登陆了!
注意:即使这样也不是一劳永逸的,默认的登陆信息过时时间为两周,到时候你须要再次进行登陆。

添加自定义的工做流

对于一名 devops 工程师来讲,咱们在 azure 上的操做可能是一些枯燥的重复动做。
好比:

  • Start/Stop/Deallocate/Restart 数量众多的虚机
  • 检查大量的虚机状态
  • 拿到 IP 地址后查出对应的主机名称等等

其实咱们能够把这样的功能进行封装,从而简化具体的操做。下面咱们举个简单的例子,就是把查询 ResourceGroup 和虚机的操做封装成 bash 中的函数。先在 cazurecli 目录下建立 scripts 目录:

$ mkdir scripts

而后在 scripts 目录下建立 search.sh 文件:

$ touch scripts/search.sh

编辑 search.sh 文件的内容以下:

#!/bin/bash

# search for Resource Group by name
function search-group () {
    query=$1
    az group list --query "[?name | contains(@,'$query')].{ResourceGroup:name}" -o table
}

# search for VM by name
function search-vms () {
    query=$1
    az vm list --query "[?name | contains(@,'$query')].{ResourceGroup:resourceGroup,Name:name}" -o table
}

在这段脚本中咱们定义了两个函数,分别是经过名称来查询 ResourceGroup 和虚机(要了解相关的查询语法,请参考 az 命令)。
下面咱们把 search.sh 脚本集成到容器的镜像中,并把脚本中的函数导入到 bash,编辑 Dockerfile 以下:

FROM microsoft/azure-cli:latest
COPY scripts/ scripts/
RUN echo -e "\
; for f in /scripts/*; \
do chmod a+x \${f}; source \${f}; \
done;" >> ~/.bashrc

CMD bash

用新的 Dockerfile 从新构建容器镜像:

$ docker build -t azcli .

建立容器并尝试使用 search-group 和 search-vms 函数:

$ docker run --rm -it --mount type=bind,source=${HOME}/.azure,target=/root/.azure azcli
bash-4.3# search-group learnrg
bash-4.3# search-vms testdesktop

这样用起来是否是简便不少了!若是咱们把经常使用的操做都写成脚本封装起来,是否是就可以打造一系列的自动化工做流了!

把镜像放在 docker hub 上进行共享

demo 虽小,但咱们仍是要完成一个完整的用例的最后一步,就是在整个团队中分享上面建立的容器化工做流。具体的作法大概有两种:

  • 经过 dockerhub 等第三方平台分享容器镜像
  • 在公司内搭建内部使用的镜像管理平台

两种方式都很方便,喜欢第二种方式的朋友能够参考笔者的博文《局域网内部署 Docker Registry》。这里只简单的介绍一下 dockerhub 的用法。首先你须要去 dockerhub 的官网注册一个帐号,注册后建立一个 repository,好比笔者的用户名为 ljfpower,新建立的 repository 名称为 azcli。而后须要在本地经过 docker login 命令进行登陆。登陆后为本地的容器镜像建立一个 tag,好比:

$ docker tag azcli ljfpower/azcli

最后一步即是把这个 tag 标识的容器镜像推送到 dockerhub 上去:

$ docker push ljfpower/azcli:latest

推送完成后你会在 dockerhub 上看到你的镜像:

简单起见笔者使用的是公有镜像,也就是任何人均可如下载使用该镜像。因此你只须要一条 pull 命令就能够享受别人分享的工做流了:

$ docker pull ljfpower/azcli

总结

咱们打造了一个工具包,并把它容器化了。所以任何的团队成员均可以经过容器在本身的环境中无差异的运行这些工做流。
这就是生产力呀!由于没人会再抱怨:"这个工具配置起来好恶心","为何在个人机器上运行不了 xxx" ...
同时,若是须要,你能够在任何环境中运行这些工做流,好比构建产品的服务器上,由于运行这些工做流并不须要安装额外的工具(python、azure cli 等)。
本文的名字起的很大而 demo 很小,权当抛砖引玉了!

参考:
Dockerize DevOps Workflows

相关文章
相关标签/搜索