<p>mungkin tidak dapat menemukan boto: boto diperlukan untuk modul ini</p>

Dibuat pada 17 Mar 2016  ·  32Komentar  ·  Sumber: ansible/ansible

"msg": "boto required for this module" tampaknya membuat semua dukungan aws tidak berguna karena logika tampaknya rusak di terlalu banyak tempat.

Ini rusak dalam kedua kasus, bahkan jika Anda mencoba menjalankan melalui local_action atau secara langsung dan saya memeriksa

- hosts:
  - localhost

  tasks:
    - pip:
        name: boto
    - name: Provision Krypton (kr)
      local_action: ec2
        key_name=kr
        instance_type=m4.4xlarge
        image=ami-c109e8aa
        wait=yes
        group=webserver
        count=3
        vpc_subnet_id="{{ aws_vpc }}"
        assign_public_ip=yes

Ini terjadi pada mesin OS X, dan saya memverifikasi bahwa saya telah menginstal boto.

Python 2.7.10 (default, Jul 13 2015, 12:05:58)
[GCC 4.2.1 Compatible Apple LLVM 6.1.0 (clang-602.0.53)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import boto

Seperti yang dapat Anda amati dari buku pedoman itu sendiri, itu juga mengimpor boto pada mesin target, dan jika Anda memanggil modul ec2 secara langsung alih-alih menggunakan local_action, Anda masih akan mendapatkan kesalahan yang sama.

which python
/usr/local/bin/python

Komentar yang paling membantu

@stevenscg , masih mengerjakan ini di file inventaris saya:

[localhost]
localhost ansible_connection=local ansible_python_interpreter=python

Beri tahu saya jika itu membantu Anda!

Semua 32 komentar

Daftar Informasi

Hai!

Terima kasih banyak atas minat Anda pada Ansible. Ini dengan tulus sangat berarti bagi kami.

Tampaknya ini adalah pertanyaan pengguna, dan kami ingin mengarahkan hal-hal semacam ini ke milis atau saluran IRC.

Jika Anda bisa mampir ke sana, kami akan sangat menghargainya. Ini memungkinkan kami untuk menyimpan pelacak masalah untuk bug, permintaan tarik, RFE, dan sejenisnya.

Terima kasih sekali lagi dan kami berharap dapat melihat Anda di daftar atau IRC. Terima kasih!

@bcoca menutup bug dengan copy dan past akan membantu membangun tujuan komunitas. Itu laporan bug yang valid, bukan tapi.

Fakta bahwa kemungkinan mengasumsikan bahwa python 2 diinstal pada /usr/bin/python adalah bug, yang cukup kritis.

@ssbarnea - Telah membenturkan kepala saya dari masalah gangguan ini juga untuk semua yang berhubungan dengan EC2 sejak saya menambahkan localhost secara eksplisit ke file Host untuk memasukkannya ke dalam pola batas.

https://www.zigg.com/2014/using-virtualenv-python-local-ansible.html memiliki solusi yang layak yang tampaknya berfungsi baik untuk tindakan langsung dengan hosts: localhost atau menelepon local_action

@ssbarnea @pauricthelodger Apakah kalian masih mengalami masalah dengan ini?

Saya baru saja memiliki buku pedoman yang telah bekerja selama berbulan-bulan (bertahun-tahun) mulai gagal pada local_action: ec2_elb saat mendaftarkan instans dengan ELB dan menggunakan inventaris ec2.py .

Terjadi pada saya saat menjalankan dari MacOS dengan Ansible 2.0.0.2, 2.0.1, dan 2.1.0.

Saya belum mencoba rekomendasi artikel zigg.

TASK [AWS - Register instances with the load balancer] *************************
fatal: [10.x.x.x -> localhost]: FAILED! => {"changed": false, "failed": true, "msg": "boto required for this module"}
$ which python
/usr/local/bin/python

$ pip list boto | grep boto
boto (2.38.0)
boto3 (1.1.4)
botocore (1.2.10)

$ ansible --version
ansible 2.0.0.2

$ python -V
Python 2.7.9

@stevenscg , masih mengerjakan ini di file inventaris saya:

[localhost]
localhost ansible_connection=local ansible_python_interpreter=python

Beri tahu saya jika itu membantu Anda!

@pauricthelodger Saya dapat mengonfirmasi bahwa ini berfungsi untuk saya pada versi yang memungkinkan 2.0.0.2, 2.0.1, dan 2.1.0. Terima kasih lagi!

Ada alasan mengapa ini ditutup? Ini masih menjadi masalah pada OS X (Sierra):

$ which python
/usr/local/bin/python

$ pip list boto | grep boto
boto (2.45.0)
botocore (1.5.1)

$ ansible --version
ansible 2.2.1.0

$ python -V
Python 2.7.12

Penyelesaian file inventaris melewatinya, tetapi masih menjadi masalah.

@rolette Ansible menggunakan default /usr/bin/python (tidak sama dengan /usr/local/bin/python ). Saran saya - gunakan virtualenv ( virtualenv .venv )

dan inventaris localhost Anda: inventory/localhost :

#!/bin/bash
ROOT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )/.."
echo "{
  \"localhost\": {
    \"ansible_connection\": \"local\",
    \"ansible_python_interpreter\": \"${ROOT_DIR}/.venv/bin/python\"
  }
}"

