Me encuentro con un error que nunca había visto antes. Aquí está el comando y el error:
$ ansible-playbook create_api.yml
PLAY [straw] ******************************************************************
GATHERING FACTS ***************************************************************
failed: [104.55.47.224] => {"failed": true, "parsed": false}
/bin/sh: 1: /usr/bin/python: not found
TASK: [typical | install required system packages] *****************************
FATAL: no hosts matched or all hosts have already failed -- aborting
PLAY RECAP ********************************************************************
to retry, use: --limit @/Users/john/create_api.retry
104.55.47.224 : ok=0 changed=0 unreachable=0 failed=1
Aquí está el archivo create_api.yml:
---
- hosts: api
remote_user: root
roles:
- api
Y aquí está el archivo de hosts:
[api]
104.55.47.224
Puedo eliminar la sección de roles y no llegará a la primera TAREA, sino que solo llegará a la línea /bin/sh: 1: /usr/bin/python: not found
. ¿Qué podría estar pasando aquí?
NOTA: En caso de que alguien haga ping a la dirección IP y no pueda obtener una respuesta, debe saber que he cambiado la dirección IP desde que pegué el código.
EDITAR Python se instaló localmente, el problema era que no estaba instalado en la máquina remota, que ejecutaba Ubuntu 15.04
fuente
action: setup
como la pre_tarea final también funcionó muy bien :)raw
tarea para instalar Python 2pre_tasks
; regulartasks
funciona bien también. Pero ponerlopre_tasks
, junto con otra tarea para llamar alsetup
módulo Ansible también, garantizará que los hechos estén disponibles para cualquier rol asignado al host.Ansible 2.2 presenta una vista previa técnica del soporte de Python 3. Para aprovechar esto (para que no tenga que instalar Python 2 en Ubuntu 16.04), simplemente configure la
ansible_python_interpreter
opción de configuración en/usr/bin/python3
. Esto se puede hacer por host en su archivo de inventario:fuente
Solución 1:
Si está utilizando
Ansible >2.2.0
, puede configurar laansible_python_interpreter
opción de configuración para/usr/bin/python3
:o en su archivo de inventario:
Solución 2:
Si está utilizando
Ansible <2.2.0
, puede agregar estospre_tasks
a su libro de jugadas:ACTUALIZACIÓN Con
ansible 2.8.x
, no tiene que preocuparse por eso, está funcionando de inmediato para python> 3.5 para el controlador y la (s) máquina (s) de destinofuente
ansible 2.3.0.0
y no funciona fuera de la caja. El mismo error publicado por el OP.Puede usar el módulo sin procesar para instalar Python en los hosts remotos:
fuente
pre_tasks: - raw: sudo apt-get install python-simplejson
python-simplejson
está escrito en Python y, por lo tanto, requiere Python. simplejson también es un requisito para la mayoría de los módulos principales de Ansible. Mediante la instalaciónpython-simplejson
a través deapt-get
/yum
también se instala Python y por lo tanto, cubrir todas las dependencias Ansible básicas ...Para resumir las respuestas de todos los demás, aquí están las configuraciones combinadas que funcionaron para mí:
fuente
Personalmente encontré 3 posibles soluciones a este problema que funcionan bien en diferentes situaciones:
Opción 1: configurada
ansible_python_interpreter: /usr/bin/python3
para hosts que se hanpython3
instalado de manera predeterminadaCreo que este es el método superior para resolver el problema si tiene una forma de agrupar sus hosts por si se han
python3
instalado o no de manera predeterminada. Que yo sepa,python3
está disponible en todas las versiones de Ubuntu 16.04 y superiores.python3
, puede agregar la variable a sugroup_vars/all.yml
(o equivalente):python3
y tiene una forma de etiquetarlos cuando usa un inventario dinámico (por ejemplo, etiquetado de AWSec2.py
), puede aplicar la variable a ciertos hosts como este:python3
, podría hacer algo como esto:Esta opción me gusta más porque no requiere cambios en el host remoto y solo cambios menores en las variables, a diferencia de las opciones 2 y 3, que requieren adiciones a cada libro de jugadas.
Opción 2: instalar Python 2 usando
raw
Esta opción requiere poner una jugada en la parte superior de cada libro de jugadas con la
gather_facts: false
que seraw
instalapython
:ignore_errors: true
es necesario si planea ejecutar la reproducción en hosts que no se hanapt-get
instalado (por ejemplo, cualquier cosa basada en RHEL), de lo contrario, se producirá un error en la primera reproducción.Esta solución funciona, pero es la más baja en mi lista por varias razones:
apt
está en el sistema e ignora los errores (a diferencia de la opción 3)apt-get
los comandos son lentos (a diferencia de la opción 3)Opción 3: enlace simbólico
/usr/bin/python -> /usr/bin/python3
utilizandoraw
No he visto esta solución propuesta por nadie más. No es ideal, pero creo que es superior a la opción 2 en muchos sentidos. Mi sugerencia es utilizar
raw
para ejecutar un comando de shell para enlace simbólico/usr/bin/python -> /usr/bin/python3
sipython3
está en el sistema ypython
no es:Esta solución es similar a la opción 2 en que necesitamos ponerla en la parte superior de cada libro de jugadas, pero creo que es superior en algunos aspectos:
python3
está presente ypython
no lo está: no anulará Python 2 si ya está instaladoapt
está instaladoapt-get
Obviamente, si necesita instalar Python 2 en
/usr/bin/python
, esta solución es una opción prohibida y la opción 2 es mejor.Conclusión
python3
, lo que hace que la opción 1 sea mucho más difícil y propensa a errores./usr/bin/python
.Fuentes
/usr/bin/python: not found
error en Ansibleraw
Módulo sobre Ansible Docsfuente
Necesita Python 2.7 para ejecutar Ansible. En Ubuntu 16.04, puede instalarlo mediante este comando:
sudo apt-get install python-minimal
Después de eso, podría correr
ansible-playbook -i inventories/staging playbook.yml
Por favor, consulte más en el uso de Ansible en Ubuntu 16.04
fuente
Lo que solía hacer que funcionara en ubuntu 15.10 en una nueva gota de Digital Ocean:
Para ubuntu 16.04 en un SSD OVH nuevo, tuve que apt-get upgrade antes de que los paquetes python2 estuvieran disponibles.
fuente
Descubrí que en realidad es posible tener múltiples jugadas en un solo libro de jugadas, por lo que mi configuración ahora contiene una jugada de "aprovisionamiento de dependencias" que se ejecuta en todos los hosts y otras jugadas para hosts específicos. Entonces no más
pre_tasks
.Por ejemplo:
fuente
Como otros dijeron, esto se debe a la falta de python2. Otras respuestas aquí proporcionan una solución alternativa
pre_tasks
ygather_facts: no
, sin embargo, si está en EC2 y activa la instancia con ansible, puede usar lauser_data
opción:Entonces la gente generalmente espera que ssh esté disponible de esta manera:
Sin embargo, he descubierto que esto no siempre es suficiente, ya que CloudInit se ejecuta bastante tarde en el proceso de arranque, por lo que Python2 podría no instalarse justo después de que ssh esté disponible. Así que he agregado una pausa en caso de que la instancia se haya creado:
Esto hará el trabajo perfectamente y, como ventaja, no está buscando python2 en cada ejecución y no tiene que hacer ninguna solución para recopilar datos más adelante.
Estoy seguro de que otros proveedores de la nube ofrecen una funcionalidad similar de CloudInit, así que adáptese a su caso de uso.
fuente
Los que usan Packer pueden encontrar útil la siguiente solución
supongamos que usa el aprovisionador ansible de empaquetador, su configuración puede verse a continuación
primero puede instalar python usando el aprovisionador de shell y luego configurar la opción ansible_python_intepreter como se muestra a continuación
fuente
De manera predeterminada, Ansible requiere Python 2 , sin embargo, Ansible 2.2+ también puede funcionar con Python 3 .
Entonces, instale Python 2 usando el
raw
módulo , por ejemploo establecer
ansible_python_interpreter
variable en el archivo de inventario, como:Para Docker, puede agregar la siguiente línea:
o ejecutarlo como:
fuente
De acuerdo con este Gist , puede instalar Python2 en Ubuntu 16.04 de la siguiente manera:
fuente
Muchas respuestas ... ¡Gracias por publicar ya que empecé desde esta página también!
Investigué un poco y fue sólido con Ubuntu 14.04LTS, Ubuntu 15.04LTS parecía haber caído lo último
python
, y Ubuntu 16.04LTS parece haber caídoaptitude
.Puse la siguiente acción en mi rutina de carga antes de hacer cualquier
apt
llamada:Si se las arregla en
become
otro lugar, no dude en despojarlo.Fuentes:
fuente
Pude solucionar el mismo problema instalando Python en la máquina de destino, es decir, la máquina a la que queremos SSH. Había usado el siguiente comando:
fuente
@Miroslav, gracias por señalarme en la dirección correcta. También utilicé
user_data
en elec2_instance
módulo y funciona como un regalo.Es decir
fuente
Puede indicarle a Ubuntu 18.04 que desea usar python3 como la primera prioridad para
/usr/bin/python
.fuente
Tuve el mismo problema, hasta que me di cuenta de que también necesita instalar Python en el host remoto, así como en su propia máquina local. ¡ahora funciona!
fuente
Nos topamos con esto.
Implementamos ubuntu 16.04 en un vagabundo, por lo que si no está usando vagabundo, mi comentario no tiene sentido.
Instalamos los siguientes complementos vagabundos (trigger, shell-commander) y obtenemos python 2.7.6 instalado en la máquina (que no carecía de complementos tioose) y después de que ansible se puede implementar
Era nuestra última prueba, de lo contrario, estábamos a punto de incluir esta instalación en un comando de shell en el archivo Vagrant
Espero que pueda ayudar a alguien
fuente
gather_facts: no
línea que requiere python. La otra posibilidad es que también necesite python en la máquina host, pero supongo que eso le habría causado errores incluso antes en el proceso.