对于 devops 来讲,容器技术绝对是咱们笑傲江湖的法宝。本文经过一个小 demo 来介绍如何使用容器技术来改进咱们的 devops 工做流。html
devops 的平常工做中不免会有一些繁琐的重复性劳动。好比管理 Azure 上的各类资源,咱们会使用 Azure CLI 工具。同时咱们也会使用 Ansible 完成一些自动化的任务。当咱们同时使用两者的时候就会碰到一些尴尬的事情:Azure CLI 依赖的 python 版本为 3.x,而 Ansible 的主流版本还在依赖 python 2.x。若是咱们要同时使用两者,就须要在环境中搞一些飞机。若是团队中的每一个成员都须要使用这样的工具,那么每一个人的环境中都须要这些飞机!下面是一些比较相似的问题:python
实现这些需求的最好方式就是容器技术!经过容器把咱们的 devops 工做流和运行环境隔离开就能够了。文本的 demo 会演示一个很是简单的使用 Azure CLI 的工做流,咱们的目标是为整个团队打造一个知足以上需求的工具集(容器镜像)。其大致步骤以下:docker
让咱们使用 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 命令:
这样就能够输出你的帐号信息了。
若是你实验了 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 上的操做可能是一些枯燥的重复动做。
好比:
其实咱们能够把这样的功能进行封装,从而简化具体的操做。下面咱们举个简单的例子,就是把查询 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
这样用起来是否是简便不少了!若是咱们把经常使用的操做都写成脚本封装起来,是否是就可以打造一系列的自动化工做流了!
demo 虽小,但咱们仍是要完成一个完整的用例的最后一步,就是在整个团队中分享上面建立的容器化工做流。具体的作法大概有两种:
两种方式都很方便,喜欢第二种方式的朋友能够参考笔者的博文《局域网内部署 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 很小,权当抛砖引玉了!