@wojtek-oledzki Terima kasih atas solusi lain, tetapi yang saya cari adalah perbaikan yang memungkinkan sehingga berfungsi dengan baik di OS X alih-alih mengharuskan semua orang yang mengalami masalah menghabiskan waktu untuk melacak solusi.

ini bukan solusi - begitulah cara kerja python. Anda harus memberi tahu Ansible di mana python Anda dapat dieksekusi jika Anda tidak ingin menggunakan lokasi default /usr/bin/python .

ghostrider negatif... Anehnya, setiap program python lainnya berhasil bekerja dengan baik tanpa memerlukan virtualenv.

Jalur hard-coding ke executable rusak di banyak lingkungan. Biasanya tidak seluruh platform seperti bug khusus ini.

Mari kita benar, cara yang benar untuk memanggil python adalah melalui #!/usr/bin/env python dan bukan melalui jalur hardcoded. Ada satu pengecualian untuk aturan ini, skrip shell dari virtualenvs yang lebih disukai memiliki path lengkap daripada menggunakan env .

Pada MacOS menggunakan sistem default Python, env kebetulan menyelesaikan ke /usr/bin/python tetapi ini tidak berarti bahwa kita harus melihat /usr/bin/python dalam skrip yang diinstal.

Satu hal yang saya gunakan dari waktu ke waktu adalah menghindari penggunaan skrip shell dan memanggil ansible sebagai modul.

@ssbarnea Setuju, kecuali bahwa #!/usr/bin/env python melakukan hal yang benar dalam virtualenvs, jadi masih tidak ada alasan untuk membuat hardcode path.

Mendapat kesalahan yang sama saat menggunakan modul ec2_tag di ansible.

TASK [Retrieve all tags on an instance] ****************************************
fatal: [10_12_26_12]: FAILED! => {"changed": false, "failed": true, "msg": "boto required for this module"}

buku pedoman:

  - name: Get instance ec2 facts
    action: ec2_facts
    register: ec2_facts

  - name: Retrieve all tags on an instance
    ec2_tag:
      region: '{{ ansible_ec2_placement_region }}'
      resource: '{{ ansible_ec2_instance_id }}'
      state: list
    register: ec2_tags

Tetapi bekerja dengan local_action

  - name: Get instance ec2 facts
    action: ec2_facts
    register: ec2_facts

  - name: Get resource tags from ec2 facts
    #sudo: false
    local_action: ec2_tag resource={{ec2_facts.ansible_facts.ansible_ec2_instance_id}} region={{ec2_facts.ansible_facts.ansible_ec2_placement_region}} state=list
    register: ec2_tags

Kesalahan yang sama dengan tag ec2_elb :

  pre_tasks:
    - name: Gathering ec2 facts
      action: ec2_facts
    - name: Trackor Instance de-register
      become: no
      local_action:
        module: ec2_elb
        region: "{{ ansible_ec2_placement_region }}"
        instance_id: "{{ ansible_ec2_instance_id }}"
        state: absent
        wait_timeout: 30
        ec2_elbs: '{{ trackor_elb_name }}'

Tidak yakin itu terhubung tetapi, jika itu membantu orang di jalan, saya baru saja memperhatikan yang berikut di log perubahan pengembangan di bawah Ansible 2.3:

Menambahkan 'ansible_playbook_python' yang berisi 'current python executable', itu bisa kosong dalam beberapa kasus di mana Ansible tidak dipanggil melalui CLI standar (batasan sys.executable).

Jika Anda menggunakan Mac dan telah menginstal salinan python lain melalui homebrew, Anda dapat menjalankan perintah ini untuk menginstal boto ke sistem python:

