Ansible falla con / bin / sh: 1: / usr / bin / python: no encontrado

Me encuentro con un error que nunca he 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, en su lugar hará que solo llegue a la línea /bin/sh: 1: /usr/bin/python: not found . ¿Qué podría estar pasando aquí?


NOTA: En caso de que alguien esté haciendo ping a la dirección IP y no obtenga una respuesta, debe saber que he cambiado la dirección IP desde que pegué el código.

EDIT python se instaló localmente, el problema era que no estaba instalado en la máquina remota, que ejecutaba Ubuntu 15.04

    Me encontré con este error ejecutando ansible en el servidor Ubuntu 15.10 , ya que se envía con Python 3.4.3 y ansible requiere Python 2 .

    Así es como mi provision.yml ve ahora:

     - hosts: my_app sudo: yes remote_user: root gather_facts: no pre_tasks: - name: 'install python2' raw: sudo apt-get -y install python tasks: - name: 'ensure user {{ project_name }} exists' user: name={{ project_name }} state=present 
    • No olvides la opción -y (dice que sí a todas las preguntas) con apt-get (o el módulo sin formato se atascará en silencio)

    • gather_facts: no línea también es crítica (porque no podemos recostackr datos sin Python)

    Ansible 2.2 presenta una vista previa tecnológica del soporte de Python 3. Para aprovechar esto (para que no tenga que instalar Python 2 en Ubuntu 16.04), simplemente configure la opción de configuración ansible_python_interpreter en /usr/bin/python3 . Esto se puede hacer por host en su archivo de inventario:

     [db] 123.123.123.123 ansible_python_interpreter=/usr/bin/python3 

    Solución 1:

    Si está utilizando Ansible >2.2.0 , puede configurar la opción de configuración ansible_python_interpreter en /usr/bin/python3 :

     ansible my_ubuntu_host -m ping -e 'ansible_python_interpreter=/usr/bin/python3' 

    o en su archivo de inventario:

     [ubuntu_hosts]  [ubuntu_hosts:vars] ansible_python_interpreter=/usr/bin/python3 

    Solución 2:

    Si usa Ansible <2.2.0 , puede agregar estas pre_tasks a su libro de pre_tasks :

     gather_facts: False pre_tasks: - name: Install python for Ansible raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal) register: output changed_when: output.stdout != "" tags: always - setup: # aka gather_facts 

    Puede usar el módulo sin procesar para instalar Python en los hosts remotos:

     - raw: sudo apt-get install python-simplejson 

    Para resumir las respuestas de todos los demás, aquí están las configuraciones combinadas que funcionaron para mí:

      - hosts: all become: true gather_facts: false # Ansible requires python2, which is not installed by default on Ubuntu Xenial pre_tasks: - raw: sudo apt-get -y install python-simplejson # action: setup will gather facts after python2 has been installed - action: setup 

    Necesita Python 2.7 para ejecutar Ansible. En Ubuntu 16.04, puede instalarlo a través de este comando:

    sudo apt-get install python-minimal

    Después de eso, podría correr

    ansible-playbook -i inventories/staging playbook.yml

    Ejecute ansible con éxito

    Por favor, consulte más en Using ansible en Ubuntu 16.04

    Lo que solía hacer para que esto funcionara en ubuntu 15.10 en una nueva gota de Digital Ocean:

     # my-playbook.yml - name: python2 hosts: test gather_facts: no pre_tasks: - raw: sudo apt-get -y install python-simplejson $ ansible-playbook path/to/my-playbook.yml 

    Para ubuntu 16.04 en un SSD OVH nuevo, tuve que actualizar apt-get antes de que los paquetes de python2 estuvieran disponibles.

    Descubrí que en realidad es posible tener varias reproducciones en un solo libro de jugadas, por lo que ahora mi configuración 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:

     - name: dependency provisioning hosts: all become: yes become_method: sudo gather_facts: false tasks: - name: install python2 raw: sudo apt-get -y install python-simplejson - name: production hosts: production_host roles: - nginx tasks: - name: update apt cache apt: update_cache=yes cache_valid_time=3600 # .... - name: staging hosts: staging_host roles: - nginx tasks: - name: update apt cache apt: update_cache=yes cache_valid_time=3600 # .... 

    Como otros dijeron, esto se debe a que falta Python2. Otras respuestas aquí proporcionan una solución con pre_tasks y gather_facts: no ; sin embargo, si está en EC2 y gather_facts: no la instancia con ansible, puede usar la opción user_data :

     - ec2: key_name: mykey instance_type: t2.micro image: ami-123456 wait: yes group: webserver count: 3 vpc_subnet_id: subnet-29e63245 assign_public_ip: yes user_data: | #!/bin/bash apt-get update apt-get install -y python-simplejson register: ec2 

    Entonces la gente generalmente espera que ssh esté disponible así:

      - name: "Wait for the instances to boot and start ssh" wait_for: host: "{{item.public_ip}}" port: 22 delay: 5 timeout: 300 with_items: "{{ ec2.tagged_instances }}" when: ec2|changed 

    Sin embargo, he descubierto que esto no siempre es lo suficientemente largo ya que CloudInit se ejecuta bastante tarde en el proceso de arranque, por lo que aún es posible que python2 no se instale justo después de que ssh esté disponible. Así que agregué una pausa en caso de que la instancia recién se haya creado:

      - name: "Wait for cloud init on first boot" pause: minutes=2 when: ec2|changed 

    Esto hará el trabajo a la perfección y, como ventaja, no verificará python2 en cada ejecución y no tendrá que hacer ninguna solución para recostackr datos más adelante.

    Estoy seguro de que otros proveedores de la nube brindan una funcionalidad CloudInit similar, así que adáptese para su caso de uso.

    Según este Gist puedes instalar Python2 en Ubuntu 16.04 de la siguiente manera:

     enter code here gather_facts: False pre_tasks: - raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal) - setup: # aka gather_facts tasks: # etc. etc. 

    Muchas respuestas … ¡Gracias por publicar como comencé en esta página también!

    Hice un poco de excavación y era sólido con Ubuntu 14.04LTS, Ubuntu 15.04LTS parecía haber dejado caer la última versión de python , y Ubuntu 16.04LTS parece haber caído en aptitude .

    Puse la siguiente acción en mi bootstrap antes de hacer cualquier llamada apt :

     - name: "FIX: Ubuntu 16.04 LTS doesn't come with certain modules, required by ansible" raw: apt-get install python-minimal aptitude -y become: true become_user: root become_method: sudo 

    Si logras become otro lugar, siéntete libre de despojarlo.

    Fuentes:

    Pude solucionar el mismo problema instalando Python en la máquina de destino, es decir, la máquina a la que queremos enviar SSH. Yo había usado el siguiente comando:

     sudo apt-get install python-minimal 

    De forma predeterminada, Ansible requiere Python 2 , sin embargo, Ansible 2.2+ también puede funcionar con Python 3 .

    Entonces, instale Python 2 usando el módulo raw formato, por ejemplo

     ansible localhost --sudo -m raw -a "yum install -y python2 python-simplejson" 

    o establezca la variable ansible_python_interpreter en el archivo de inventario, como:

     [local] localhost ansible_python_interpreter="env python3" 

    Para Docker, puede agregar la siguiente línea:

     RUN printf '[local]\r\nlocalhost ansible_python_interpreter="env python3"\r\n' > /etc/ansible/hosts 

    o ejecutarlo como:

     ansible-playbook /ansible/provision.yml -e 'ansible_python_interpreter=/usr/bin/python3' -c local 

    Tuve el mismo problema, hasta que me di cuenta de que también necesita instalar Python en el host remoto y en su máquina local. ¡ahora funciona!

    Nos encontramos con esto.

    Implementamos ubuntu 16.04 en un vagabundo así que si no estás usando vagabundo, mi comentario no tiene sentido.

    Instalamos los siguientes complementos vagabundos (trigger, shell-commander) y conseguimos instalar Python 2.7.6 en la máquina (que no carecía de thioose plugins) y después de que ansible pueda 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