<p>ansible incapaz de encontrar boto: boto necessário para este módulo</p>

Criado em 17 mar. 2016  ·  32Comentários  ·  Fonte: ansible/ansible

O "msg": "boto required for this module" parece tornar todo o suporte aws em ansible inútil, pois a lógica parece estar quebrada em muitos lugares.

Isso é quebrado em ambos os casos, mesmo se você tentar executar via local_action ou diretamente e eu verificar

- 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

Isso está acontecendo em uma máquina OS X, e eu verifiquei que tenho o boto instalado.

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

Como você pode observar no próprio manual, ele também importa boto na máquina de destino e, se você chamar o módulo ec2 diretamente em vez de usar local_action, ainda obterá o mesmo erro.

which python
/usr/local/bin/python

Comentários muito úteis

@stevenscg , ainda trabalhando para mim com isso em meu arquivo de inventário:

[localhost]
localhost ansible_connection=local ansible_python_interpreter=python

Avise-me se isso ajudar em alguma coisa.

Todos 32 comentários

Informações da lista

Oi!

Muito obrigado pelo seu interesse no Ansible. Sinceramente, significa muito para nós.

Esta parece ser uma pergunta do usuário, e gostaríamos de direcionar esse tipo de coisa para a lista de discussão ou para o canal IRC.

Se você puder passar por aí, nós agradeceríamos. Isso nos permite manter o rastreador de problemas para bugs, solicitações de pull, RFEs e similares.

Obrigado mais uma vez e esperamos vê-lo na lista ou IRC. Obrigado!

@bcoca fechando bugs com cópia e passado vai ajudar a construir os objetivos da comunidade. Esse é um relatório de bug válido, não um mas.

O fato de o ansible assumir que o python 2 está instalado em /usr/bin/python é um bug, bastante crítico.

@ssbarnea -

https://www.zigg.com/2014/using-virtualenv-python-local-ansible.html tem uma solução decente que parece estar funcionando tanto para ações diretamente com hosts: localhost ou chamando local_action

@ssbarnea @pauricthelodger Vocês ainda estão tendo problemas com isso?

Acabei de fazer um manual que funcionou por meses (anos) e começou a falhar em local_action: ec2_elb ao registrar uma instância com ELB e usar o inventário ec2.py .

Acontece para mim ao executar do MacOS com Ansible 2.0.0.2, 2.0.1 e 2.1.0.

Ainda não experimentei as recomendações do artigo 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 , ainda trabalhando para mim com isso em meu arquivo de inventário:

[localhost]
localhost ansible_connection=local ansible_python_interpreter=python

Avise-me se isso ajudar em alguma coisa.

@pauricthelodger , posso confirmar que funcionou comigo nas versões do ansible 2.0.0.2, 2.0.1 e 2.1.0. Obrigado novamente!

Algum motivo para estar fechado? Ainda é um problema no 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

A solução alternativa para o arquivo de inventário foi superada, mas ainda é um problema.

@rolette Ansible usa /usr/bin/python padrão (não o mesmo que /usr/local/bin/python ). Meu conselho - use o virtualenv ( virtualenv .venv )

e seu inventário localhost: 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 Obrigado por outra solução alternativa, mas o que estou procurando é uma correção para o ansible para que funcione corretamente no OS X em vez de exigir que todos que se deparam com o problema gastem tempo rastreando uma solução alternativa.

não é uma solução alternativa - é como o python funciona. Você tem que simplesmente dizer ao Ansible onde está seu executável python, se não quiser usar o local padrão /usr/bin/python .

ghostrider negativo ... Curiosamente, todos os outros programas python funcionam bem sem exigir um virtualenv.

Caminhos embutidos em código para executáveis ​​são interrompidos em vários ambientes. Normalmente, não são plataformas inteiras como este bug em particular.

Vamos ser corretos, a maneira certa de chamar o python é via #!/usr/bin/env python e não via um caminho codificado. Há uma exceção a esta regra, os scripts de shell do virtualenvs onde é preferível ter um caminho completo em vez de usar env .

