9

When deploying a chef-solo setup you need to switch between using sudo or not eg:

    bash install.sh  

and

    sudo bash install.sh

Depending on the distro on the host server. How can this be automated?

offwhite
  • 552
  • 1
  • 4
  • 9

2 Answers2

28

ohai already populates these attributes and are readily available in your recipe for example,

"platform": "centos",
"platform_version": "6.4",
"platform_family": "rhel",

you can reference to these as

 if node[:platform_family].include?("rhel")
    ...
 end

To see what other attributes ohai sets, just type

 ohai

on the command line.

Litmus
  • 10,558
  • 6
  • 29
  • 44
0

You can detect the distro on the remote host and deploy accordingly. in deploy.sh:

DISTRO=`ssh -o 'StrictHostKeyChecking no' ${host} 'bash -s' < bootstrap.sh`

The DISTRO variable is populated by whatever is echoed by the bootstrap.sh script, which is run on the host machine. So we can now use bootstrap.sh to detect the distro or any other server settings we need to and echo, which will be bubbled to the local script and you can respond accordingly.

example deploy.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

example 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

This will allow you to detect the platform very early in the deploy process.

offwhite
  • 552
  • 1
  • 4
  • 9