/ Bin / sh: 1: / usr / bin / python ile bulunamadı: bulunamadı


187

Daha önce hiç görmediğim bir hatayla karşılaşıyorum. İşte komut ve hata:

$ 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

Create_api.yml dosyası:

---

- hosts: api
  remote_user: root
  roles:
    - api

İşte hosts dosyası:

[api]
104.55.47.224

Roller bölümünü kaldırabilirim ve ilk GÖREV'e yapmaz, bunun yerine sadece çizgiye götürür /bin/sh: 1: /usr/bin/python: not found. Burada neler olabilir?


NOT: Herhangi birinin IP adresine ping atması ve yanıt alamaması durumunda, kodu yapıştırmadan bu yana IP adresini değiştirdiğimi bilmelisiniz.

EDIT python yerel olarak kuruldu, sorun Ubuntu 15.04 çalıştıran uzak makineye yüklenmemiş olmasıydı

Yanıtlar:


171

Ben Ubuntu 15.10 sunucusunda ansible çalışan bu hata üzerine tökezledi , çünkü Python 3.4.3 ile birlikte gelir ve ansible Python 2 gerektirir .

provision.ymlŞimdi böyle görünüyor:

- 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
  • Apt-get (veya ham modül sessizce sıkışacak) ile -y (tüm sorulara evet diyor) seçeneğini unutmayın

  • gather_facts: no hattı da önemlidir (çünkü piton olmadan gerçekleri toplayamayız)


12
O halde sonraki roller gerçekleri kullanamaz ... tekrar gerçekleri toplamanın bir yolu var mı? aha, stackoverflow.com/questions/31054453/…
stephen

16
'Gather_facts: no' satırının da kritik olduğunu unutmayın.
rcreswick

6
@ surfer190 büyük bulmak! Ayrıca action: setupson pre_task olarak ekleme de harika çalıştı :)
mrooney

1
@ surfer190 cevabımı burada EC2'yi ansible ile kullanıyorsanız, python2'yi yüklemek için CloudInit'i kullanabilirsiniz, böylece her zamanki gibi toplama gerçeklerini kullanabilirsiniz.
Miroslav

1
Herkesin merak etmesi durumunda, Python 2'yi yüklemek için görevi çalıştırmak gerekli değildir ; düzenli işler de iyi. Ama bunu Ansible modülünü çağırmak için başka bir görevle birlikte koymak , ana bilgisayara atanan tüm roller için gerçeklerin mevcut olmasını sağlayacaktır. rawpre_taskstaskspre_taskssetup
Kenny Evitt

125

