Roots Discourse

"No module named trellis.utils" when setting up GitLab runner for Trellis

I’m trying to set up GitLab continuous deployment for my Roots stack projects, but I’m hitting a snag: ERROR! Unexpected Exception, this is probably a bug: No module named trellis.utils

Here is the output:

ansible-playbook 2.4.3.0
  config file = trellis/ansible.cfg
  configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = trellis/.venv/local/lib/python2.7/site-packages/ansible
  executable location = trellis/.venv/bin/ansible-playbook
  python version = 2.7.15rc1 (default, Nov 12 2018, 14:31:15) [GCC 7.3.0]
Using trellis/ansible.cfg as config file
Parsed trellis/hosts/development inventory source with ini plugin
Parsed trellis/hosts/production inventory source with ini plugin
Parsed trellis/hosts/staging inventory source with ini plugin
statically imported: trellis/roles/common/tasks/disable_challenge_sites.yml
statically imported: trellis/roles/common/tasks/reload_nginx.yml
statically imported: trellis/vendor/roles/ntp/tasks/clock-rhel-6.yml
[DEPRECATION WARNING]: The use of 'include' for tasks has been deprecated. Use 
'import_tasks' for static inclusions or 'include_tasks' for dynamic inclusions.
 This feature will be removed in a future release. Deprecation warnings can be 
disabled by setting deprecation_warnings=False in ansible.cfg.
[DEPRECATION WARNING]: include is kept for backwards compatibility but usage is
 discouraged. The module documentation details page may explain more about this
 rationale.. This feature will be removed in a future release. Deprecation 
warnings can be disabled by setting deprecation_warnings=False in ansible.cfg.
statically imported: trellis/roles/users/tasks/connection-warnings.yml
statically imported: trellis/vendor/roles/composer/tasks/global-require.yml
statically imported: trellis/vendor/roles/composer/tasks/project-bin.yml
statically imported: trellis/roles/letsencrypt/tasks/setup.yml
statically imported: trellis/roles/letsencrypt/tasks/nginx.yml
statically imported: trellis/roles/common/tasks/reload_nginx.yml
statically imported: trellis/roles/letsencrypt/tasks/certificates.yml
statically imported: trellis/roles/wordpress-setup/tasks/database.yml
statically imported: trellis/roles/wordpress-setup/tasks/self-signed-certificate.yml
statically imported: trellis/roles/wordpress-setup/tasks/nginx-client-cert.yml
statically imported: trellis/roles/wordpress-setup/tasks/nginx-includes.yml
statically imported: trellis/roles/wordpress-setup/tasks/nginx.yml
statically imported: trellis/roles/common/tasks/disable_challenge_sites.yml
the full traceback was:

Traceback (most recent call last):
  File "trellis/.venv/bin/ansible-playbook", line 106, in <module>
    exit_code = cli.run()
  File "trellis/.venv/local/lib/python2.7/site-packages/ansible/cli/playbook.py", line 122, in run
    results = pbex.run()
  File "trellis/.venv/local/lib/python2.7/site-packages/ansible/executor/playbook_executor.py", line 90, in run
    self._tqm.load_callbacks()
  File "trellis/.venv/local/lib/python2.7/site-packages/ansible/executor/task_queue_manager.py", line 179, in load_callbacks
    self._stdout_callback = callback_loader.get(self._stdout_callback)
  File "trellis/.venv/local/lib/python2.7/site-packages/ansible/plugins/loader.py", line 363, in get
    self._module_cache[path] = self._load_module_source(name, path)
  File "trellis/.venv/local/lib/python2.7/site-packages/ansible/plugins/loader.py", line 339, in _load_module_source
    module = imp.load_source(full_name, path, module_file)
  File "trellis/lib/trellis/plugins/callback/output.py", line 16, in <module>
    from trellis.utils import output as output
ImportError: No module named trellis.utils

Trellis version looks like its commit e72019bfc9e21da3ba0526d81c340c93c19dfe7d just after 1.0.0-rc.2

I’d really appreciate any suggestions. Thanks in advance! :slight_smile:

Update: I managed to get around this by temporarily disabling the trellis output callback plugin. This is not, ideal, but allows server.yml to run successfully.