salt执行带密码参数的rsync命令失败

Salt进程环境变量的坑

Posted by Mr.Zhou on July 11, 2018

背景

Rsync非加密传输方式不安全,需要加密传输。

问题

加密传输后的rsync命令需要添加 --password-file 参数,本机执行没有问题,但通过salt调用失败,提示权限验证失败:

@ERROR: auth failed on module test
rsync error: error starting client-server protocol (code 5) at main.c(1648) [Receiver=3.1.2]

缓解

深入研究后,了解rsync加密时读取密码内容的方式:

  • 从–password-file文件中读取密码内容
  • 从环境变量中读取密码内容 无论哪种方式,都将赋值给系统变量,供rsync程序调用,而salt的工作方式要求必须手工指定环境变量后,rsync才能正常获取密码内容。

当发现这个问题的时候,第一直觉就是环境变量的问题,但当真正分析的时候并没有立即往这方面细想,还认为是salt的功能问题,分别在论坛上提了问题:

  • Stack Overflow: rsync auth failed when executed by salt. Link
  • Github: #48517

但后面仔细想了想,rsync和salt本身应该都没有问题,排查可能的问题后,只剩下环境变量的坑了。

果然,最后单独用salt状态模块 salt.states.environ 定义环境变量 USERRSYNC_PASSWORD 后,问题得到缓解。

后记

虽然当前基本功能可用,但还有个很严重的问题,salt文档上说,环境变量只对当前进程有效,若真是如此,salt-minion进程挂掉后,必须再对环境变量进行赋值,否则又将失败。

Support for getting and setting the environment variables of the current salt process. Link

针对这个问题,后期还需要进行测试。