Ansible Automation Platform upgrade from 2.4 to 2.5 failing in the "Migrate the gateway database schema" task for the Automation Gateway node

Solution Verified - Updated -

Issue

  • In an environment with Automation Controller and Automation Private Hub being upgraded from the 2.4 version to the 2.5 version through the setup bundle with RPM, Automation Gateway being installed from zero along with Redis in standalone mode, and Postgres as a managed database along with Automation Controller, the upgrade process fails in the following task:

    TASK [ansible.automation_platform_installer.automationgateway : Migrate the gateway database schema] ***
    [WARNING]: Module remote_tmp /var/lib/ansible-automation-platform/gateway/.ansible/tmp did not exist and was created with a mode of 0700, this may cause issues when running as another user. To avoid this, create the remote_tmp dir with the correct permissions manually
    fatal: [automationgateway.example.local]: FAILED! => {"changed": false, "cmd": "aap-gateway-manage migrate", "delta": "0:00:01.696548", "end": "2025-01-09 15:05:44.293504", "msg": "non-zero return code", "rc": 1, "start": "2025-01-09 15:05:42.596956", "stderr": "2025-01-09 18:05:43,982 INFO      ansible_base.lib.redis.client Removing setting cluster_error_retry_attempts from connection settings because its invalid for standalone mode\nTraceback (most recent call last):\n  File \"/usr/lib64/python3.11/site-packages/cryptography/fernet.py\", line 130, in _verify_signature\n    h.verify(data[-32:])\ncryptography.exceptions.InvalidSignature: Signature did not match digest.\n\nDuring handling of the above exception, another exception occurred:\n\nTraceback (most recent call last):\n  File \"/bin/aap-gateway-manage\", line 8, in <module>\n    sys.exit(manage())\n             ^^^^^^^^\n  File \"/usr/lib/python3.11/site-packages/aap_gateway_api/__init__.py\", line 22, in manage\n    execute_from_command_line(sys.argv)\n  File \"/usr/lib/python3.11/site-packages/django/core/management/__init__.py\", line 442, in execute_from_command_line\n    utility.execute()\n  File \"/usr/lib/python3.11/site-packages/django/core/management/__init__.py\", line 436, in execute\n    self.fetch_command(subcommand).run_from_argv(self.argv)\n  File \"/usr/lib/python3.11/site-packages/django/core/management/base.py\", line 412, in run_from_argv\n    self.execute(*args, **cmd_options)\n  File \"/usr/lib/python3.11/site-packages/django/core/management/base.py\", line 458, in execute\n    output = self.handle(*args, **options)\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/usr/lib/python3.11/site-packages/django/core/management/base.py\", line 106, in wrapper\n    res = handle_func(*args, **kwargs)\n          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/usr/lib/python3.11/site-packages/django/core/management/commands/migrate.py\", line 383, in handle\n    emit_post_migrate_signal(\n  File \"/usr/lib/python3.11/site-packages/django/core/management/sql.py\", line 52, in emit_post_migrate_signal\n    models.signals.post_migrate.send(\n  File \"/usr/lib/python3.11/site-packages/django/dispatch/dispatcher.py\", line 176, in send\n    return [\n           ^\n  File \"/usr/lib/python3.11/site-packages/django/dispatch/dispatcher.py\", line 177, in <listcomp>\n    (receiver, receiver(signal=self, sender=sender, **named))\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/usr/lib/python3.11/site-packages/aap_gateway_api/apps.py\", line 15, in _initialize_preferences\n    initialize_preferences()\n  File \"/usr/lib/python3.11/site-packages/aap_gateway_api/utils/preferences.py\", line 138, in initialize_preferences\n    for preference_name in gateway_preference_manager.keys():\n  File \"<frozen _collections_abc>\", line 836, in __iter__\n  File \"/usr/lib/python3.11/site-packages/dynamic_preferences/managers.py\", line 46, in __iter__\n    return self.all().__iter__()\n           ^^^^^^^^^^\n  File \"/usr/lib/python3.11/site-packages/dynamic_preferences/managers.py\", line 220, in all\n    a.update(self.load_from_db(cache=True))\n             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/usr/lib/python3.11/site-packages/dynamic_preferences/managers.py\", line 226, in load_from_db\n    db_prefs = {p.preference.identifier(): p for p in self.queryset}\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/usr/lib/python3.11/site-packages/django/db/models/query.py\", line 398, in __iter__\n    self._fetch_all()\n  File \"/usr/lib/python3.11/site-packages/django/db/models/query.py\", line 1881, in _fetch_all\n    self._result_cache = list(self._iterable_class(self))\n                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/usr/lib/python3.11/site-packages/django/db/models/query.py\", line 122, in __iter__\n    obj = model_cls.from_db(\n          ^^^^^^^^^^^^^^^^^^\n  File \"/usr/lib/python3.11/site-packages/aap_gateway_api/models/preference.py\", line 28, in from_db\n    instance.value = ansible_encryption.decrypt_string(instance.value)\n                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/usr/lib/python3.11/site-packages/ansible_base/lib/utils/encryption.py\", line 123, in decrypt_string\n    decrypted_value = smart_str(self.decrypt(encrypted))\n                                ^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/usr/lib64/python3.11/site-packages/cryptography/fernet.py\", line 89, in decrypt\n    return self._decrypt_data(data, timestamp, time_info)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/usr/lib64/python3.11/site-packages/cryptography/fernet.py\", line 148, in _decrypt_data\n    self._verify_signature(data)\n  File \"/usr/lib64/python3.11/site-packages/cryptography/fernet.py\", line 132, in _verify_signature\n    raise InvalidToken\ncryptography.fernet.InvalidToken", "stderr_lines": ["2025-01-09 18:05:43,982 INFO      ansible_base.lib.redis.client Removing setting cluster_error_retry_attempts from connection settings because its invalid for standalone mode", "Traceback (most recent call last):", "  File \"/usr/lib64/python3.11/site-packages/cryptography/fernet.py\", line 130, in _verify_signature", "    h.verify(data[-32:])", "cryptography.exceptions.InvalidSignature: Signature did not match digest.", "", "During handling of the above exception, another exception occurred:", "", "Traceback (most recent call last):", "  File \"/bin/aap-gateway-manage\", line 8, in <module>", "    sys.exit(manage())", "             ^^^^^^^^", "  File \"/usr/lib/python3.11/site-packages/aap_gateway_api/__init__.py\", line 22, in manage", "    execute_from_command_line(sys.argv)", "  File \"/usr/lib/python3.11/site-packages/django/core/management/__init__.py\", line 442, in execute_from_command_line", "    utility.execute()", "  File \"/usr/lib/python3.11/site-packages/django/core/management/__init__.py\", line 436, in execute", "    self.fetch_command(subcommand).run_from_argv(self.argv)", "  File \"/usr/lib/python3.11/site-packages/django/core/management/base.py\", line 412, in run_from_argv", "    self.execute(*args, **cmd_options)", "  File \"/usr/lib/python3.11/site-packages/django/core/management/base.py\", line 458, in execute", "    output = self.handle(*args, **options)", "             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "  File \"/usr/lib/python3.11/site-packages/django/core/management/base.py\", line 106, in wrapper", "    res = handle_func(*args, **kwargs)", "          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "  File \"/usr/lib/python3.11/site-packages/django/core/management/commands/migrate.py\", line 383, in handle", "    emit_post_migrate_signal(", "  File \"/usr/lib/python3.11/site-packages/django/core/management/sql.py\", line 52, in emit_post_migrate_signal", "    models.signals.post_migrate.send(", "  File \"/usr/lib/python3.11/site-packages/django/dispatch/dispatcher.py\", line 176, in send", "    return [", "           ^", "  File \"/usr/lib/python3.11/site-packages/django/dispatch/dispatcher.py\", line 177, in <listcomp>", "    (receiver, receiver(signal=self, sender=sender, **named))", "               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "  File \"/usr/lib/python3.11/site-packages/aap_gateway_api/apps.py\", line 15, in _initialize_preferences", "    initialize_preferences()", "  File \"/usr/lib/python3.11/site-packages/aap_gateway_api/utils/preferences.py\", line 138, in initialize_preferences", "    for preference_name in gateway_preference_manager.keys():", "  File \"<frozen _collections_abc>\", line 836, in __iter__", "  File \"/usr/lib/python3.11/site-packages/dynamic_preferences/managers.py\", line 46, in __iter__", "    return self.all().__iter__()", "           ^^^^^^^^^^", "  File \"/usr/lib/python3.11/site-packages/dynamic_preferences/managers.py\", line 220, in all", "    a.update(self.load_from_db(cache=True))", "             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "  File \"/usr/lib/python3.11/site-packages/dynamic_preferences/managers.py\", line 226, in load_from_db", "    db_prefs = {p.preference.identifier(): p for p in self.queryset}", "               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "  File \"/usr/lib/python3.11/site-packages/django/db/models/query.py\", line 398, in __iter__", "    self._fetch_all()", "  File \"/usr/lib/python3.11/site-packages/django/db/models/query.py\", line 1881, in _fetch_all", "    self._result_cache = list(self._iterable_class(self))", "                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "  File \"/usr/lib/python3.11/site-packages/django/db/models/query.py\", line 122, in __iter__", "    obj = model_cls.from_db(", "          ^^^^^^^^^^^^^^^^^^", "  File \"/usr/lib/python3.11/site-packages/aap_gateway_api/models/preference.py\", line 28, in from_db", "    instance.value = ansible_encryption.decrypt_string(instance.value)", "                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "  File \"/usr/lib/python3.11/site-packages/ansible_base/lib/utils/encryption.py\", line 123, in decrypt_string", "    decrypted_value = smart_str(self.decrypt(encrypted))", "                                ^^^^^^^^^^^^^^^^^^^^^^^", "  File \"/usr/lib64/python3.11/site-packages/cryptography/fernet.py\", line 89, in decrypt", "    return self._decrypt_data(data, timestamp, time_info)", "           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^", "  File \"/usr/lib64/python3.11/site-packages/cryptography/fernet.py\", line 148, in _decrypt_data", "    self._verify_signature(data)", "  File \"/usr/lib64/python3.11/site-packages/cryptography/fernet.py\", line 132, in _verify_signature", "    raise InvalidToken", "cryptography.fernet.InvalidToken"], "stdout": "Operations to perform:\n  Apply all migrations: aap_gateway_api, admin, auth, contenttypes, dab_activitystream, dab_authentication, dab_oauth2_provider, dab_rbac, dab_resource_registry, dynamic_preferences, flags, oauth2_provider, sessions, social_django\nRunning migrations:\n  No migrations to apply.", "stdout_lines": ["Operations to perform:", "  Apply all migrations: aap_gateway_api, admin, auth, contenttypes, dab_activitystream, dab_authentication, dab_oauth2_provider, dab_rbac, dab_resource_registry, dynamic_preferences, flags, oauth2_provider, sessions, social_django", "Running migrations:", "  No migrations to apply."]}
    
    [...]
    
    PLAY RECAP *********************************************************************
    automationgateway.example.local : ok=189  changed=70   unreachable=0    failed=1    skipped=186  rescued=0    ignored=1   
    automationhub.example.local   : ok=74   changed=7    unreachable=0    failed=0    skipped=97   rescued=0    ignored=0   
    ansiblecontroller.example.local : ok=122  changed=13   unreachable=0    failed=0    skipped=110  rescued=0    ignored=1   
    localhost                  : ok=0    changed=0    unreachable=0    failed=0    skipped=1    rescued=0    ignored=0
    
  • Running the command aap-gateway-manage migrate directly into the Automation Gateway node gives the following output:

    # aap-gateway-manage migrate
    Operations to perform:
    Apply all migrations: aap_gateway_api, admin, auth, contenttypes, dab_activitystream, dab_authentication, dab_oauth2_provider, dab_rbac,   dab_resource_registry, dynamic_preferences, flags, oauth2_provider, sessions, social_django
    Running migrations:
    No migrations to apply.
    2025-01-09 18:19:22,818 INFO      ansible_base.lib.redis.client Removing setting cluster_error_retry_attempts from connection settings because its invalid for standalone mode
    Traceback (most recent call last):
    File "/usr/lib64/python3.11/site-packages/cryptography/fernet.py", line 130, in _verify_signature
      h.verify(data[-32:])
    cryptography.exceptions.InvalidSignature: Signature did not match digest.
    
    During handling of the above exception, another exception occurred:
    
    Traceback (most recent call last):
    File "/usr/bin/aap-gateway-manage", line 8, in <module>
      sys.exit(manage())
               ^^^^^^^^
    File "/usr/lib/python3.11/site-packages/aap_gateway_api/__init__.py", line 22, in manage
      execute_from_command_line(sys.argv)
    File "/usr/lib/python3.11/site-packages/django/core/management/__init__.py", line 442, in execute_from_command_line
      utility.execute()
    File "/usr/lib/python3.11/site-packages/django/core/management/__init__.py", line 436, in execute
      self.fetch_command(subcommand).run_from_argv(self.argv)
    File "/usr/lib/python3.11/site-packages/django/core/management/base.py", line 412, in run_from_argv
      self.execute(*args, **cmd_options)
    File "/usr/lib/python3.11/site-packages/django/core/management/base.py", line 458, in execute
      output = self.handle(*args, **options)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/site-packages/django/core/management/base.py", line 106, in wrapper
      res = handle_func(*args, **kwargs)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/site-packages/django/core/management/commands/migrate.py", line 383, in handle
      emit_post_migrate_signal(
    File "/usr/lib/python3.11/site-packages/django/core/management/sql.py", line 52, in emit_post_migrate_signal
      models.signals.post_migrate.send(
    File "/usr/lib/python3.11/site-packages/django/dispatch/dispatcher.py", line 176, in send
      return [
             ^
    File "/usr/lib/python3.11/site-packages/django/dispatch/dispatcher.py", line 177, in <listcomp>
      (receiver, receiver(signal=self, sender=sender, **named))
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/site-packages/aap_gateway_api/apps.py", line 15, in _initialize_preferences
      initialize_preferences()
    File "/usr/lib/python3.11/site-packages/aap_gateway_api/utils/preferences.py", line 138, in initialize_preferences
      for preference_name in gateway_preference_manager.keys():
    File "<frozen _collections_abc>", line 836, in __iter__
    File "/usr/lib/python3.11/site-packages/dynamic_preferences/managers.py", line 46, in __iter__
      return self.all().__iter__()
             ^^^^^^^^^^
    File "/usr/lib/python3.11/site-packages/dynamic_preferences/managers.py", line 220, in all
      a.update(self.load_from_db(cache=True))
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/site-packages/dynamic_preferences/managers.py", line 226, in load_from_db
      db_prefs = {p.preference.identifier(): p for p in self.queryset}
                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/site-packages/django/db/models/query.py", line 398, in __iter__
      self._fetch_all()
    File "/usr/lib/python3.11/site-packages/django/db/models/query.py", line 1881, in _fetch_all
      self._result_cache = list(self._iterable_class(self))
                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/site-packages/django/db/models/query.py", line 122, in __iter__
      obj = model_cls.from_db(
            ^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/site-packages/aap_gateway_api/models/preference.py", line 28, in from_db
      instance.value = ansible_encryption.decrypt_string(instance.value)
                       ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib/python3.11/site-packages/ansible_base/lib/utils/encryption.py", line 123, in decrypt_string
      decrypted_value = smart_str(self.decrypt(encrypted))
                                  ^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib64/python3.11/site-packages/cryptography/fernet.py", line 89, in decrypt
      return self._decrypt_data(data, timestamp, time_info)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    File "/usr/lib64/python3.11/site-packages/cryptography/fernet.py", line 148, in _decrypt_data
      self._verify_signature(data)
    File "/usr/lib64/python3.11/site-packages/cryptography/fernet.py", line 132, in _verify_signature
      raise InvalidToken
    cryptography.fernet.InvalidToken
    
  • The error occurs even in a fresh install of the Automation Gateway node.

Environment

  • Red Hat Ansible Automation Platform
    • 2.4.x
    • 2.5.x
      • Automation Controller
      • Automation Gateway
      • Automation Hub

Subscriber exclusive content

A Red Hat subscription provides unlimited access to our knowledgebase, tools, and much more.

Current Customers and Partners

Log in for full access

Log In

New to Red Hat?

Learn more about Red Hat subscriptions

Using a Red Hat product through a public cloud?

How to access this content