diff --git a/examples/ansible.cfg b/examples/ansible.cfg index 49da6f098db..bf65706775c 100644 --- a/examples/ansible.cfg +++ b/examples/ansible.cfg @@ -143,6 +143,20 @@ ansible_managed = Ansible managed: {file} on {host} # set to 1 if you don't want cowsay support or export ANSIBLE_NOCOWS=1 #nocows = 1 +# set which cowsay stencil you'd like to use by default. When set to 'random', +# a random stencil will be selected for each task. The selection will be filtered +# against the `cow_whitelist` option below. +#cow_selection = default +#cow_selection = random + +# when using the 'random' option for cowsay, stencils will be restricted to this list. +# it should be formatted as a comma-separated list with no spaces between names. +# NOTE: line continuations here are for formatting purposes only, as the INI parser +# in python does not support them. +#cow_whitelist=bud-frogs,bunny,cheese,daemon,default,dragon,elephant-in-snake,elephant,eyes,\ +# hellokitty,kitty,luke-koala,meow,milk,moofasa,moose,ren,sheep,small,stegosaurus,\ +# stimpy,supermilker,three-eyes,turkey,turtle,tux,udder,vader-koala,vader,www + # don't like colors either? # set to 1 if you don't want colors, or export ANSIBLE_NOCOLOR=1 #nocolor = 1 diff --git a/lib/ansible/constants.py b/lib/ansible/constants.py index 3d985d0f3dc..642f8343d27 100644 --- a/lib/ansible/constants.py +++ b/lib/ansible/constants.py @@ -115,6 +115,12 @@ active_user = pwd.getpwuid(os.geteuid())[0] # group variables -- really anything we can load YAML_FILENAME_EXTENSIONS = [ "", ".yml", ".yaml", ".json" ] +# the default whitelist for cow stencils +DEFAULT_COW_WHITELIST = ['bud-frogs', 'bunny', 'cheese', 'daemon', 'default', 'dragon', 'elephant-in-snake', 'elephant', + 'eyes', 'hellokitty', 'kitty', 'luke-koala', 'meow', 'milk', 'moofasa', 'moose', 'ren', 'sheep', + 'small', 'stegosaurus', 'stimpy', 'supermilker', 'three-eyes', 'turkey', 'turtle', 'tux', 'udder', + 'vader-koala', 'vader', 'www',] + # sections in config file DEFAULTS='defaults' @@ -210,6 +216,8 @@ CACHE_PLUGIN_TIMEOUT = get_config(p, DEFAULTS, 'fact_caching_timeout', ANSIBLE_FORCE_COLOR = get_config(p, DEFAULTS, 'force_color', 'ANSIBLE_FORCE_COLOR', None, boolean=True) ANSIBLE_NOCOLOR = get_config(p, DEFAULTS, 'nocolor', 'ANSIBLE_NOCOLOR', None, boolean=True) ANSIBLE_NOCOWS = get_config(p, DEFAULTS, 'nocows', 'ANSIBLE_NOCOWS', None, boolean=True) +ANSIBLE_COW_SELECTION = get_config(p, DEFAULTS, 'cow_selection', 'ANSIBLE_COW_SELECTION', 'default') +ANSIBLE_COW_WHITELIST = get_config(p, DEFAULTS, 'cow_whitelist', 'ANSIBLE_COW_WHITELIST', DEFAULT_COW_WHITELIST, islist=True) DISPLAY_SKIPPED_HOSTS = get_config(p, DEFAULTS, 'display_skipped_hosts', 'DISPLAY_SKIPPED_HOSTS', True, boolean=True) DEFAULT_UNDEFINED_VAR_BEHAVIOR = get_config(p, DEFAULTS, 'error_on_undefined_vars', 'ANSIBLE_ERROR_ON_UNDEFINED_VARS', True, boolean=True) HOST_KEY_CHECKING = get_config(p, DEFAULTS, 'host_key_checking', 'ANSIBLE_HOST_KEY_CHECKING', True, boolean=True) diff --git a/lib/ansible/utils/display.py b/lib/ansible/utils/display.py index 88e1a568047..c91f4f83db0 100644 --- a/lib/ansible/utils/display.py +++ b/lib/ansible/utils/display.py @@ -76,9 +76,15 @@ class Display: self._errors = {} self.cowsay = None - self.noncow = os.getenv("ANSIBLE_COW_SELECTION",None) + self.noncow = C.ANSIBLE_COW_SELECTION + self.set_cowsay_info() + if self.cowsay: + cmd = subprocess.Popen([self.cowsay, "-l"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) + (out, err) = cmd.communicate() + self.cows_available = list(set(C.ANSIBLE_COW_WHITELIST).intersection(out.split())) + self._set_column_width() def set_cowsay_info(self): @@ -95,13 +101,6 @@ class Display: # MacPorts path for cowsay self.cowsay = "/opt/local/bin/cowsay" - if self.cowsay and self.noncow == 'random': - cmd = subprocess.Popen([self.cowsay, "-l"], stdout=subprocess.PIPE, stderr=subprocess.PIPE) - (out, err) = cmd.communicate() - cows = out.split() - cows.append(False) - self.noncow = random.choice(cows) - def display(self, msg, color=None, stderr=False, screen_only=False, log_only=False): """ Display a message to the user @@ -239,8 +238,11 @@ class Display: msg = msg[:-1] runcmd = [self.cowsay,"-W", "60"] if self.noncow: + thecow = self.noncow + if thecow == 'random': + thecow = random.choice(self.cows_available) runcmd.append('-f') - runcmd.append(self.noncow) + runcmd.append(thecow) runcmd.append(msg) cmd = subprocess.Popen(runcmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) (out, err) = cmd.communicate()