2016-12-13 1 views
0

J'ai créé un script shell pour installer rbenv sur une nouvelle machine virtuelle, tout le monde semble bien fonctionner, cependant, il semble que rbenv ne parvienne pas à s'installer. Je voudrais ajouter quelques vérifications d'erreur supplémentaires tout au long du processus pour m'assurer que l'installation a bien lieu, et si quelque chose a échoué, redémarrer l'installation.Installation de rbenv via le script shell

Quelques notes:

  • Ceci est une petite partie d'un script plus
  • Cela se fait par le biais whiptail dialogue
  • Je redirigeant la sortie vers un fichier events.log >&$log_fd...

C'est ce que j'ai actuellement:

set_rbenv(){ 
    # install rbenv 
    RUBY_VERSION="2.1.4" 
    RBENV_ROOT="/root/.rbenv" 
    PROFILE="/root/.bashrc" 

    # check if rbenv is installed 
    if [[ ! `which rbenv` ]]; then 

    if [[ ! -d "$RBENV_ROOT" ]]; then 
     echo "Cloning rbenv..." >&$log_fd 2>&1 
     git clone https://github.com/rbenv/rbenv.git $RBENV_ROOT >&$log_fd 2>&1 
    fi 

    if [[ ! -d "$RBENV_ROOT/plugins/ruby-build" ]]; then 
     git clone https://github.com/rbenv/ruby-build.git $RBENV_ROOT/plugins/ruby-build >&$log_fd 2>&1 
    fi 

    if [[ ! `grep -e '/.rbenv\/bin' $PROFILE` ]]; then 
     echo "rbenv not in PATH ... adding..." >&$log_fd 2>&1 
     echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> $PROFILE 2>&1 
    fi 
    if [[ ! `grep -e '^\eval "$(rbenv init -)"' $PROFILE` ]]; then 
     echo "rbenv init not in .bashrc... adding..." >&$log_fd 2>&1 
     echo 'eval "$(rbenv init -)"' >> $PROFILE 2>&1 
    fi 
    . $PROFILE 
    echo "Finished Installing rbenv..." >&$log_fd 2>&1 
    else 
    echo "rbenv already installed... skipping!" >&$log_fd 2>&1 
    fi 

    if [ ! -d "$RBENV_ROOT/versions" ]; then 
    echo "$RBENV_ROOT/versions doesn't exist ... creating..." 
    mkdir $RBENV_ROOT/versions >&$log_fd 2>&1 
    fi 

    if [ ! -d "$RBENV_ROOT/versions/$RUBY_VERSION" ]; then 
    echo "$RBENV_ROOT/versions/$RUBY_VERSION doesn't exist ... creating..." >&$log_fd 2>&1 
    mkdir $RBENV_ROOT/versions/$RBENV_VERSION >&$log_fd 2>&1 
    fi 

    # check if ruby version is installed 
    if [[ ! `rbenv version | grep $RUBY_VERSION` ]]; then 
    echo "installing ruby 2.1.4" >&$log_fd 2>&1 
    rbenv install $RUBY_VERSION >&$log_fd 2>&1 
    rbenv global $RUBY_VERSION >&$log_fd 2>&1 

    if [ ! -d "$RBENV_ROOT/versions/$RUBY_VERSION/etc" ]; then 
     echo "$RBENV_ROOT/versions/$RUBY_VERSION/etc doesn't exist ... creating..." >&$log_fd 2>&1 
     mkdir $RBENV_ROOT/versions/$RUBY_VERSION/etc >&$log_fd 2>&1 
    fi 

    else 
    echo "ruby $RUBY_VERSION already exists... skipping!" >&$log_fd 2>&1 
    fi 
    ((STATUS += 35)) 
    echo $STATUS 
} 

Alors que l'installation elle-même peut échouer à tout moment sur la nouvelle machine virtuelle, je suis foutue si rbenv installe, mais rien d'autre ne (comme Ruby-build) ou $ PATH, etc.

Ne serait-il plus de sens pour encapsuler chaque commande dans sa propre instruction if en dehors de la if which rbenv initiale, ou existe-t-il un moyen plus robuste de s'assurer que l'installation se termine avec succès?

Répondre

1

Vous pouvez réellement effectuer cette tâche plus facilement en utilisant des outils de gestion de configuration tels que Ansible, marionnette ou Chef. Au lieu d'essayer de spécifier "comment" vérifier et utiliser une instruction IF sans fin, vous pouvez spécifier "quoi" pour vérifier et utiliser le framework existant pour le faire.

Par exemple, vous pouvez spécifier Ansible mettre à jour le cache & installer la dernière version de foo en utilisant le module apt:

- hosts: all 
    remote_user: root 
    tasks: 
    - name: Install the package foo 
    apt: 
     name: foo 
     state: present 
     update_cache: yes 

More information