Estou com um erro que nunca vi antes. Aqui está o comando e o erro:
$ 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
Aqui está o arquivo create_api.yml:
---
- hosts: api
remote_user: root
roles:
- api
E aqui está o arquivo hosts:
[api]
104.55.47.224
Eu posso remover a seção de funções e ela não chegará à primeira TAREFA, mas sim apenas a linha /bin/sh: 1: /usr/bin/python: not found
. O que poderia estar acontecendo aqui?
NOTA: Caso alguém esteja executando ping no endereço IP e não obtenha uma resposta, você deve saber que eu mudei o endereço IP desde a colagem do código.
O EDIT python foi instalado localmente, o problema era que não estava instalado na máquina remota, que estava executando o Ubuntu 15.04
fonte
action: setup
como o pre_task final também funcionou muito bem :)raw
tarefa para instalar o Python 2pre_tasks
;tasks
Trabalhos regulares também. Mas colocá-lopre_tasks
, com outra tarefa para chamar osetup
módulo Ansible , garantirá que os fatos estejam disponíveis para todas as funções atribuídas ao host.O Ansible 2.2 apresenta uma prévia técnica do suporte ao Python 3. Para tirar proveito disso (para que você não precise instalar o Python 2 no Ubuntu 16.04), basta definir a
ansible_python_interpreter
opção de configuração como/usr/bin/python3
. Isso pode ser feito por host no seu arquivo de inventário:fonte
Solução 1:
Se você estiver usando
Ansible >2.2.0
, poderá definir aansible_python_interpreter
opção de configuração para/usr/bin/python3
:ou no seu arquivo de inventário:
Solução 2:
Se você estiver usando
Ansible <2.2.0
, poderá adicioná-lospre_tasks
ao seu playbook:ATUALIZAÇÃO Com
ansible 2.8.x
, você não precisa se preocupar com isso, está funcionando imediatamente para python> 3.5 para o (s) controlador (es) e as máquinas de destinofonte
ansible 2.3.0.0
e não funciona fora da caixa. Mesmo erro postado pelo OP.Você pode usar o módulo bruto para instalar o Python nos hosts remotos:
fonte
pre_tasks: - raw: sudo apt-get install python-simplejson
python-simplejson
é escrito em Python e, portanto, requer Python. O simplejson também é um requisito para a maioria dos módulos principais do Ansible. Ao instalarpython-simplejson
atravésapt-get
/yum
você também instalar o Python e, portanto, abranger todas as dependências ansible básicos ...Para resumir as respostas de todos os outros, aqui estão as configurações combinadas que funcionaram para mim:
fonte
Eu, pessoalmente, encontrei 3 soluções possíveis para esse problema que funcionam bem em diferentes situações:
Opção 1 - Configure
ansible_python_interpreter: /usr/bin/python3
para hosts que forampython3
instalados por padrãoEu acho que esse é o método superior para resolver o problema se você tiver uma maneira de agrupar seus hosts, independentemente de eles terem ou não sido
python3
instalados por padrão. Tanto quanto sei,python3
está disponível em todas as versões 16.04 e posteriores do Ubuntu.python3
, você poderá adicionar a variável ao seugroup_vars/all.yml
(ou equivalente):python3
e você tiver uma maneira de marcá-los ao usar o inventário dinâmico (por exemplo, marcação da AWSec2.py
), você poderá aplicar a variável a determinados hosts como este:python3
, você pode fazer algo assim:Eu gosto mais dessa opção porque ela não requer alterações no host remoto e apenas pequenas alterações nas variáveis, em oposição às opções 2 e 3, que exigem adições a todos os manuais.
Opção 2 - Instale o Python 2 usando
raw
Esta opção requer colocar uma reprodução na parte superior de todos os playbooks
gather_facts: false
usadosraw
para instalarpython
:ignore_errors: true
é necessário se você planeja executar a peça em hosts que não possuemapt-get
instalado (por exemplo, qualquer coisa baseada em RHEL), caso contrário, eles ocorrerão na primeira reprodução.Esta solução funciona, mas é a mais baixa da minha lista por alguns motivos:
apt
está no sistema e ignora erros (em oposição à opção 3)apt-get
comandos são lentos (em oposição à opção 3)Opção 3 - Symlink
/usr/bin/python -> /usr/bin/python3
usandoraw
Eu não vi essa solução proposta por mais ninguém. Não é o ideal, mas acho que é superior à opção 2 de várias maneiras. Minha sugestão é usar
raw
para executar um comando shell para ligar simbolicamente/usr/bin/python -> /usr/bin/python3
sepython3
estiver no sistema epython
não estiver:Essa solução é semelhante à opção 2, pois precisamos colocá-la no topo de todos os manuais, mas acho que é superior em alguns aspectos:
python3
presente epython
não está - ele não substituirá o Python 2 se já estiver instaladoapt
está instaladoapt-get
Obviamente, se você precisar do Python 2 instalado em
/usr/bin/python
, esta solução é proibida e a opção 2 é melhor.Conclusão
python3
, tornando a opção 1 muito mais difícil e propensa a erros./usr/bin/python
.Fontes
/usr/bin/python: not found
erro no Ansibleraw
Módulo Ansible em Documentos Ansiblefonte
Você precisa do python 2.7 para executar o Ansible. No Ubuntu 16.04, você pode instalá-lo através deste comando:
sudo apt-get install python-minimal
Depois disso, eu poderia correr
ansible-playbook -i inventories/staging playbook.yml
Por favor, verifique mais em Using ansible no Ubuntu 16.04
fonte
O que eu usei para fazer isso funcionar no ubuntu 15.10 em uma nova gota do Digital Ocean:
Para o ubuntu 16.04 em um novo SSD da OVH, tive que fazer o apt-get upgrade antes que os pacotes python2 estivessem disponíveis.
fonte
Eu descobri que é realmente possível ter várias execuções em um único manual, então minha configuração agora contém uma execução de "provisionamento de dependência" que é executada em todos os hosts e outras executadas em hosts específicos. Então não mais
pre_tasks
.Por exemplo:
fonte
Como outros disseram, isso ocorre devido à falta do python2. Outras respostas aqui fornecem uma solução alternativa
pre_tasks
egather_facts: no
, no entanto, se você estiver no EC2 e girar a instância com ansible, poderá usar auser_data
opção:Em seguida, as pessoas geralmente esperam que o ssh esteja disponível assim:
No entanto, descobri que isso nem sempre é longo o suficiente, pois o CloudInit é executado bastante tarde no processo de inicialização, portanto o python2 ainda pode não ser instalado logo após o ssh estar disponível. Então, adicionei uma pausa caso a instância tenha sido criada:
Isso fará o trabalho perfeitamente e, como vantagem, você não verifica o python2 a cada execução e não precisa executar nenhuma solução alternativa para reunir fatos posteriormente.
Tenho certeza de que outros provedores de nuvem fornecem funcionalidade semelhante ao CloudInit, portanto, adapte-se ao seu caso de uso.
fonte
Aqueles que usam o Packer podem encontrar abaixo a solução útil
vamos supor que você use o provedor de pacotes ansible, sua configuração pode parecer abaixo
você pode instalar o python usando o provisionador de shell primeiro e, em seguida, configure a opção ansible_python_intepreter, como mostrado abaixo
fonte
Por padrão, o Ansible requer o Python 2 ; no entanto, o Ansible 2.2+ também pode funcionar com o Python 3 .
Portanto, instale o Python 2 usando o
raw
módulo , por exemploou defina a
ansible_python_interpreter
variável no arquivo de inventário, como:Para o Docker, você pode adicionar a seguinte linha:
ou execute-o como:
fonte
De acordo com este Gist, você pode instalar o Python2 no Ubuntu 16.04 da seguinte maneira:
fonte
Muitas respostas .. Obrigado por postar como também comecei nesta página!
Eu pesquisei um pouco e estava sólido com o Ubuntu 14.04LTS, o Ubuntu 15.04LTS parecia ter caído o mais recente
python
e o Ubuntu 16.04LTS parece ter caídoaptitude
.Coloquei a seguinte ação no meu bootstrap antes de fazer qualquer
apt
chamada:Se você gerencia em
become
outro lugar, sinta-se à vontade para removê-lo.Fontes:
fonte
Consegui resolver o mesmo problema instalando o Python na máquina de destino, ou seja, a máquina na qual queremos fazer o SSH. Eu tinha usado o seguinte comando:
fonte
@Miroslav, obrigado por me apontar na direção certa. Eu usei
user_data
noec2_instance
módulo e funciona como um presente.Ou seja,
fonte
Você pode indicar ao Ubuntu 18.04 que deseja usar python3 como a primeira prioridade para
/usr/bin/python
.fonte
Eu tive o mesmo problema, até perceber que você também precisa instalar o python no host remoto e na sua máquina local. agora funciona!
fonte
Nós apenas nos deparamos com isso.
Nós implantamos o ubuntu 16.04 em um vagrant, portanto, se você não estiver usando o vagrant, meu comentário será inútil.
Instalamos os seguintes plugins vagantes (trigger, shell-commander) e obtemos o python 2.7.6 instalado na máquina (que não estava sem os plugins thioose) e, depois que o ansible pode implantar
Foi nosso último teste, caso contrário estávamos prestes a incluir esta instalação em um comando shell no arquivo Vagrant
Espero que possa ajudar alguém
fonte
gather_facts: no
linha em que requer python. A outra possibilidade é que você também precise de python na máquina host, mas acho que isso teria causado erros ainda mais cedo no processo.