记saltstack插件的一个坑

环境

  • Jenkins:2.7.4
  • SaltStack: 2017.7.1
  • SaltStack Plugin:3.1.4、3.1.6

问题现象

当使用local_batch作为客户端接口实现滚动执行时,jenkins中salt插件请求salt-api返回500错误

问题定位

1. 手动调用salt-api 通过命令行使用curl调salt-api测试

登录获取token

# curl -sSk 'http://ip/login' -H 'Accept: application/x-yaml' -d username=user -d password=pass -d eauth=pam

调用salt-api执行命令

# curl -sSk http://ip/ -H 'Accept: application/x-yaml' -H 'X-Auth-Token:c5bb0001df331ac0f9fa4123141b39fed2eb441a' -d client=local_batch -d tgt='server1,server2' -d tgt_type='list' -d batch=50% -d fun=cmd.run -d arg="whoami"

2. 问题分析 测试后发现通过命令行是可以的,但是通过jenkins中的salt插件就是不行

所以问题很大可能跟salt-api没关,于是抓包分析salt插件发出的http请求,以及命令行的请求有什么不同

最终发现抓包后发现两者的请求参数有些差异,salt插件的参数是用expr_form字段标识类型的

{"client":"local_batch","tgt":"server,iZ947mgy3c5Z","expr_form":"list","batch":"50%","fun":"cmd.run","arg":"whoami"}

网上查询下有关expr_form参数,发现这个参数不支持的,应该用tgt_type参数替代它,下面是原话

The target type should be passed using the 'tgt_type' argument instead of 'expr_form'. Support for using 'expr_form' will be removed in Salt Fluorine.

3. 确认问题 为了进一步确认问题,我把salt插件hpi文件下载下来,然后解压hpi,salt插件主要就是这个jar

➜  salt ls
help-blockbuild.html  help-minionTimeout.html  META-INF  WEB-INF
➜  salt ls -al WEB-INF/lib/saltstack.jar 
-rw-r--r-- 1 root root 68995 Mar 16 19:25 WEB-INF/lib/saltstack.jar

通过procyon-decompiler反编译后,定位到发出http请求的那个java文件

# java -jar procyon-decompiler-0.5.30.jar -o . saltstack.jar
# grep -R -n --color "expr_form" ./*                               
./com/waytta/SaltAPIBuilder.java:337:                saltFunc.put("expr_form", (Object)this.getTargettype());
./com/waytta/SaltAPIBuilder.java:346:                saltFunc.put("expr_form", (Object)this.getTargettype());
./com/waytta/SaltAPIBuilder.java:367:                saltFunc.put("expr_form", (Object)this.getTargettype());

本来到这就以为离成功就差一步了,但是还是碰到了小坎儿,如果将反编译的代码编译回去,擦~ 这有点恶心了,我很久没有用javac编译过java代码了,现在都是用maven,搞的优点忘了javac该怎么用了,硬着头皮搞了半天,一直报错

问题解决

最终,忽然想到这插件是开源的,那github上肯定有源代码啊,于是到jenkins插件首页,在salt插件的详情中找到了项目的地址,最终果然找到了,https://github.com/jenkinsci/saltstack-plugin.git,看了下SaltAPIBuilder.java这个文件,果然是expr_form

接下来就比较简单了,拉代码,改代码,修改maven配置,执行mvn install编译打包

拉、改代码

# git clone https://github.com/jenkinsci/saltstack-plugin.git
# sed -r -i s/expr_form/tgt_type/g src/main/java/com/waytta/SaltAPIBuilder.java

修改maven配置,添加jenkins插件相关

<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
          xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">

  <localRepository>/root/.m2/repository</localRepository>
  <pluginGroups>
    <pluginGroup>org.jenkins-ci.tools</pluginGroup> 
  </pluginGroups>
  <profiles>
    <profile>
      <id>jenkins</id>
      <activation>
        <activeByDefault>true</activeByDefault> 
      </activation>
      <repositories> 
        <repository>
          <id>repo.jenkins-ci.org</id>
          <url>https://repo.jenkins-ci.org/public/</url>
        </repository>
      </repositories>
      <pluginRepositories>
        <pluginRepository>
          <id>repo.jenkins-ci.org</id>
          <url>https://repo.jenkins-ci.org/public/</url>
        </pluginRepository>
      </pluginRepositories>
    </profile>
  </profiles>
  <mirrors>
  </mirrors>
</settings>

编译打包,顺利的话,会在target中看到saltstack.hpi,下载下来,然后通过jenkins管理插件上传安装即可

# mvn install -DskipTests

results matching ""

    No results matching ""