salt icon indicating copy to clipboard operation
salt copied to clipboard

salt-ssh `salt.grains.get()` raises `TypeError: get() missing 1 required positional argument: 'default'` [BUG]

Open jbartak opened this issue 2 years ago • 2 comments

Description When I call:

  {% if 'opensips' in salt.grains.get('roles') %}
  foo: bar
  {% endif %}

This is raised:

TypeError: get() missing 1 required positional argument: 'default'
Click to expand!
$ sudo salt-ssh 1.dummy.global-devel state.apply bootstrap test=true
[ERROR   ] Rendering exception occurred
Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/salt/utils/templates.py", line 500, in render_jinja_tmpl
    output = template.render(**decoded_context)
  File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 1090, in render
    self.environment.handle_exception()
  File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "/usr/lib/python3.6/site-packages/jinja2/_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "<template>", line 35, in top-level template code
  File "/usr/lib/python3.6/site-packages/jinja2/sandbox.py", line 462, in call
    return __context.call(__obj, *args, **kwargs)
TypeError: get() missing 1 required positional argument: 'default'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/salt/utils/templates.py", line 262, in render_tmpl
    output = render_str(tmplstr, context, tmplpath)
  File "/usr/lib/python3.6/site-packages/salt/utils/templates.py", line 546, in render_jinja_tmpl
    "Jinja error: {}{}".format(exc, out), line, tmplstr, trace=tracestr
salt.exceptions.SaltRenderError: Jinja error: get() missing 1 required positional argument: 'default'
Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/salt/utils/templates.py", line 500, in render_jinja_tmpl
    output = template.render(**decoded_context)
  File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 1090, in render
    self.environment.handle_exception()
  File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "/usr/lib/python3.6/site-packages/jinja2/_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "<template>", line 35, in top-level template code
  File "/usr/lib/python3.6/site-packages/jinja2/sandbox.py", line 462, in call
    return __context.call(__obj, *args, **kwargs)
TypeError: get() missing 1 required positional argument: 'default'

; line 35

---
[...]
        {% endif %}
        {% endwith %}
        {% endwith %}
        {% endif %}
        master_finger: {{ salt.key.finger_master() }}
        {% if 'opensips' in salt.grains.get('roles') %}    <======================
        mysql.default_file: /root/.my.cnf
        {% endif %}
    - formatter: yaml
    - merge_if_exists: true
    - makedirs: true
[...]
---
[CRITICAL] Rendering SLS 'base:salt.salt-minion' failed: Jinja error: get() missing 1 required positional argument: 'default'
Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/salt/utils/templates.py", line 500, in render_jinja_tmpl
    output = template.render(**decoded_context)
  File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 1090, in render
    self.environment.handle_exception()
  File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "/usr/lib/python3.6/site-packages/jinja2/_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "<template>", line 35, in top-level template code
  File "/usr/lib/python3.6/site-packages/jinja2/sandbox.py", line 462, in call
    return __context.call(__obj, *args, **kwargs)
TypeError: get() missing 1 required positional argument: 'default'

; line 35

---
[...]
        {% endif %}
        {% endwith %}
        {% endwith %}
        {% endif %}
        master_finger: {{ salt.key.finger_master() }}
        {% if 'opensips' in salt.grains.get('roles') %}    <======================
        mysql.default_file: /root/.my.cnf
        {% endif %}
    - formatter: yaml
    - merge_if_exists: true
    - makedirs: true
[...]
---
1.dummy.global-devel:
    - Rendering SLS 'base:salt.salt-minion' failed: Jinja error: get() missing 1 required positional argument: 'default'
      Traceback (most recent call last):
        File "/usr/lib/python3.6/site-packages/salt/utils/templates.py", line 500, in render_jinja_tmpl
          output = template.render(**decoded_context)
        File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 1090, in render
          self.environment.handle_exception()
        File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 832, in handle_exception
          reraise(*rewrite_traceback_stack(source=source))
        File "/usr/lib/python3.6/site-packages/jinja2/_compat.py", line 28, in reraise
          raise value.with_traceback(tb)
        File "<template>", line 35, in top-level template code
        File "/usr/lib/python3.6/site-packages/jinja2/sandbox.py", line 462, in call
          return __context.call(__obj, *args, **kwargs)
      TypeError: get() missing 1 required positional argument: 'default'
      
      ; line 35
      
      ---
      [...]
              {% endif %}
              {% endwith %}
              {% endwith %}
              {% endif %}
              master_finger: {{ salt.key.finger_master() }}
              {% if 'opensips' in salt.grains.get('roles') %}    <======================
              mysql.default_file: /root/.my.cnf
              {% endif %}
          - formatter: yaml
          - merge_if_exists: true
          - makedirs: true
      [...]
      ---

Moreover, when I explicitly define default positional argument with:

  {% if 'opensips' in salt.grains.get('roles', default='') %}
  foo: bar
  {% endif %}

This is raised:

TypeError: argument of type 'function' is not iterable
Click to expand!
$ sudo salt-ssh 1.dummy.global-devel state.apply bootstrap test=true
[ERROR   ] Rendering exception occurred
Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/salt/utils/templates.py", line 500, in render_jinja_tmpl
    output = template.render(**decoded_context)
  File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 1090, in render
    self.environment.handle_exception()
  File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "/usr/lib/python3.6/site-packages/jinja2/_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "<template>", line 35, in top-level template code
TypeError: argument of type 'function' is not iterable

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/salt/utils/templates.py", line 262, in render_tmpl
    output = render_str(tmplstr, context, tmplpath)
  File "/usr/lib/python3.6/site-packages/salt/utils/templates.py", line 546, in render_jinja_tmpl
    "Jinja error: {}{}".format(exc, out), line, tmplstr, trace=tracestr