sudo /usr/bin/python -m easy_install pip
sudo /usr/bin/python -m pip install boto

Ini memecahkan masalah. Terima kasih!!

Saya menggunakan Arch Linux dan default tampaknya python 3 sementara Ansible tampaknya menggunakan python 2 secara default.
Jadi solusi @rsanchez berfungsi untuk saya jika saya mengganti python dengan eksplisit python2 .
Terima kasih.

Selain solusi @rsanchez untuk skenario di mana mungkin ada banyak salinan python di mac Anda, cara lain adalah dengan memberi tahu kemungkinan python mana yang akan digunakan melalui variabel "ansible_python_interpreter".

Misalkan /usr/bin/python tidak memiliki boto di jalurnya dan python di /usr/local/bin/python (diinstal melalui homebrew) memilikinya ("impor boto" berfungsi saat di repl). Anda kemudian dapat mengatur " ansible_python_interpreter= /usr/local/bin/python " di file inventaris.

Anda juga mengaturnya di baris perintah dengan opsi " --extra-vars='ansible_python_interpreter=/usr/local/bin/python ' ".

Saya mengalami masalah yang sama, tetapi dengan netaddr .

Ansible menggunakan beberapa versi python yang benar-benar acak yang diinstal di mesin saya:

ansible all -i ./.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory -m debug -a "var=ansible_playbook_python"
elastic0 | SUCCESS => {
    "ansible_playbook_python": "/usr/local/opt/python/bin/python2.7"
}

Saya kemudian hanya menggunakan trik /usr/local/opt/python/bin/python2.7 -m pip install netaddr untuk menginstalnya.

Saya bertanya-tanya apakah variabel lingkungan python seperti PYTHON_HOME dan PYTHON_PATH akan membantu masalah ini, tetapi saya tidak tahu terlalu banyak tentang mereka.

Ketika saya secara naif melakukan pembangunan buruh pelabuhan untuk 2.3.1.0 yang memungkinkan dengan sesuatu seperti

FROM python:2.17
RUN pip install --upgrade pip
RUN pip install boto3 botocore ansible>=2.3.1.0 awscli

Saya mendapatkan kesalahan

fatal: [127.0.0.1]: FAILED! => {"changed": false, "failed": true, "msg": "boto3 and botocore are required for this module"}

Hah, menarik. Tentu saja saya dapat mengatur penerjemah ke beberapa hal yang dikodekan dengan keras, atau menemukan beberapa solusi lain, tetapi penting untuk dicatat seperti yang dikatakan sebelumnya bahwa _tidak ada aplikasi python lain yang memiliki masalah ini_. Cukup adil untuk menunjukkan bahwa cara yang memungkinkan untuk mengatur tugas ke host (bahkan localhost tanpa ssh ) adalah menyalin python yang dapat dieksekusi - tetapi bagaimanapun, yang dapat dieksekusi harus menghormati pengaturan lingkungan.

Untuk bangkit di kotak sabun sejenak, ketidaktahuan tentang praktik standar adalah masalah yang berulang dengan kemungkinan. Saya memiliki begitu banyak tantangan dengan menggunakan modul AWS dengan token sesi (untuk asumsi peran atau mfa auth ) sehingga saya cenderung menggunakan awscli untuk segala kemungkinan. Hal yang konyol adalah, jika mereka membiarkan boto menangani resolusi kredensial alih-alih menyuntikkan 2/3 solusi mereka sendiri untuk meneruskannya, mereka akan mendapatkan yang terbaik dari kedua dunia. Memang, kredensial lokal tidak akan tersedia dari host jarak jauh, tetapi 1) jika mereka tidak memiliki kredensial mereka sendiri, apa gunanya menjalankan tugas dari jarak jauh, karena itu hanya akan mengenai api publik dan itu dapat dengan mudah dilakukan secara lokal dalam banyak kasus; dan 2) jika mereka memang memiliki kredensial mereka sendiri, Anda mungkin ingin mengambilnya. Tidak terkait, tetapi contoh lain dari pelaksana yang memungkinkan melanjutkan tanpa mengetahui praktik terbaik yang dapat mereka miliki dan harus diikuti. Mudah bagi saya untuk mengatakan, saya tidak mencoba untuk mengimplementasikannya :P

Sebagai perbaikan suhu yang saya lakukan:

[local]
localhost              ansible_connection=local     ansible_python_interpreter=/usr/local/bin/python3

