部署 chef-solo 设置时,您需要在使用 sudo 或不使用之间切换,例如:
bash install.sh
和
sudo bash install.sh
取决于主机服务器上的发行版。如何实现自动化?
ohai 已经填充了这些属性,并且可以在您的食谱中轻松使用,例如,
"platform": "centos",
"platform_version": "6.4",
"platform_family": "rhel",
您可以将这些引用为
if node[:platform_family].include?("rhel")
...
end
要查看 ohai 设置的其他属性,只需键入
ohai
在命令行上。
您可以检测远程主机上的发行版并进行相应的部署。在 deploy.sh 中:
DISTRO=`ssh -o 'StrictHostKeyChecking no' ${host} 'bash -s' < bootstrap.sh`
DISTRO 变量由在主机上运行的 bootstrap.sh 脚本回显的任何内容填充。所以我们现在可以使用 bootstrap.sh 来检测发行版或我们需要的任何其他服务器设置并回显,这将冒泡到本地脚本,您可以做出相应的响应。
示例部署.sh:
#!/bin/bash
# Usage: ./deploy.sh [host]
host="${1}"
if [ -z "$host" ]; then
echo "Please provide a host - eg: ./deploy root@my-server.com"
exit 1
fi
echo "deploying to ${host}"
# The host key might change when we instantiate a new VM, so
# we remove (-R) the old host key from known_hosts
ssh-keygen -R "${host#*@}" 2> /dev/null
# rough test for what distro the server is on
DISTRO=`ssh -o 'StrictHostKeyChecking no' ${host} 'bash -s' < bootstrap.sh`
if [ "$DISTRO" == "FED" ]; then
echo "Detected a Fedora, RHEL, CentOS distro on host"
tar cjh . | ssh -o 'StrictHostKeyChecking no' "$host" '
rm -rf /tmp/chef &&
mkdir /tmp/chef &&
cd /tmp/chef &&
tar xj &&
bash install.sh'
elif [ "$DISTRO" == "DEB" ]; then
echo "Detected a Debian, Ubuntu distro on host"
tar cj . | ssh -o 'StrictHostKeyChecking no' "$host" '
sudo rm -rf ~/chef &&
mkdir ~/chef &&
cd ~/chef &&
tar xj &&
sudo bash install.sh'
fi
例如 bootstrap.sh:
#!/bin/bash
# Fedora/RHEL/CentOS distro
if [ -f /etc/redhat-release ]; then
echo "FED"
# Debian/Ubuntu
elif [ -r /lib/lsb/init-functions ]; then
echo "DEB"
fi
这将允许您在部署过程的早期检测到平台。