Solución al error NameError por 'platform_system' no definido durante la instalación de Ansible

Escenario del problema

Al actualizar e instalar la versión 2.7.11 de Ansible mediante pip, el comando ansible --version produce un error inesperado. La excepción completa es la siguiente:

ERROR! Unexpected Exception, this is probably a bug: name 'platform_system' is not defined
the full traceback was:

Traceback (most recent call last):
  File "/bin/ansible", line 97, in <module>
    mycli = getattr(__import__("ansible.cli.%s" % sub, fromlist=[myclass]), myclass)
  File "/usr/lib/python2.7/site-packages/ansible/cli/__init__.py", line 38, in <module>
    from ansible.inventory.manager import InventoryManager
  File "/usr/lib/python2.7/site-packages/ansible/inventory/manager.py", line 38, in <module>
    from ansible.plugins.loader import inventory_loader
  File "/usr/lib/python2.7/site-packages/ansible/plugins/loader.py", line 22, in <module>
    from ansible.parsing.utils.yaml import from_yaml
  File "/usr/lib/python2.7/site-packages/ansible/parsing/utils/yaml.py", line 17, in <module>
    from ansible.parsing.yaml.loader import AnsibleLoader
  File "/usr/lib/python2.7/site-packages/ansible/parsing/yaml/loader.py", line 30, in <module>
    from ansible.parsing.yaml.constructor import AnsibleConstructor
  File "/usr/lib/python2.7/site-packages/ansible/parsing/yaml/constructor.py", line 29, in <module>
    from ansible.parsing.vault import VaultLib
  File "/usr/lib/python2.7/site-packages/ansible/parsing/vault/__init__.py", line 42, in <module>
    from cryptography.hazmat.backends import default_backend
  File "/usr/lib64/python2.7/site-packages/cryptography/hazmat/backends/__init__.py", line 7, in <module>
    import pkg_resources
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 3007, in <module>
    working_set.require(__requires__)
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 728, in require
    needed = self.resolve(parse_requirements(requirements))
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 631, in resolve
    requirements.extend(dist.requires(req.extras)[::-1])
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2489, in requires
    dm = self._dep_map
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2700, in _dep_map
    self.__dep_map = self._compute_dependencies()
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2733, in _compute_dependencies
    common = frozenset(reqs_for_extra(None))
  File "/usr/lib/python2.7/site-packages/pkg_resources.py", line 2730, in reqs_for_extra
    if req.marker_fn(override={'extra':extra}):
  File "/usr/lib/python2.7/site-packages/_markerlib/markers.py", line 113, in marker_fn
    return eval(compiled_marker, environment)
  File "<environment marker>", line 1, in <module>
NameError: name 'platform_system' is not defined

Entorno del probleam

Software Versión
Python 2.7
pip 8.1.2
setuptools 0.9.8

Causa del problema

Al actualizar una versión específica del software, las dependencias requeridas, particularmente setuptools, resultan incompatibles con las versiones instaladas en el sistema. En este caso, la versión de setuptools es demasiado antigua para manejar los marcadores de entorno utilizados por Ansible, lo que provoca el error NameError porque la variable platform_system no está definida en el contexto de evaluación.

Solución

Ejecuta los siguientes comandos con privilegios de root para actualizar las herramientas de gestión de paquetes:

sudo pip install --upgrade pip
sudo pip install --upgrade setuptools

Resultado

Tras la actualización, el comando ansible --version funciona correctamente, mostrando la información esperada:

ansible 2.7.11
  config file = /home/tidb/tidb-ansible/ansible.cfg
  configured module search path = [u'/home/tidb/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /bin/ansible
  python version = 2.7.5 (default, Oct 30 2018, 23:45:53) [GCC 4.8.5 20150623 (Red Hat 4.8.5-36)]

Resumen

Los conflictos de dependencias son comunes al gestionar paquetes en Python. Analizar el historial de errores y actualizar componentes clave como pip y setuptools suele resolver problemas de incompatibilidad y errores de nombre indefinido.

Etiquetas: Python pip setuptools Ansible name-error

Publicado el 7-6 04:42