Saya memiliki pip, botocore, dan boto3 terintegrasi ke python3, bukan default Mac OS /usr/bin/python . Sebagai perbaikan yang tepat, saya mungkin mencoba mengatur ansible_python_interpreter sebagai variabel lingkungan.

Ada alasan kenapa ini ditutup? Masih mengalami masalah ini pada 2.5 devel.

Solusi opsi nuklir saya adalah meretas instalasi yang memungkinkan di paket situs saya, karena saya tidak ingin mengingat untuk memberikan vars tambahan setiap saat. Anda mungkin meringis, jangan berteriak pada saya, melanjutkan dengan risiko sendiri, tidak ada jaminan tersurat maupun tersirat.

Untuk menemukan file:

python -c "import ansible; print ansible.__path__"

Untuk memperbaiki semua python shebangs:

 grep -lir "/usr/bin/python" /path/to/my/site-packages/ansible/* | xargs sed -i '' "s|/usr/bin/python|/usr/bin/env python|g"

Saya telah menghadapi beberapa kesalahan dengan melakukan ini
fatal: [localhost]: GAGAL! => {"berubah": false, "msg": "boto diperlukan untuk modul ini"}
tapi boto sudah terpasang
jadi saya menggunakan perintah ini (karena saya menggunakan mac)
sudo /usr/bin/python -m pip install boto
dan saya menambahkan satu baris lagi di env/hosts
ansible_pyhton_interpreter=/usr/bin/python
jadi pekerjaannya

siapa pun dapat menyarankan apa alasan untuk mendapatkan kesalahan ini, saya sudah menginstal boto lalu mengapa saya membutuhkan perintah ini
sudo /usr/bin/python -m pip install boto

@jawad486 , saya juga menggunakan Mac dan telah mempraktikkannya untuk dijalankan secara eksklusif dengan buruh pelabuhan. Ini benar-benar menghindari masalah dengan menemukan modul dan memungkinkan untuk menjalankan versi apa pun dari ansible , baru atau lama, secara bersamaan. Saya tidak bisa mengatakan hal yang sama tentang metode lain dengan brew, virtualenv, atau Python bawaan. Saya memasang di ~/.aws dan ~/.ssh seperlunya.

@jawad846 Baca kembali posting tentang masalah ini. Ini bug. mungkin salah meng-hardcode jalur ke python alih-alih mendapatkannya dari lingkungan.

Di 2.5.1 ansible masalah ini masih berlanjut (di linux), dan modul yang berbeda berperilaku berbeda. Saya telah menggunakan solusi @pauricthelodger dengan pengaturan ansible_python_interpreter=python di file hosts. Ini menyebabkan ec2_vpc_net dan ec2_vpc_subnet berfungsi, tetapi ec2_vpc_igw gagal dengan {"changed": false, "msg": "boto is required for this module"} . Yang anehnya lucu karena semua modul ini adalah bagian dari set yang sama dan digunakan bersama.

Menggali ini, saya menemukan bahwa ec2_vpc_net dan ec2_vpc_subnet menggunakan boto3, tetapi ec2_vpc_igw menggunakan boto v2. Dengan demikian Anda perlu menginstal ke virtualenv Anda KEDUA boto3 dan boto2. Kemudian saya melakukan munging semua header Shebang dengan versi modifikasi dari skrip sed

grep -lir "/usr/bin/python" vp/local/lib/python2.7/site-packages/ansible/* | xargs sed -i "s@/usr/bin/python@/usr/bin/env python@g"

Di mana vp adalah jalur virtualenv lokal yang saya gunakan.

Masih masalah pada 2.5.2 juga

@timm088 Saya baru saja memperbaiki masalah itu di macbook saya.
jalankan "python mana". itu akan memberi Anda jalan, dalam kasus saya itu adalah "/usr/local/bin/python".
Lalu buka file inventaris Anda, rekatkan jalur itu di ansible_python_interpreter.
Beginilah tampilan file host inventaris saya:
[lokal]
localhost ansible_connection=ansible_python_interpreter=/usr/local/bin/python/

Ini harus bekerja sekarang.

Saya berasumsi pengembang Ansible belum melihat diskusi yang sedang berlangsung sejak ditutup secara otomatis 4 hari setelah dibuka. Saya akhirnya sempat memposting pertanyaan di milis untuk melihat apakah kami bisa memperbaikinya seperti itu.

https://groups.google.com/forum/#!topic/ansible -project/WCqmyKB46qQ

Apakah halaman ini membantu?
0 / 5 - 0 peringkat