No MacOS usando o sistema Python padrão, o env passa a resolver para /usr/bin/python mas isso não significa que devemos ver /usr/bin/python no script instalado.

Uma coisa que usei ao longo do tempo foi evitar o uso de scripts de shell e chamar ansible como um módulo.

@ssbarnea Concordo, exceto que #!/usr/bin/env python faz a coisa certa dentro do virtualenvs, então ainda não há razão para codificar o caminho.

Obteve o mesmo erro ao usar o módulo ec2_tag no ansible.

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

livro de cantadas:

  - 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

Mas trabalhe com 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

Mesmo erro com a 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 }}'

Não tenho certeza se está conectado, mas, caso ajude as pessoas no caminho, acabei de notar o seguinte no changelog devel em Ansible 2.3:

Adicionado 'ansible_playbook_python' que contém o 'executável Python atual', ele pode ficar em branco em alguns casos nos quais Ansible não é invocado por meio da CLI padrão (limitação sys.executable).

Se você estiver no Mac e tiver instalado outras cópias do Python via homebrew, poderá executar estes comandos para instalar o boto no sistema python:

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

Isso resolveu o problema. Obrigada!!

Estou usando o Arch Linux e o padrão parece ser python 3, enquanto o Ansible parece estar usando o python 2 por padrão.
Portanto, a solução de @rsanchez funciona para mim se eu substituir python por python2 explícito.
Obrigado.

Além da solução de @rsanchez para o cenário em que pode haver várias cópias de python em seu mac, outra maneira é dizer ao ansible qual python usar por meio da variável "ansible_python_interpreter".

Suponha que / usr / bin / python não tenha boto em seu caminho e o python em / usr / local / bin / python (instalado via homebrew) o tenha ("import boto" funciona enquanto estiver no repl). Você pode então definir " ansible_python_interpreter = / usr / local / bin / python " no arquivo de inventário.

Além disso, você define na linha de comando com a opção " --extra-vars = 'ansible_python_interpreter = / usr / local / bin / python' ".

Eu estava tendo o mesmo problema, mas com netaddr .

Ansible estava usando alguma versão python absolutamente aleatória instalada em minha máquina:

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"
}

Então, usei o truque /usr/local/opt/python/bin/python2.7 -m pip install netaddr para instalá-lo.

Estou me perguntando se variáveis ​​de ambiente Python, como PYTHON_HOME e PYTHON_PATH ajudariam nesse problema, mas não sei muito sobre elas.

Quando eu ingenuamente fiz uma compilação do docker para ansible 2.3.1.0 com algo como

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

Eu entendi o erro

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

Huh, interessante. Claro que posso definir o interpretador para alguma coisa codificada, ou encontrar alguma outra solução alternativa, mas é importante observar, como disse antes, que _nenhum outro aplicativo Python tem esse problema_. É justo salientar que a maneira como o ansible encaminha as tarefas para os hosts (mesmo localhost sem ssh) é copiar um executável python - mas, mesmo assim, esse executável deve respeitar as configurações do ambiente.

Para se levantar por um segundo, a ignorância da prática padrão é um problema recorrente com o ansible. Tive tantos desafios ao usar os módulos AWS com tokens de sessão (para atribuição de função ou autenticação mfa) que costumo usar awscli para tudo o que é possível. A bobagem é que, se eles tivessem apenas deixado o boto lidar com a resolução de credenciais em vez de injetar sua própria solução 2/3 de repassá-los, eles teriam o melhor dos dois mundos. Concedido, as credenciais locais não estariam disponíveis a partir de hosts remotos, mas 1) se eles não tivessem suas próprias credenciais, qual seria o ponto de executar a tarefa remotamente de qualquer maneira, já que só atingiria uma API pública de qualquer maneira e que poderia facilmente ser feito localmente na maioria dos casos; e 2) se eles tivessem suas próprias credenciais, você provavelmente gostaria de buscá-los. Não relacionado, mas outro exemplo dos implementadores do ansible procedendo na ignorância de uma melhor prática que poderiam e deveriam ter seguido. Fácil para mim dizer, não estou tentando implementar o ansible: P

