Escaping percent % sign in a module

1,141 views
Skip to first unread message

Guy Matz

unread,
Jun 25, 2015, 2:09:35 PM6/25/15
to ansible-devel
Hi!  I've written a module and am bumping up against an issue when I try to include a percent sign in one of the parameters, e.g.:

  supervisor_prog:
    name: smlp-data
    user: smlp
    command: java blah-blah-blah
    environment: PATH='/usr/java/jdk1.8.0_11/bin:%(ENV_PATH)s'

Notice the % sign in the environment param above . . .  that's causing ConfigParser to choke with:
ConfigParser.InterpolationMissingOptionError: Bad value substitution:
    section: [program:smlp-data]
    option : environment
    key    : env_path
    rawval : '


the problem is with the ConfigParser module . . .  I have a supervisor config that has the line:
environment: PATH='/usr/java/jdk1.8.0_11/bin:%(ENV_PATH)s'

and ConfigParser chokes whenever it tries to process that line:
>>> from ConfigParser import SafeConfigParser
>>> c = SafeConfigParser()
>>> c.read('/etc/supervisor.d/sidecar-data')
['/etc/supervisor.d/sidecar-data']
>>> c.sections()
['program:sidecar-data']
>>> c.items('program:sidecar-data')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/lib64/python2.6/ConfigParser.py", line 578, in items
    for option in options]
  File "/usr/lib64/python2.6/ConfigParser.py", line 614, in _interpolate
    self._interpolate_some(option, L, rawval, section, vars, 1)
  File "/usr/lib64/python2.6/ConfigParser.py", line 646, in _interpolate_some
    option, section, rest, var)
ConfigParser.InterpolationMissingOptionError: Bad value substitution:
    section: [program:sidecar-data]
    option : environment
    key    : env_path
    rawval : '

I know this isn't the configparser mailing list, but I was hoping someone might have some idea of how I can get configparser to behave.

Thanks a lot!!

Jonathan Davila

unread,
Jun 29, 2015, 2:08:54 PM6/29/15
to ansibl...@googlegroups.com
Have you tried this by leveraging gathered facts?
environment:
  PATH
:"/usr/java/jdk1.8.0_11/bin:{{ansible_env.ENV_PATH}}"

Brian Coca

unread,
Jul 2, 2015, 6:10:35 PM7/2/15
to Jonathan Davila, ansibl...@googlegroups.com
So config parser tries to do python substitutions which %(anyting)s
looks like a named string, use %% to escape percent signs in this
case.

But that probably breaks your module which will try to do exactly the
same thing, so I recommend you follow Jonathan's suggestion.

--
Brian Coca
Reply all
Reply to author
Forward
0 new messages