/sofa

执行 shell 以及命令行应用 并收集其输出结果

Primary LanguageGoApache License 2.0Apache-2.0

sofa

sofa主要用于执行 shell 以及命令行应用 并收集其输出结果(Console Stdout)并存储到Redis,便于后续处理(Logstash), 弥补filebeat只能收集log文件,无法收集控制台输出的问题,也可以通过Redis任务队列来接受命令执行并处理结果

主要有以下几个命令:

  • sofa: 通过linux管道接受shell 以及命令行应用 的输出结果,通过 unix socket 发送给sofa server来处理并存储到Redis

    e.g:

      docker ps | sofa -p docker -c ps -t 001
    
  • sofa exec: 直接执行一条命令并获取输出结果,通过 unix socket 发送给sofa server来处理并存储到Redis

    e.g:

      sofa exec "docker ps" -p docker -c ps -t 001
    
  • sofa server: 启动一个后台服务,该服务有如下两个作用:

    1. 监听unix socket,接受sofa发送过来到数据
    2. 监听 redis 任务队列,执行并处理结果

build

make clean && make build 

or

go build -o ./bin/sofa ./main.go

run

   docker run -d -p 6379:6379 --name=redis redis
   sofa server -c ./sofa.yaml

usage

1. start server

sofa server -c ./sofa.yaml

2. collect data

  • 使用管道符收集收据
bjobs -W | sofa --platform=LSF --command=bjobs --tid=001
  • 使用exec直接执行命令获取数据
sofa exec 'bjobs -W' -u test01 -t 001 -p lsf -c bjobs

3. 通过redis执行命令

可以向 redis calls 队列中发送消息,给sofa server来处理

消息结构:

{
	"TID": "001",
	"Platform": "docker",
	"Command": "info",
	"FullCommand": "docker info"
}

发送消息:

lpush calls "{\"TID\":\"001\",\"Platform\":\"docker\",\"Command\":\"info\",\"FullCommand\":\"docker info\"}"

4.处理结果示例:

{
	"TID": "001",
	"Platform": "docker",
	"Command": "ps",
	"FullCommand": "docker ps",
	"ExitStatus": 0,
	"Stdout": [
		"CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                               NAMES",
		"44cf62dfc507        redis               \"docker-entrypoint.s…\"   43 seconds ago      Up 41 seconds       0.0.0.0:6379->6379/tcp              redis",
		"5765e68f63e1        mysql               \"docker-entrypoint.s…\"   3 months ago        Up 2 days           0.0.0.0:3306->3306/tcp, 33060/tcp   mysql"
	],
	"Stderr": null,
	"Username": "shumin",
	"SubmitTime": "2019-10-11T01:16:15.050761+08:00",
	"StartTime": "2019-10-11T01:16:15.0509+08:00",
	"EndTime": "2019-10-11T01:16:15.134961+08:00"
}