在Chef中,我需要发现所有正在运行的实例。为此,我用bash脚本创建了ruby块,这是有效的。但是有人告诉我,这项工作应该在没有使用shell脚本的情况下使用Ohai插件完成。有人可以提供一些提示,如何使用Ruby和Ohai插件实现这一点,因为我对此一无所知。下面你可以看到bash脚本部分。
#!/bin/bash
result=$(ps -ef|grep "mysqld"|grep -v grep|awk '{print $8}')
if [ -z "${result}" ] ; then
echo "no_instances"
exit 0
else
OIFS=$IFS
IFS=$'\n'
for i in $(ps -ef|grep "mysqld"|grep -v grep); do
if [[ $(`echo $i|awk '{print $8}'` --version) == *"MariaDB"* ]]; then
instance=$(echo $i|awk '{print $1}')
getent passwd ${instance} |cut -d':' -f1
fi
done
IFS=$OIFS
fi
我已经在ruby中编辑了我的代码,但我怀疑通过这种方式我可以在Ohai插件下添加它。你能建议吗?
result = `ps -ef|grep "mysqld"|grep -v grep|awk '{print $1 , $8}'`
if result and result != ""
result.each do |line|
cmd = `#{line.split(" ")[1].chomp + " --version\n"}`
if cmd != "" and cmd.include? "MariaDB"
print `getent passwd #{line.split("/")[0]} |cut -d':' -f1`
end
end
else
exit
end
我试着写一下Ohai插件,如果有人可以调查并提出错误或如何调整它,那将会很棒:
Ohai.plugin(:Mariadb_instances) do
provides 'Mariadb_instances'
collect_data(:linux) do
Mariadb_instances Mash.new
result = `ps -ef|grep "mysqld"|grep -v grep|awk '{print $1 , $8}'`
if result and result != ""
result.each do |entry|
cmd = `#{entry.split(" ")[1].chomp + " --version\n"}`
if cmd != "" and cmd.include? "MariaDB"
Mariadb_instances[`hostname`] = `getent passwd #{entry.split("/")[0]} |cut -d':' -f1` # [`hostname`] can be removed if chef provides it by default
end
end
else
Chef::Log.debug("MariaDB is not found")
end
end
end