Ansible fallisce con / bin / sh: 1: / usr / bin / python: non trovato

Sto incontrando un errore che non ho mai visto prima. Ecco il comando e l’errore:

$ 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 

Ecco il file create_api.yml:

 --- - hosts: api remote_user: root roles: - api 

Ed ecco il file hosts:

 [api] 104.55.47.224 

Riesco a rimuovere la sezione dei ruoli e non arriverà al primo TASK, ma lo renderà solo sulla riga /bin/sh: 1: /usr/bin/python: not found . Cosa potrebbe succedere qui?


NOTA: Nel caso in cui qualcuno stia eseguendo il ping dell’indirizzo IP e non riesca a ottenere una risposta, è necessario sapere che ho cambiato l’indirizzo IP dopo aver incollato il codice.

    EDIT python è stato installato localmente, il problema era che non era installato sulla macchina remota, che stava usando Ubuntu 15.04

    Mi sono imbattuto in questo errore in esecuzione su server Ubuntu 15.10 , perché viene fornito con Python 3.4.3 e ansible richiede Python 2 .

    Ecco come appare my provision.yml ora:

     - 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 
    • Non dimenticare l’opzione -y (dice sì a tutte le domande) con apt-get (o il modulo raw si bloccherà in silenzio)

    • gather_facts: no riga è anche critica (perché non possiamo raccogliere dati senza python)

    Ansible 2.2 presenta un’anteprima tecnologica del supporto di Python 3. Per approfittare di questo (quindi non è necessario installare Python 2 su Ubuntu 16.04), basta impostare l’opzione di configurazione ansible_python_interpreter su /usr/bin/python3 . Questo può essere fatto per host nel tuo file di inventario:

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

    Soluzione 1:

    Se stai usando Ansible >2.2.0 , puoi impostare l’opzione di configurazione ansible_python_interpreter su /usr/bin/python3 :

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

    o nel tuo file di inventario:

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

    Soluzione 2:

    Se stai utilizzando Ansible <2.2.0 , puoi aggiungere questi pre_tasks al tuo playbook:

     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 

    Puoi usare il modulo raw per installare Python sugli host remoti:

     - raw: sudo apt-get install python-simplejson 

    Per riassumere le risposte di tutti gli altri, ecco le impostazioni combinate che hanno funzionato per me:

      - 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 

    Hai bisogno di python 2.7 per eseguire Ansible. Su Ubuntu 16.04, puoi installarlo tramite questo comando:

    sudo apt-get install python-minimal

    Dopo, potrei correre

    ansible-playbook -i inventories/staging playbook.yml

    Esegui con successo ansible

    Si prega di controllare più a Using ansible su Ubuntu 16.04

    Quello che ho usato per ottenere questo lavoro su Ubuntu 15.10 su un nuovo droplet 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 

    Per ubuntu 16.04 su un nuovo SSD OVH, ho dovuto aggiornare apt-get prima che i pacchetti python2 fossero disponibili.

    Ho scoperto che in realtà è ansible avere più riproduzioni in un singolo playbook, quindi il mio setup ora contiene un gioco di “provisioning di dipendenza” che viene eseguito su tutti gli host e altri giochi per host specifici. Quindi non più pre_tasks .

    Per esempio:

     - 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 # .... 

    Come altri hanno detto, questo è dovuto alla mancanza di python2. Altre risposte qui forniscono una soluzione alternativa con pre_tasks e gather_facts: no , tuttavia se sei su EC2 e fai ruotare l’istanza con ansible puoi usare user_data opzione 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 

    Quindi la gente di solito aspetta che ssh sia disponibile in questo modo:

      - 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 

    Tuttavia, ho trovato che non è sempre abbastanza lungo dato che CloudInit viene eseguito piuttosto tardi nel processo di avvio, quindi python2 potrebbe non essere installato subito dopo che ssh è disponibile. Quindi ho aggiunto una pausa nel caso in cui l’istanza è stata appena creata:

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

    Questo funzionerà perfettamente e, come vantaggio, non eseguirai il controllo di python2 ad ogni esecuzione e non dovrai eseguire alcuna soluzione alternativa per raccogliere i dati più tardi.

    Sono sicuro che altri fornitori di servizi cloud offrono funzionalità CloudInit simili, quindi adattati al tuo caso d’uso.

    Secondo questo Gist è ansible installare Python2 su Ubuntu 16.04 come segue:

     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. 

    Un sacco di risposte .. Grazie per la pubblicazione come ho iniziato da questa pagina troppo!

    Ho fatto un po ‘di scavo ed era solido con Ubuntu 14.04 LTS, Ubuntu 15.04LTS sembrava aver rilasciato l’ultimo python e Ubuntu 16.04LTS sembra aver perso l’ aptitude .

    Ho inserito la seguente azione nel mio bootstrap prima di effettuare qualsiasi chiamata 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 

    Se sei become altrove, sentiti libero di spogliarlo.

    fonti:

    Sono stato in grado di risolvere lo stesso problema installando Python sul computer di destinazione, ovvero la macchina su cui vogliamo utilizzare SSH. Ho usato il seguente comando:

     sudo apt-get install python-minimal 

    Per impostazione predefinita, Ansible richiede Python 2 , tuttavia, Ansible 2.2+ può funzionare anche con Python 3 .

    Quindi installa Python 2 usando il modulo raw , ad es

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

    o imposta la variabile ansible_python_interpreter nel file di inventario, come:

     [local] localhost ansible_python_interpreter="env python3" 

    Per Docker, puoi aggiungere la seguente riga:

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

    o eseguirlo come:

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

    Ho avuto lo stesso problema, fino a quando mi sono reso conto che è necessario installare python anche sull’host remoto e sul proprio computer locale. ora funziona!

    Ci siamo solo imbattuti in questo.

    Distribuiamo Ubuntu 16.04 su un vagabondo, quindi se non stai usando vagabondo il mio commento è inutile.

    Abbiamo installato i seguenti plug-in vagrant (trigger, shell-comandante) e abbiamo installato python 2.7.6 sulla macchina (che non erano privi di plugin thioose) e dopo che l’ansible può essere distribuito

    Era il nostro ultimo test, altrimenti stavamo per includere questa installazione in un comando shell nel file Vagrant

    Spero che possa aiutare qualcuno