Como solução temporária, fiz:

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

Tenho pip, botocore e boto3 integrados ao python3, não o padrão do Mac OS /usr/bin/python . Como uma correção adequada, posso tentar definir o ansible_python_interpreter como uma variável de ambiente.

Algum motivo para estar fechado? Ainda tendo esse problema no 2.5 devel.

Minha solução alternativa para a opção nuclear foi hackear a instalação do ansible em meus pacotes de site, porque não quero me lembrar de passar vars extras todas as vezes. Você pode estremecer, não grite comigo, prossiga por sua conta e risco, sem garantia expressa ou implícita.

Para encontrar os arquivos:

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

Para consertar todos os shebangs python:

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

Eu tinha enfrentado algum erro ao fazer isso
fatal: [localhost]: FALHOU! => {"alterado": falso, "msg": "boto necessário para este módulo"}
mas o boto já está instalado
então usei esse comando (porque estou usando mac)
sudo / usr / bin / python -m pip install boto
e adicionei mais uma linha em env / hosts
ansible_pyhton_interpreter = / usr / bin / python
então é trabalho

qualquer um pode sugerir qual é o motivo de receber estes erro, já tinha instalado o boto então porque preciso deste comando
sudo / usr / bin / python -m pip install boto

@ jawad486 , eu também uso um Mac e adotei o hábito de executar o ansible exclusivamente com docker. Ele evitou completamente os problemas de localização de módulos e tornou possível a execução confiável de qualquer versão do ansible, nova ou antiga, simultaneamente. Não posso dizer o mesmo de qualquer outro método com brew, virtualenv ou o Python embutido. Eu monto em ~ / .aws e ~ / .ssh conforme necessário.

@ jawad846 Leia as postagens sobre esse assunto. É um bug. ansible codifica incorretamente o caminho para python em vez de obtê-lo do ambiente.

No ansible 2.5.1, esse problema ainda persiste (no Linux), e diferentes módulos se comportam de maneira diferente. Usei a solução alternativa ansible_python_interpreter=python no arquivo hosts. Isso faz com que ec2_vpc_net e ec2_vpc_subnet funcionem, mas ec2_vpc_igw falhe com {"changed": false, "msg": "boto is required for this module"} . O que é estranhamente engraçado porque esses módulos fazem parte do mesmo conjunto e são usados ​​juntos.

Investigando isso, descobri que ec2_vpc_net e ec2_vpc_subnet usam boto3, mas ec2_vpc_igw usam boto v2. Portanto, você precisará instalar em seu virtualenv AMBOS o boto3 e o boto2. Em seguida, mudei todos os cabeçalhos de shebang com uma versão modificada do script sed de @benauthor . Eu configurei em meu Makefile para ser executado após construir o virtualpython, desta forma:

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"

Onde vp é o caminho virtualenv local que estou usando.

Ainda é um problema no 2.5.2 também

@ timm088 Acabei de corrigir esse problema no meu macbook.
execute "which python". ele deve fornecer o caminho, no meu caso era "/ usr / local / bin / python".
Em seguida, vá para o arquivo de inventário, cole esse caminho em ansible_python_interpreter.
Esta é a aparência do meu arquivo de hosts de inventário:
[local]
localhost ansible_connection = local ansible_python_interpreter = / usr / local / bin / python /

Deve funcionar agora.

Estou assumindo que os desenvolvedores do Ansible não viram nenhuma das discussões em andamento desde que foi fechado automaticamente 4 dias depois de ser aberto. Finalmente consegui postar uma pergunta na lista de e-mails para ver se podemos consertá-la dessa forma.

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

Esta página foi útil?
0 / 5 - 0 avaliações