Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to make Fabric continue running the next command after getting the exit status: 1?

I'm going to install check_mk plugin by writing a simple fabfile like this:

from fabric.api import env, run, roles, execute, parallel

env.roledefs = {
    'monitoring': ['192.168.3.118'],
    'mk-agent': ['192.168.3.230', '192.168.3.231', '192.168.3.232']
}

@roles('monitoring')
def mk():
    run('[ -f check_mk-1.1.12p7.tar.gz ] || wget http://mathias-kettner.de/download/check_mk-1.1.12p7.tar.gz')
    run('[ -d check_mk-1.1.12p7 ] || tar zxvf check_mk-1.1.12p7.tar.gz')
    run('cd check_mk-1.1.12p7 && sudo ./setup.sh')

@parallel    
@roles('mk-agent')
def mk_agent():
    run('[ `rpm -qa | grep -c xinetd` -eq 0 ] && sudo yum -y install xinetd.x86_64')
    run('sudo rpm -ivh http://mathias-kettner.de/download/check_mk-agent-1.2.0b2-1.noarch.rpm') 

def check_mk():
    execute(mk)
    execute(mk_agent)

But, as you can guess, if the xinetd package is already installed, Fabric will be stopped with below errors:

Fatal error: run() received nonzero return code 1 while executing!

Requested: [ `rpm -qa | grep -c xinetd` -eq 0 ] && sudo yum -y install xinetd.x86_64
Executed: /bin/bash -l -c "[ \`rpm -qa | grep -c xinetd\` -eq 0 ] && sudo yum -y install xinetd.x86_64"

Aborting.

Is there any solution in this situation?

like image 235
quanta Avatar asked Apr 18 '12 10:04

quanta


People also ask

What does exit status 1 mean?

What is Exit Code 1. Exit Code 1 indicates that a container shut down, either because of an application failure or because the image pointed to an invalid file. In a Unix/Linux operating system, when an application terminates with Exit Code 1, the operating system ends the process using Signal 7, known as SIGHUP.

What is fabric command?

Fabric is a Python library and command-line tool for streamlining the use of SSH for application deployment or systems administration tasks. Fabric is very simple and powerful and can help to automate repetitive command-line tasks. This approach can save time by automating your entire workflow.


3 Answers

since stackoverflow doesn't let me upvote Morgan's answer without more rep, I'll contribute more detail from http://docs.fabfile.org/en/1.4.1/api/core/context_managers.html#fabric.context_managers.settings

Outside the 'with settings' in the code below, behaviour will return to normal :

def my_task():
    with settings(
        hide('warnings', 'running', 'stdout', 'stderr'),
        warn_only=True
    ):
        if run('ls /etc/lsb-release'):
            return 'Ubuntu'
        elif run('ls /etc/redhat-release'):
            return 'RedHat'

This is desirable since you can essentially 'catch' what would've been an error in one section without it being fatal, but leave errors fatal elsewhere.

like image 128
pacifist Avatar answered Sep 27 '22 18:09

pacifist


Perhaps in 2020 it will be useful. In Fabric 2.5, you just need to add the warn=True to the command to avoid interruption.

For example: connection.run('test -f /path/to/file && tail /path/to/file, warn=True)

like image 43
foske Avatar answered Sep 27 '22 17:09

foske


You simply need to add "env.warn_only = True" to the def mk_agent(): task.

like image 45
Brian Carpio Avatar answered Sep 27 '22 17:09

Brian Carpio