线上事故-sudo环境变量
项目部署
项目部署的时候,为了控制权限. 会为项目单独创建一个用户, 来运行项目.
并且会该用户添加某些权限, 如sudo
事故内容
最近做了项目迁移, 用户、代码、环境都是整体迁移的。 没有遗漏。
但是突然发现某个业务的数据没有走系统的自动处理脚本。
于是开始定位问题, 查看代码git历史, 测试代码功能。 发现都是没有问题的。
事故原因
最后,突然想到,项目的配置文件, 是通过某一个自定义环境变量来选择的。
如开发环境、测试环境、正式环境。
于是就在线上的脚本,打印了一下, 获取的环境变量。
哎~~ 问题出来了,环境变量获取失败, 程序默认当前为测试环境,走的测试环境配置。
所以导致脚本执行无效。
那为什么会导致这个问题呢?
于是写了简单的测试脚本, 获取环境变量并打印。
刚开始, 直接执行脚本, 发现是正常的, 问题并没有复现。
于是各种测试,各种修改, 还是没有复现。
偶然的一次执行, 带上了sudo。
问题复现了。 于是确定就是sudo导致的, 环境变量读取不到。
最后在网上找到这么一个解释:
Linux为了保证安全,sudo 执行时, 会创建一个小的执行环境。
在这个执行环境中, 只保留了, 一些必要的环境变量。
所以就导致,sudo中获取自定义环境变量失败。
事故解决方案
解决方案:
1. 编辑文件 /etc/sudousers
修改 Default env_reset
为 Default !env_reset
这个意思就是, 生成sudo执行环境时,将用户当前环境变量保留, 不进行重置
缺点
: 个人认为, 这个方案, 违背了用户权限控制的初衷。 由于对Linux不是很熟悉, 所以暂时没想到很好的例子
2. 编辑文件 /etc/sudousers
添加 Defaults env_keep += '你的环境变量名称'
如, 我在/etc/profile 里面配置了一个环境变量 export test_env='cwx_test'
你需要添加的内容为: Defaults env_keep+='test_env'
> 多个环境变量之间, 用空格分隔
个人认为, 这个方案比较好,针对性的进行设置环境变量,延续了控制用户权限的初衷。