我遇到了一个我以前从未见过的错误 . 这是命令和错误:
$ 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文件:
---
- hosts: api
remote_user: root
roles:
- api
这是hosts文件:
[api]
104.55.47.224
我可以删除角色部分,它不会进入第一个任务,它将使它只会到达 /bin/sh: 1: /usr/bin/python: not found
行 . 这可能会发生什么?
注意:如果有人正在ping IP地址并且没有得到响应,您应该知道自从粘贴代码后我已经更改了IP地址 .
EDIT python是在本地安装的,问题是它没有安装在运行Ubuntu 15.04的远程机器上
16 回答
我偶然发现在 Ubuntu 15.10 服务器上运行ansible时出现此错误,因为它随附 Python 3.4.3 和ansible requires Python 2 .
这就是我的
provision.yml
现在的样子:Don't forget the -y (says yes to all questions) option with apt-get (或原始模块将无声地卡住)
gather_facts: no
line is also critical (因为我们不能在没有python的情况下收集事实)Ansible 2.2具有Python 3支持的技术预览 . To take advantage of this(所以你不必在Ubuntu 16.04上安装Python 2),只需将
ansible_python_interpreter
config选项设置为/usr/bin/python3
即可 . 这可以在您的库存文件中基于每个主机完成:Solution 1:
如果您正在使用
Ansible >2.2.0
,则可以将ansible_python_interpreter
配置选项设置为/usr/bin/python3
:或在您的库存文件中:
Solution 2:
如果您正在使用
Ansible <2.2.0
,那么您可以将这些pre_tasks
添加到您的剧本中:您可以使用raw module在远程主机上安装Python:
总结其他人的答案,以下是适合我的组合设置:
你需要python 2.7来运行Ansible . 在Ubuntu 16.04上,您可以通过以下命令安装它:
sudo apt-get install python-minimal
在那之后,我可以跑了
ansible-playbook -i inventories/staging playbook.yml
请查看更多信息,请致电Using ansible on Ubuntu 16.04
我曾经在新鲜的数字海洋液滴上使用ubuntu 15.10进行此操作:
对于ubuntu 16.04在新的OVH SSD上,我必须在python2包可用之前进行apt-get升级 .
我发现实际上可以在一个剧本中进行多次播放,所以我的设置现在包含一个在所有主机上运行的"dependency provisioning"播放,以及针对特定主机的其他播放 . 所以没有
pre_tasks
.例如:
正如其他人所说,这是由于缺少python2 . 这里的其他答案提供了
pre_tasks
和gather_facts: no
的解决方法,但是如果您使用EC2并且使用ansible旋转实例,则可以使用user_data
选项:然后人们通常会等待ssh这样可用:
但是我总是足够长,因为CloudInit在启动过程中很晚才执行,所以在ssh可用之后仍然可能没有安装python2 . 所以我添加了一个暂停,以防刚刚创建实例:
这将完美地完成工作,并且作为一个优势,您不会在每次运行时检查python2,并且您不必再做任何变通方法来收集事实 .
我确信其他 Cloud 提供商提供类似的CloudInit功能,因此请根据您的使用情况进行调整 .
根据this Gist,您可以在Ubuntu 16.04上安装Python2,如下所示:
很多答案..感谢您发布,因为我也从这个页面开始!
我做了一些挖掘,它与Ubuntu 14.04LTS一样稳固,Ubuntu 15.04LTS似乎已经放弃了最新的
python
,而Ubuntu 16.04LTS似乎已经下降aptitude
.在进行任何
apt
调用之前,我在我的引导程序中添加了以下操作:如果您在其他地方管理
become
,请随意剥离它 .资料来源:
https://github.com/ansible/ansible-modules-core/issues/3523#issuecomment-222368182
https://github.com/ansible/ansible/issues/16884#issuecomment-278138707
我能够通过在目标机器上安装Python来解决同样的问题,即我们想要SSH的机器 . 我使用了以下命令:
默认情况下,Ansible requires Python 2,然而,Ansible 2.2+ can work with Python 3也是如此 .
所以要么使用raw module安装Python 2,例如
或在库存文件中设置ansible_python_interpreter variable,如:
对于Docker,您可以添加以下行:
或者运行它:
@Miroslav,谢谢你指出我正确的方向 . 我在
ec2_instance
模块中也使用了user_data
,它就像一个款待 .即
我有同样的问题,直到我意识到你需要在远程主机以及您自己的本地计算机上安装python . 现在它的作品!
我们碰到这个 .
我们在流浪汉上部署ubuntu 16.04,所以如果你不使用流浪汉,我的评论毫无意义 .
我们安装了以下vagrant插件(触发器,shell-commander),我们在机器上安装了python 2.7.6(不是没有thioose插件)并且在ansible可以部署之后
这是我们的最后一次测试,否则我们将把这个安装包含在Vagrant文件的shell命令中
希望它可以帮助某人