Je rencontre une erreur que je n'ai jamais vue auparavant. Voici la commande et l'erreur:
$ 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
Voici le fichier create_api.yml:
---
- hosts: api
remote_user: root
roles:
- api
Et voici le fichier hosts:
[api]
104.55.47.224
Je peux supprimer la section des rôles et cela ne parviendra pas à la première TÂCHE, mais au lieu de cela, cela ne fera que passer à la ligne /bin/sh: 1: /usr/bin/python: not found
. Que pourrait-il se passer ici?
REMARQUE: Si quelqu'un envoie une requête ping à l'adresse IP et n'obtient pas de réponse, vous devez savoir que j'ai changé l'adresse IP depuis le collage du code.
EDIT python a été installé localement, le problème était qu'il n'était pas installé sur la machine distante, qui exécutait Ubuntu 15.04
la source
action: setup
tant que pré_tâche finale fonctionnait également très bien :)raw
tâche pour installer Python 2 danspre_tasks
; régulièretasks
fonctionne bien aussi. Mais le mettre en placepre_tasks
, avec une autre tâche pour appeler également lesetup
module Ansible , garantira que les faits sont disponibles pour tous les rôles attribués à l'hôte.Ansible 2.2 propose un aperçu technique de la prise en charge de Python 3. Pour en profiter (vous n'avez donc pas besoin d'installer Python 2 sur Ubuntu 16.04), définissez simplement l'
ansible_python_interpreter
option de configuration sur/usr/bin/python3
. Cela peut être fait par hôte dans votre fichier d'inventaire:la source
Solution 1:
Si vous utilisez
Ansible >2.2.0
, vous pouvez définir l'ansible_python_interpreter
option de configuration sur/usr/bin/python3
:ou dans votre fichier d'inventaire:
Solution 2:
Si vous utilisez,
Ansible <2.2.0
vous pouvez les ajouterpre_tasks
à votre playbook:MISE À JOUR Avec
ansible 2.8.x
, vous n'avez pas à vous en soucier, cela fonctionne hors de la boîte pour python> 3.5 pour le contrôleur et la ou les machines ciblesla source
ansible 2.3.0.0
et cela ne fonctionne pas hors de la boîte. Même erreur que celle signalée par l'OP.Vous pouvez utiliser le module raw pour installer Python sur les hôtes distants:
la source
pre_tasks: - raw: sudo apt-get install python-simplejson
python-simplejson
est écrit en Python et nécessite donc Python. simplejson est également une exigence pour la plupart des modules principaux d'Ansible. En installantpython-simplejson
viaapt-get
/yum
vous installez également Python et couvrez donc toutes les dépendances de base d'Ansible ...Pour résumer les réponses de tous les autres, voici les paramètres combinés qui ont fonctionné pour moi:
la source
J'ai personnellement trouvé 3 solutions possibles à ce problème qui fonctionnent bien dans différentes situations:
Option 1 - Définie
ansible_python_interpreter: /usr/bin/python3
pour les hôtespython3
installés par défautJe pense que c'est la meilleure méthode pour résoudre le problème si vous avez un moyen de regrouper vos hôtes selon qu'ils ont ou non
python3
installés par défaut. Pour autant que je sache,python3
est disponible sur toutes les versions d'Ubuntu 16.04 et supérieures.python3
, vous pouvez ajouter la variable à votregroup_vars/all.yml
(ou équivalent):python3
et que vous avez un moyen de les baliser lors de l'utilisation d'un inventaire dynamique (par exemple, le marquage AWS pourec2.py
), vous pouvez appliquer la variable à certains hôtes comme ceci:python3
, vous pouvez faire quelque chose comme ceci:J'aime le plus cette option car elle ne nécessite aucune modification sur l'hôte distant et seulement des modifications mineures des variables, par opposition aux options 2 et 3, qui nécessitent des ajouts à chaque playbook.
Option 2 - Installez Python 2 en utilisant
raw
Cette option nécessite de mettre un jeu en haut de chaque playbook avec
gather_facts: false
qui utiliseraw
pour installerpython
:ignore_errors: true
est requis si vous prévoyez d'exécuter la lecture sur des hôtes qui n'ont pas étéapt-get
installés (par exemple, tout ce qui est basé sur RHEL), sinon ils se trompent lors de la première lecture.Cette solution fonctionne, mais est la plus basse de ma liste pour plusieurs raisons:
apt
trouve sur le système et ignore les erreurs (par opposition à l'option 3)apt-get
les commandes sont lentes (contrairement à l'option 3)Option 3 - Symlink
/usr/bin/python -> /usr/bin/python3
utilisantraw
Je n'ai vu cette solution proposée par personne d'autre. Ce n'est pas idéal, mais je pense que c'est supérieur à l'option 2 à bien des égards. Ma suggestion est d'utiliser
raw
pour exécuter une commande shell pour créer un lien symbolique/usr/bin/python -> /usr/bin/python3
si sepython3
trouve sur le système etpython
ne l'est pas:Cette solution est similaire à l'option 2 en ce sens que nous devons la placer en haut de chaque playbook, mais je pense qu'elle est supérieure à plusieurs égards:
python3
présent etpython
non - il ne remplacera pas Python 2 s'il est déjà installéapt
est installéapt-get
Évidemment, si vous avez besoin d' installer Python 2 sur
/usr/bin/python
, cette solution est interdite et l'option 2 est meilleure.Conclusion
python3
, ce qui rend l' option 1 beaucoup plus difficile et sujette aux erreurs./usr/bin/python
.Sources
/usr/bin/python: not found
erreur dans Ansibleraw
Module Ansible sur Ansible Docsla source
Vous avez besoin de python 2.7 pour exécuter Ansible. Sur Ubuntu 16.04, vous pouvez l'installer via cette commande:
sudo apt-get install python-minimal
Après ça, je pourrais courir
ansible-playbook -i inventories/staging playbook.yml
Veuillez vérifier plus à Utilisation d'ansible sur Ubuntu 16.04
la source
Ce que j'ai utilisé pour faire fonctionner cela sur ubuntu 15.10 sur une nouvelle gouttelette Digital Ocean:
Pour ubuntu 16.04 sur un SSD OVH frais, j'ai dû effectuer une mise à niveau apt-get avant que les packages python2 ne soient disponibles.
la source
J'ai découvert qu'il est en fait possible d'avoir plusieurs jeux dans un seul playbook, donc ma configuration contient maintenant un jeu de "provisioning de dépendance" qui fonctionne sur tous les hôtes, et d'autres jeux pour des hôtes spécifiques. Donc pas plus
pre_tasks
.Par exemple:
- 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 # ....
la source
Comme d'autres l'ont dit, cela est dû à l'absence de python2. D'autres réponses ici fournissent une solution de contournement avec
pre_tasks
etgather_facts: no
, cependant, si vous êtes sur EC2 et que vous faites tourner l'instance avec ansible, vous pouvez utiliser l'user_data
option:- 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
Ensuite, les gens attendent généralement que ssh soit disponible comme ceci:
- 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
Cependant, j'ai trouvé que ce n'est pas toujours assez long car CloudInit est exécuté assez tard dans le processus de démarrage, de sorte que python2 peut toujours ne pas être installé juste après que ssh soit disponible. J'ai donc ajouté une pause au cas où l'instance venait juste d'être créée:
- name: "Wait for cloud init on first boot" pause: minutes=2 when: ec2|changed
Cela fera parfaitement le travail et comme avantage, vous ne vérifiez pas python2 à chaque exécution et vous n'avez pas à faire de contournement pour rassembler des faits plus tard.
Je suis sûr que d'autres fournisseurs de cloud fournissent des fonctionnalités CloudInit similaires, alors adaptez-vous à votre cas d'utilisation.
la source
Ceux qui utilisent Packer peuvent trouver la solution ci-dessous utile
Supposons que vous utilisez un provisioner ansible de packer, votre configuration peut ressembler à ci-dessous
vous pouvez installer python en utilisant d'abord le fournisseur de shell, puis configurer l'option ansible_python_intepreter comme indiqué ci-dessous
la source
Par défaut, Ansible nécessite Python 2 , cependant, Ansible 2.2+ peut également fonctionner avec Python 3 .
Donc, soit installez Python 2 en utilisant le
raw
module , par exempleou définissez une
ansible_python_interpreter
variable dans le fichier d'inventaire, comme:Pour Docker, vous pouvez ajouter la ligne suivante:
ou exécutez-le comme:
la source
Selon ce Gist, vous pouvez installer Python2 sur Ubuntu 16.04 comme suit:
la source
Beaucoup de réponses ... Merci d'avoir posté car j'ai commencé à partir de cette page aussi!
J'ai fait un peu de fouille et c'était solide avec Ubuntu 14.04LTS, Ubuntu 15.04LTS semblait avoir abandonné le dernier
python
et Ubuntu 16.04LTS semble avoir chutéaptitude
.J'ai mis l'action suivante dans mon bootstrap avant de faire des
apt
appels:Si vous vous débrouillez
become
ailleurs, n'hésitez pas à le dépouiller.Sources:
la source
J'ai pu résoudre le même problème en installant Python sur la machine cible, c'est-à-dire la machine sur laquelle nous voulons SSH. J'avais utilisé la commande suivante:
la source
@Miroslav, merci de m'avoir pointé dans la bonne direction. Je l'ai utilisé
user_data
dans leec2_instance
module aussi et cela fonctionne comme un régal.C'est à dire
la source
Vous pouvez indiquer à Ubuntu 18.04 que vous souhaitez utiliser python3 comme première priorité pour
/usr/bin/python
.la source
J'ai eu le même problème, jusqu'à ce que je réalise que vous devez également installer python sur l'hôte distant ainsi que sur votre propre machine locale. maintenant ça marche!
la source
Nous venons de rencontrer ça.
Nous déployons ubuntu 16.04 sur un vagabond donc si vous n'utilisez pas vagrant, mon commentaire est inutile.
Nous avons installé les plugins vagrant suivants (trigger, shell-commander) et nous obtenons python 2.7.6 installé sur la machine (qui n'étaient pas sans plugins thioose) et après ansible peut déployer
C'était notre dernier test, sinon nous étions sur le point d'inclure cette installation dans une commande shell du fichier Vagrant
J'espère que ça peut aider quelqu'un
la source
gather_facts: no
ligne dans ce qui nécessite python. L'autre possibilité est que vous ayez également besoin de python sur la machine hôte, mais je suppose que cela vous aurait causé des erreurs encore plus tôt dans le processus.