Modify the way we set the localization environment

Previously, we set the LANG (and LC_CTYPE) environment variables
directly in the module code and applied them with os.environ().
Instead, we are now pre-pending those variables to the environment
string used to execute the command which allows the user to
override the localization values by setting the environment values
directly (even on a per-task basis):

  - subversion: repo=file:///path/to/repos/svn_über dest=/tmp/svntest
    environment:
      LANG: "C"
      LC_CTYPE: "en_US.UTF-8"

So if a user wishes to default their LANG back to C, they can still
avoid unicode issues by doing the above.

Fixes #7060
pull/7243/head
James Cammarata 11 years ago
parent 40a7a306f5
commit 54b1f820fb

@ -28,7 +28,6 @@ from ansible import constants as C
REPLACER = "#<<INCLUDE_ANSIBLE_MODULE_COMMON>>" REPLACER = "#<<INCLUDE_ANSIBLE_MODULE_COMMON>>"
REPLACER_ARGS = "\"<<INCLUDE_ANSIBLE_MODULE_ARGS>>\"" REPLACER_ARGS = "\"<<INCLUDE_ANSIBLE_MODULE_ARGS>>\""
REPLACER_LANG = "\"<<INCLUDE_ANSIBLE_MODULE_LANG>>\""
REPLACER_COMPLEX = "\"<<INCLUDE_ANSIBLE_MODULE_COMPLEX_ARGS>>\"" REPLACER_COMPLEX = "\"<<INCLUDE_ANSIBLE_MODULE_COMPLEX_ARGS>>\""
class ModuleReplacer(object): class ModuleReplacer(object):
@ -140,12 +139,10 @@ class ModuleReplacer(object):
encoded_args = repr(module_args.encode('utf-8')) encoded_args = repr(module_args.encode('utf-8'))
except UnicodeDecodeError: except UnicodeDecodeError:
encoded_args = repr(module_args) encoded_args = repr(module_args)
encoded_lang = repr(C.DEFAULT_MODULE_LANG)
encoded_complex = repr(complex_args_json) encoded_complex = repr(complex_args_json)
# these strings should be part of the 'basic' snippet which is required to be included # these strings should be part of the 'basic' snippet which is required to be included
module_data = module_data.replace(REPLACER_ARGS, encoded_args) module_data = module_data.replace(REPLACER_ARGS, encoded_args)
module_data = module_data.replace(REPLACER_LANG, encoded_lang)
module_data = module_data.replace(REPLACER_COMPLEX, encoded_complex) module_data = module_data.replace(REPLACER_COMPLEX, encoded_complex)
if module_style == 'new': if module_style == 'new':
@ -154,7 +151,6 @@ class ModuleReplacer(object):
facility = inject['ansible_syslog_facility'] facility = inject['ansible_syslog_facility']
module_data = module_data.replace('syslog.LOG_USER', "syslog.%s" % facility) module_data = module_data.replace('syslog.LOG_USER', "syslog.%s" % facility)
lines = module_data.split("\n") lines = module_data.split("\n")
shebang = None shebang = None
if lines[0].startswith("#!"): if lines[0].startswith("#!"):

@ -30,7 +30,6 @@
# == BEGIN DYNAMICALLY INSERTED CODE == # == BEGIN DYNAMICALLY INSERTED CODE ==
MODULE_ARGS = "<<INCLUDE_ANSIBLE_MODULE_ARGS>>" MODULE_ARGS = "<<INCLUDE_ANSIBLE_MODULE_ARGS>>"
MODULE_LANG = "<<INCLUDE_ANSIBLE_MODULE_LANG>>"
MODULE_COMPLEX_ARGS = "<<INCLUDE_ANSIBLE_MODULE_COMPLEX_ARGS>>" MODULE_COMPLEX_ARGS = "<<INCLUDE_ANSIBLE_MODULE_COMPLEX_ARGS>>"
BOOLEANS_TRUE = ['yes', 'on', '1', 'true', 1] BOOLEANS_TRUE = ['yes', 'on', '1', 'true', 1]
@ -191,8 +190,6 @@ class AnsibleModule(object):
if k not in self.argument_spec: if k not in self.argument_spec:
self.argument_spec[k] = v self.argument_spec[k] = v
os.environ['LANG'] = MODULE_LANG
os.environ['LC_CTYPE'] = MODULE_LANG
(self.params, self.args) = self._load_params() (self.params, self.args) = self._load_params()
self._legal_inputs = ['CHECKMODE', 'NO_LOG'] self._legal_inputs = ['CHECKMODE', 'NO_LOG']

@ -287,15 +287,21 @@ class Runner(object):
def _compute_environment_string(self, inject=None): def _compute_environment_string(self, inject=None):
''' what environment variables to use when running the command? ''' ''' what environment variables to use when running the command? '''
if not self.environment: default_environment = collections.OrderedDict([
return "" ('LANG', C.DEFAULT_MODULE_LANG),
enviro = template.template(self.basedir, self.environment, inject, convert_bare=True) ('LC_CTYPE', C.DEFAULT_MODULE_LANG),
enviro = utils.safe_eval(enviro) ])
if type(enviro) != dict:
raise errors.AnsibleError("environment must be a dictionary, received %s" % enviro) if self.environment:
enviro = template.template(self.basedir, self.environment, inject, convert_bare=True)
enviro = utils.safe_eval(enviro)
if type(enviro) != dict:
raise errors.AnsibleError("environment must be a dictionary, received %s" % enviro)
default_environment.update(enviro)
result = "" result = ""
for (k,v) in enviro.iteritems(): for (k,v) in default_environment.iteritems():
result = "%s=%s %s" % (k, pipes.quote(unicode(v)), result) result = "%s %s=%s" % (result, k, pipes.quote(unicode(v)))
return result return result
# ***************************************************** # *****************************************************

Loading…
Cancel
Save