salt.exceptions.SaltRenderError: Jinja error: argument of type 'function' is not iterable
Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/salt/utils/templates.py", line 500, in render_jinja_tmpl
    output = template.render(**decoded_context)
  File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 1090, in render
    self.environment.handle_exception()
  File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "/usr/lib/python3.6/site-packages/jinja2/_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "<template>", line 35, in top-level template code
TypeError: argument of type 'function' is not iterable

; line 35

---
[...]
        {% endif %}
        {% endwith %}
        {% endwith %}
        {% endif %}
        master_finger: {{ salt.key.finger_master() }}
        {% if 'opensips' in salt.grains.get('roles', default='') %}    <======================
        mysql.default_file: /root/.my.cnf
        {% endif %}
    - formatter: yaml
    - merge_if_exists: true
    - makedirs: true
[...]
---
[CRITICAL] Rendering SLS 'base:salt.salt-minion' failed: Jinja error: argument of type 'function' is not iterable
Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/salt/utils/templates.py", line 500, in render_jinja_tmpl
    output = template.render(**decoded_context)
  File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 1090, in render
    self.environment.handle_exception()
  File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 832, in handle_exception
    reraise(*rewrite_traceback_stack(source=source))
  File "/usr/lib/python3.6/site-packages/jinja2/_compat.py", line 28, in reraise
    raise value.with_traceback(tb)
  File "<template>", line 35, in top-level template code
TypeError: argument of type 'function' is not iterable

; line 35

---
[...]
        {% endif %}
        {% endwith %}
        {% endwith %}
        {% endif %}
        master_finger: {{ salt.key.finger_master() }}
        {% if 'opensips' in salt.grains.get('roles', default='') %}    <======================
        mysql.default_file: /root/.my.cnf
        {% endif %}
    - formatter: yaml
    - merge_if_exists: true
    - makedirs: true
[...]
---
1.dummy.global-devel:
    - Rendering SLS 'base:salt.salt-minion' failed: Jinja error: argument of type 'function' is not iterable
      Traceback (most recent call last):
        File "/usr/lib/python3.6/site-packages/salt/utils/templates.py", line 500, in render_jinja_tmpl
          output = template.render(**decoded_context)
        File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 1090, in render
          self.environment.handle_exception()
        File "/usr/lib/python3.6/site-packages/jinja2/environment.py", line 832, in handle_exception
          reraise(*rewrite_traceback_stack(source=source))
        File "/usr/lib/python3.6/site-packages/jinja2/_compat.py", line 28, in reraise
          raise value.with_traceback(tb)
        File "<template>", line 35, in top-level template code
      TypeError: argument of type 'function' is not iterable
      
      ; line 35
      
      ---
      [...]
              {% endif %}
              {% endwith %}
              {% endwith %}
              {% endif %}
              master_finger: {{ salt.key.finger_master() }}
              {% if 'opensips' in salt.grains.get('roles', default='') %}    <======================
              mysql.default_file: /root/.my.cnf
              {% endif %}
          - formatter: yaml
          - merge_if_exists: true
          - makedirs: true
      [...]
      ---

Setup

  • [ ] on-prem machine
  • [x] VM (Virtualbox, KVM, etc. please specify)
  • [ ] VM running on a cloud service, please be explicit and add details
  • [ ] container (Kubernetes, Docker, containerd, etc. please specify)
  • [ ] or a combination, please be explicit
  • [ ] jails if it is FreeBSD

Steps to Reproduce the behavior This is already referenced in the Description of this issue.

Expected behavior To have working salt.grains.get() with salt-ssh.

Screenshots N/A

Versions Report

salt --versions-report (Provided by running salt --versions-report. Please also mention any differences in master/minion versions.)
$ salt --versions-report
Salt Version:
          Salt: 3003.5
 
Dependency Versions:
          cffi: 1.15.0
      cherrypy: unknown
      dateutil: Not Installed
     docker-py: Not Installed
         gitdb: Not Installed
     gitpython: Not Installed
        Jinja2: 2.11.1
       libgit2: Not Installed
      M2Crypto: 0.35.2
          Mako: Not Installed
       msgpack: 0.6.2
  msgpack-pure: Not Installed
  mysql-python: Not Installed
     pycparser: 2.21
      pycrypto: Not Installed
  pycryptodome: Not Installed
        pygit2: Not Installed
        Python: 3.6.8 (default, Nov 16 2020, 16:55:22)
  python-gnupg: 0.4.9
        PyYAML: 3.13
         PyZMQ: 17.0.0
         smmap: Not Installed
       timelib: Not Installed
       Tornado: 4.5.3
           ZMQ: 4.1.4
 
System Versions:
          dist: centos 7 Core
        locale: UTF-8
       machine: x86_64
       release: 3.10.0-1160.66.1.el7.x86_64
        system: Linux
       version: CentOS Linux 7 Core

Additional context Curious is, that this is working without any problem under salt-minion on the same version, so it's not working only with salt-ssh.

jbartak avatar Jul 22 '22 08:07 jbartak

The recommended syntax is salt["grains.get"]("roles"). That should work in all template contexts, including salt-ssh.

OrangeDog avatar Jul 22 '22 11:07 OrangeDog

I can confirm @OrangeDog that the proposed syntax works as you said. But still, I'm curious why this specifically doesn't work with salt-ssh.

jbartak avatar Jul 22 '22 11:07 jbartak

It's not going to work with salt-ssh due to the way salt-ssh works under the covers by packaging up the thin directory to then run on the client. I'm closing this as it was syntax issue in the state.

dwoz avatar Jul 11 '23 21:07 dwoz