运维黑科技:百变环境 direnv 教你 72 变

640?wx_fmt=jpeg


本文转载自公众号:网易游戏运维平台, 点击查看原文
经常接触 Linux 的同学,相信对环境变量并不陌生,我们执行命令需要环境变量、编译软件包需要环境变量、运行自己的代码有时候也会需要环境变量。
不知道你是否遇到过这样一种情况,在某个目录下,执行一些命令的时候,需要提前加载一些环境变量,然而我们又不想每次都要 CD 进去,先 export 几个环境变量,然后再执行需要的命令,因为那样不仅操作起来麻烦,还有个可能因为 export 的环境变量没清理,导致影响到其他同一个 Shell 下的后续操作。
本文将介绍一个叫 direnv(https://direnv.net/) 的小工具,并以一个具体的开发环境部署场景作为实例,讲解如何进行环境分离,并结合 direnv 降低使用上的影响。


实际场景

640?wx_fmt=png


最近由于项目的需求,需要在同一台机器上部署 dev/test/stage 三个环境。这种多个环境共存的情况,不仅需要在代码启动时进行环境变量的分离,也需要在启动时通过环境变量来控制启动不同的环境。为此我的设计是这样的:
  • 代码的运行在 Docker 环境下,方便系统层面的隔离。

  • 由于涉及到数据库以及 Web API 等多个服务实例,因此使用 Compose 来管理整个项目的 Docker 实例。

  • 由于代码中使用了较多的环境变量,因此将环境变量剥离到单独的 env文件中,并在 docker-compose.yml 中使用 env_file 配置项来 import。

  • 不同的运行环境,使用不同的 docker-compose.yml 文件(docker-compose-dev/test/stage.yml),如下图:

    640?wx_fmt=jpeg


  • 这里的 Compose 文件里面用了一个 CODE_DIR 环境变量,因此每次在执行 docker-compose 命令之前,都需要先 export 一个 CODE_DIR 环境变量。

  • 同时为了不每次都敲很长的命令(docker-compose -f xxx.yml up xxx),我编写了一个 start.sh,大概的内容如下图:

    640?wx_fmt=jpeg


在经过上述的设计之后,期待的效果是,在同一台机器上,以如下的目录结构,进入对应的目录运行对应环境的代码:

640?wx_fmt=jpeg


即cd code_dev -> export RUN_ENV & export CODE_DIR-> 执行 start.sh 即可以运行起一个开发环境,同理类推。
至此,终于引出了进入特定目录,就载入特定环境变量的需求,于是我找到了 direnv 这个工具。


具体配置

640?wx_fmt=png


direnv 这个工具,安装配置超级简单,直接通过 Debian 8 源里面就可以安装。
安装 direnv:
# aptitude install direnv

修改~/.bashrc 增加 direnv 的 hook 到 bash 中(如果你用的是 zsh,请修改~/.zshrc):
#在最后加上一行	
eval "$(direnv hook bash)"

在需要 export 环境变量的目录下,编写一个名为 .envrc的文件,内容为需要 export 的环境变量,例如:
export COMPOSE_HTTP_TIMEOUT=200	
export CODE_DIR=/home/xiaomi/running/code_stage	
export RUN_ENV=stage

在对应目录允许 direnv 加载环境变量:
cd ~/running/code_stage	
direnv allow .

在上述配置完成后,当你 CD 进入对应目录时,会自动加载 envrc 配置文件中定义的环境变量,并给出提示,如下图:

640?wx_fmt=png


还可以通过 direnv status 命令查看当前加载的环境变量:

640?wx_fmt=jpeg


小提示

640?wx_fmt=png


每次 .envrc 文件内容有更新,都需要执行一次 direnv allow 命令重新加载。
事实上 direnv 的原理是进入某个目录,就执行一次 .envrc 文件,因此还可以通过这种行为,做更多事情,发挥更大的作用哦,例如进入某个目录就执行某个命令,如下图:
640?wx_fmt=png
大家还想到可以在什么场景下用 direnv 呢,欢迎一起探讨!
作者:何老师,网易资深运维工程师/资深运维产品设计师,参与游戏运维工作 6 年,曾运维《阴阳师》、《天下手游》等网易知名手游,并曾参与配置管理平台、chatops 平台等系统设计和开发,目前主要工作方向为运维自动化产品线产品规划,负责 CMDB、运维流程平台等运维系统功能设计,关注运维平台化、数据运营、智能运维等运维产品发展方向。


Kubernetes企业级实战训练营

640?


Kubernetes企业级实战训练营将于2019年8月30日在北京举办,3天时间带你系统掌握Kubernetes,学习效果不好可以继续学习。本次培训包括:Docker基础、容器技术、Docker镜像、数据共享与持久化、Docker三驾马车、Docker实践、Kubernetes基础、Pod基础与进阶、常用对象操作、服务发现、Helm、Kubernetes核心组件原理分析、Kubernetes服务质量保证、调度详解与应用场景、网络、基于Kubernetes的CI/CD、基于Kubernetes的配置管理等, 点击下方图片或者阅读原文链接查看详情
640?wx_fmt=jpeg
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值