Ansible 2.2, Python 3 desteğinin teknik önizlemesine sahiptir. Bundan yararlanmak için (bu nedenle Ubuntu 16.04 üzerine Python 2'yi yüklemenize gerek yoktur), ansible_python_interpreterconfig seçeneğini ayarlamanız yeterlidir /usr/bin/python3. Bu, envanter dosyanızda ana makine başına temelinde yapılabilir:

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

Bu değişkene / usr / bin / python eklemeyi denedim, ancak işe yaramadı. Bunun yerine python3 eklemek işe yaradı ve bu sorun düzeltildi
Deep LF

98

Çözüm 1:

Kullanıyorsanız Ansible >2.2.0, ansible_python_interpreteryapılandırma seçeneğini şu şekilde ayarlayabilirsiniz /usr/bin/python3:

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

veya envanter dosyanızda:

[ubuntu_hosts]
<xxx.xxx.xxx.xxx>

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

Çözüm 2:

Kullanıyorsanız, bunları oynatma kitabınıza Ansible <2.2.0ekleyebilirsiniz 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

GÜNCELLEME ile ansible 2.8.x, bu konuda endişe gerekmez, her iki denetleyici ve hedef makine için> piton için kutunun 3.5 işe yaradı (ler)


Oynatma kitaplarınızı etiketler kullanarak çalıştırırsanız, her zaman kurulum görevine etiketler eklediğinizden emin olun - aksi takdirde ansible etiketleri kullanırken gerçekleri toplamaz.
Ionut Bajescu

16
Ben var ansible 2.3.0.0ve kutunun dışında çalışmıyor. OP tarafından gönderilen aynı hata.
Kodlayıcı

Bu açıkça belli değilse, bunu dahil edilen değişkenlere değil, ana bilgisayar envanter dosyasına eklemeniz gerekir; yani, ana bilgisayar adresi / adıyla aynı envanter dosyasında bulunur.
Shawn Mehan

32

Python'u uzak ana bilgisayarlara yüklemek için ham modülü kullanabilirsiniz :

- raw: sudo apt-get install python-simplejson

11
Bunun rolünüzdeki görevlerden önce ve meta dosyanızdaki herhangi bir bağımlılıktan önce çağrıldığından emin olmak için, oynatma kitabınıza şöyle ekleyin: pre_tasks: - raw: sudo apt-get install python-simplejson
Laurens Rietveld

5
Bir oynatma kitabında ayrıca gather_facts'ı devre dışı bırakmanız gerektiğini , aksi halde raw komutunu çalıştırmadan önce başarısız olacağını unutmayın. (gather_facts: hayır)
rcreswick

@rcreswick Bu benim sorunumdu ve çözümünüz benim için çalıştı. Çok teşekkürler. Ana .yml dosyama (setup-ansible.yml) "gather_facts: no" satırını koydum ve oynatma kitabını şu komutla yürüttüm: "ansible-playbook -i setup-ansible.yml --flush-cache -vvvvvv -kK ". Ansible-playbook ile "-kK" seçeneklerini kullandım çünkü varsayılan ubuntu kurulumu "sudo" yapmak için şifre gerektiriyor.
Ali Yousefi Sabzevar

neden pytghon değil simplejson yüklüyorsun ama python yükleme hakkında konuşuyorsun?
Henning

@Henning python-simplejsonPython ile yazılmıştır ve bu nedenle Python gerektirir. simplejson ayrıca çoğu Ansible çekirdek modülü için bir gerekliliktir. python-simplejsonAracılığıyla yükleyerek apt-get/ yumayrıca Python'u
yüklersiniz

18

Başkalarının cevaplarını özetlemek için, benim için çalışan birleşik ayarlar şunlardır:

 - 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

14

Kişisel olarak bu soruna farklı durumlarda iyi çalışan 3 olası çözüm buldum:

Seçenek 1 - Varsayılan olarak yüklenmiş ansible_python_interpreter: /usr/bin/python3ana bilgisayarlar için ayarlapython3

Bence bu, ana bilgisayarlarınızı python3varsayılan olarak yüklenmiş olup olmadıklarına göre gruplandırmanın bir yolu varsa, sorunu çözmek için üstün bir yöntemdir . Bildiğim kadarıyla python3, tüm Ubuntu 16.04 ve sonraki sürümlerde mevcuttur.

  • Tüm ana makineleriniz kesinlikle varsa python3, değişkeni group_vars/all.yml(veya eşdeğerinize) ekleyebilirsiniz :
# group_vars/all.yml

ansible_python_interpreter: /usr/bin/python3
  • Bazı ana makineleriniz yoksa python3ve dinamik envanter kullanırken (örneğin AWS etiketleme ec2.py) bunları etiketlemek için bir yolunuz varsa, değişkeni aşağıdaki gibi belirli ana bilgisayarlara uygulayabilirsiniz:
# group_vars/tag_OS_ubuntu1804.yml

ansible_python_interpreter: /usr/bin/python3
  • Statik envanter kullanıyorsanız ve ana bilgisayarları sahip olup olmadıklarına göre gruplandırabiliyorsanız python3, şöyle bir şey yapabilirsiniz:
# inventory/hosts

[python2_hosts]
centos7_server

[python3_hosts]
u1804_server

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

Bu seçeneği en çok seviyorum çünkü uzak ana bilgisayarda hiçbir değişiklik gerektirmez ve her oynatma kitabına eklenmesi gereken seçenek 2 ve 3'ün aksine değişkenlerde sadece küçük değişiklikler gerektirir.

Seçenek 2 - Python 2'yi kullanarak yükleyin raw

Bu seçenek, yüklemek gather_facts: falseiçin kullanılan her oynatma kitabının üstüne bir oyun koymayı gerektirir :rawpython

- name: install python2 on all instances
  hosts: "*"
  gather_facts: false
  tasks:
    - name: run apt-get update and install python
      raw: "{{ item }}"
      loop:
        - sudo apt-get update
        - sudo apt-get -y install python
      become: true
      ignore_errors: true

ignore_errors: trueoyunu, apt-getkurulu olmayan ana bilgisayarlarda (örneğin RHEL tabanlı herhangi bir şey) çalıştırmayı planlıyorsanız gerekir , aksi takdirde ilk oyunda hata yaparlar .

Bu çözüm işe yarıyor, ancak birkaç nedenden dolayı listemdeki en düşük değer:

  1. Her oyun kitabının en üstünde yer alması gerekir (1. seçeneğin aksine)
  2. Varsayım aptsistemdedir ve hataları yok sayar (3. seçeneğin aksine)
  3. apt-get komutlar yavaş (seçenek 3'ün aksine)

Seçenek 3 - Symlink /usr/bin/python -> /usr/bin/python3kullanarakraw

Bu çözümü kimsenin önerdiğini görmedim. İdeal değil, ama seçenek 2'den birçok yönden üstün olduğunu düşünüyorum. Benim önerim sistemde ve değilse rawsymlink bir kabuk komutu çalıştırmak için kullanmaktır :/usr/bin/python -> /usr/bin/python3python3 python

- name: symlink /usr/bin/python -> /usr/bin/python3
  hosts: "*"
  gather_facts: false
  tasks:
    - name: symlink /usr/bin/python -> /usr/bin/python3
      raw: |
        if [ -f /usr/bin/python3 ] && [ ! -f /usr/bin/python ]; then
          ln --symbolic /usr/bin/python3 /usr/bin/python; 
        fi
      become: true

Bu çözüm, her oyun kitabının en üstüne koymamız gerektiğinden seçenek 2'ye benzer, ancak bence birkaç açıdan daha üstün:

  • Symlink'i yalnızca python3mevcut olan ve pythonolmayan belirli bir durumda oluşturur - önceden yüklenmişse Python 2'yi geçersiz kılmaz
  • aptYüklü olduğunu varsaymaz
  • Herhangi bir özel hata işlemeden tüm ana bilgisayarlara karşı çalışabilir
  • İle karşılaştırıldığında süper hızlı apt-get

Açıkçası, Python 2'nin kurulu olması gerekiyorsa/usr/bin/python , bu çözüm bir hareket değildir ve seçenek 2 daha iyidir.

Sonuç

  • Mümkünse her durumda seçenek 1'i kullanmanızı öneririm .
  • Envanteriniz gerçekten büyük / karmaşıksa ve ana bilgisayarları kolayca gruplandırmanın bir yolu yoksa , seçenek 1'i çok daha zor ve hataya açık hale getiriyorsanız seçenek 3'ü kullanmanızı öneririm .python3
  • Sadece önermek 2. seçeneği üzerinde seçenek 3 Python 2 monte gerekiyorsa /usr/bin/python.

Kaynaklar


13

Ansible'ı çalıştırmak için python 2.7'ye ihtiyacınız var. Ubuntu 16.04'te bu komutla kurabilirsiniz:

sudo apt-get install python-minimal

Ondan sonra koşabilirdim

ansible-playbook -i inventories/staging playbook.yml

Ansible'ı başarıyla çalıştır

Ubuntu 16.04'te Use ansible adresinde daha fazla bilgi bulabilirsiniz.


12

Yeni bir Dijital Okyanus damlacık ubuntu 15.10 üzerinde çalışmak için kullanılan ne:

# 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

Yeni bir OVH SSD üzerinde ubuntu 16.04 için, python2 paketleri mevcut olmadan önce yükseltme almak zorunda kaldım.


8

Tek bir oynatma kitabında birden fazla oyun oynamanın gerçekten mümkün olduğunu öğrendim, bu yüzden kurulumum şimdi tüm ana bilgisayarlarda ve belirli ana makineler için diğer oyunlarda çalışan bir "bağımlılık sağlama" oyunu içeriyor. Artık yokpre_tasks .

Örneğin:

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

6

Diğerlerinin söylediği gibi, bunun nedeni eksik python2. Buradaki diğer yanıtlar ile bir çözüm sağlar pre_tasksve gather_facts: noancak EC2'deyseniz ve örneği ansible ile döndürürseniz, user_dataseçeneği kullanabilirsiniz :

- 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

Sonra insanlar genellikle ssh'ın şu şekilde kullanılabilir olmasını bekler:

  - 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

Ancak, CloudInit önyükleme işleminde oldukça geç yürütüldüğünden , bu her zaman yeterince uzun olmadığını öğrendim , bu yüzden python2 ssh kullanılabilir olduktan hemen sonra yüklenmeyebilir. Bu yüzden örneğin yeni oluşturulmuş olması durumunda bir duraklama ekledim:

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

Bu işi mükemmel bir şekilde yapacak ve bir avantaj olarak her çalıştırmada python2'yi kontrol etmiyorsunuz ve daha sonra gerçekleri toplamak için herhangi bir geçici çözüm yapmanız gerekmiyor.

Diğer bulut sağlayıcılarının benzer CloudInit işlevselliği sağladığından eminim, bu nedenle kullanım durumunuza uyum sağlayın.


3

Packer kullanarak aşağıdaki çözümü yararlı bulabilirsiniz

kabul edilebilir bir packer sağlayıcısı kullandığınızı varsayalım, yapılandırmanız aşağıdaki gibi görünebilir

önce kabuk sağlayıcısını kullanarak python yükleyebilir, ardından ansible_python_intepreter seçeneğini aşağıda gösterildiği gibi yapılandırabilirsiniz

"provisioners": [
    {
      "type": "shell",
      "inline": [
        "apk update && apk add --no-cache python python-dev ansible bash"
      ]
    },
    {
      "type": "ansible-local",
      "playbook_file": "playbooks/your-play-book.yml",
      "playbook_dir": "playbooks",
      "extra_arguments": [
        "-e",
        "'ansible_python_interpreter=/usr/bin/python3'",
        "-vvv"
      ]
    },

2

Ansible varsayılan olarak Python 2 gerektirir , ancak Ansible 2.2+ Python 3 ile de çalışabilir .

Bu yüzden ya rawmodülü kullanarak Python 2'yi kurun , örn.

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

veya envanter dosyasında aşağıdaki gibi bir ansible_python_interpreterdeğişken ayarlayın :

[local]
localhost ansible_python_interpreter="env python3"

Docker için aşağıdaki satırı ekleyebilirsiniz:

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

veya şu şekilde çalıştırın:

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

1

Göre bu Gist'e aşağıdaki gibi Ubuntu 16.04 üzerinde Python2 yükleyebilirsiniz:

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.

1

Çok cevap .. Ben de bu sayfadan başladığım için gönderdiğiniz için teşekkürler!

Biraz kazma yaptım ve Ubuntu 14.04LTS ile sağlamdı, Ubuntu 15.04LTS en sonuncuyu düşürdü pythonve Ubuntu 16.04LTS düştü aptitude.

Herhangi bir aptarama yapmadan önce önyüklememe şu eylemi koydum :

- 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

Başka bir becomeyerde yönetiyorsanız , bunu yapmaktan çekinmeyin.

Kaynaklar:


1

Python'u hedef makineye, yani SSH'ye istediğimiz makineye yükleyerek aynı sorunu çözebildim. Aşağıdaki komutu kullanmıştım:

sudo apt-get install python-minimal

1

@Miroslav, beni doğru yöne yönlendirdiğiniz için teşekkürler. Benim kullandığım user_dataiçindeec2_instance modülde ve bir tedavi gibi çalışır.

yani

- name: Creating single EC2 instance 
  ec2_instance:
    region: "{{ aws_region }}"
    key_name: "{{ aws_ec2_key_pair }}"
    name: "some-cool-name"
    instance_type: t1.micro
    image_id: ami-d38a4ab1
    security_group: sg-123456
    vpc_subnet_id: sn-678901234
    network:
        assign_public_ip: no
    volumes:
      - device_name: /dev/sda1
        ebs:
          volume_type: gp2
          volume_size: 15
    user_data: |
      #!/bin/bash
      #
      apt update
      apt install -y python-simplejson              
    termination_protection: yes
    wait: yes     

1

Ubuntu 18.04'e python3'ü ilk öncelik olarak kullanmak istediğinizi belirtebilirsiniz /usr/bin/python.

- hosts: all
  become: true
  pre_tasks:
    - raw: update-alternatives --install /usr/bin/python python /usr/bin/python3 1

0

Aynı sorunu yaşadım, uzak ana makineye ve kendi yerel makinenize de python yüklemeniz gerektiğini anlayana kadar. şimdi çalışıyor!


-2

Biz sadece bununla karşılaşıyoruz.

Biz ubuntu 16.04 bir vagrant üzerinde dağıtmak eğer vagrant kullanmıyorsanız benim yorum anlamsız.

Aşağıdaki vagrant eklentilerini (tetikleyici, kabuk komutanı) kurduk ve makineye python 2.7.6 yükledik (bu eklentiler olmadan) ve ansible konuşlandırıldıktan sonra

Son testimizdi, aksi takdirde bu kurulumu Vagrant dosyasındaki bir kabuk komutuna dahil etmek üzereydik

Umarım birine yardımcı olabilir


2
Ansible kullanıyorsanız, aşağıdaki Ansible çözümü doğru çözümdür. Vagrant'ın sizin için yanlışlıkla bazı eklentilerin bir yan etkisi olarak yükleyeceğini ummak sorun istiyor gibi görünüyor.
Paul Becotte

Affedersiniz ama python yoksa nasıl ansible bir ön görev çalıştırabilirsiniz ??? Çözümü denedim ve ön görevden önce görev kurulumunda başarısız oldu. Vagrant dosyasındaki vagrant kabuk komutu (tabii ki vagrant durumda) bunu yapmak için en iyi yoldur ama sadece benim dev üzerinde yüklü vagrant eklentisi iş yapıyor fark. Eklentiye güvenmiyorum ama vagrant dosyasında, sadece eklenti ile de çalıştığına dikkat çekti, ancak vagrant dosyası daha iyi bir seçimdir (ayrıca otomasyon için), çünkü elle her bir şey yapmanıza gerek yok imha / hüküm
wadoo

1
Bu kod bloğunu aynen olduğu gibi kopyaladım ve cevabınızı göndermeden hemen önce açıklandığı gibi çalıştı. Muhtemelen gather_facts: nopython gerektiren hattı koymadınız. Diğer olasılık da ana makinede python gerekir, ama bu süreçte daha önce hatalara neden olacağını tahmin ediyorum.
Paul Becotte

Ben de yapıştırma kopyaladı ama iş yerinde Cuma nigth oldu. Ben gather_fact bölümünü aldıysam dürüstçe hatırlayamıyorum. Yine de başka bir bilgisayarda bu sabah tekrar ifaced ve ben sadece vagrantfile komutu koydum, biz gerçek sunucuda üretime gitmek kadar benim için yeterli. Tekrar taze bir zihinle test edeceğim (cuma akşamı değil) cevabı;)
wadoo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.