Ansible以/ bin / sh失败:1:/ usr / bin / python:找不到

我遇到了一个我从未见过的错误。 这里是命令和错误:

$ 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 

这里是主机文件:

 [api] 104.55.47.224 

我可以删除angular色部分,它不会使它成为第一个任务,而是使它只会到/bin/sh: 1: /usr/bin/python: not found 。 这里可能会发生什么?


注意:如果有人正在ping IP地址并且没有得到响应,您应该知道自从粘贴代码以来我已经更改了IP地址。

编辑 python本地安装,问题是它没有安装在运行Ubuntu 15.04的远程计算机上

我偶然发现了这个在Ubuntu 15.10服务器上运行的错误,因为它附带了Python 3.4.3,并且需要Python 2 。

这是我的provision.yml现在的样子:

 - hosts: my_app sudo: yes remote_user: root gather_facts: no pre_tasks: - name: 'install python2' raw: sudo apt-get -y install python-simplejson tasks: - name: 'ensure user {{ project_name }} exists' user: name={{ project_name }} state=present 
  • 不要忘了-y(对所有问题都是肯定的)选项,apt-get (或者原始模块会被无声地卡住)

  • gather_facts: no 线也是关键 (因为我们不能收集没有python的事实)

Ansible 2.2提供了Python 3支持的技术预览。 为了利用这一点 (所以你不必在Ubuntu 16.04上安装Python 2),只要将ansible_python_interpreterconfiguration选项设置为/usr/bin/python3 。 这可以在您的清单文件中以每个主机为基础完成:

 [db] 123.123.123.123 ansible_python_interpreter=/usr/bin/python3 

解决scheme1:

如果您使用Ansible >2.2.0 ,则可以将ansible_python_interpreterconfiguration选项设置为/usr/bin/python3

 ansible my_ubuntu_host -m ping -e 'ansible_python_interpreter=/usr/bin/python3' 

或在您的库存文件中:

 [ubuntu_hosts] <xxx.xxx.xxx.xxx> [ubuntu_hosts:vars] ansible_python_interpreter=/usr/bin/python3 

解决scheme2:

如果您使用Ansible <2.2.0那么您可以将这些pre_tasks添加到您的手册:

 gather_facts: False pre_tasks: - name: Install python for Ansible raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal) register: output changed_when: output.stdout != "" tags: always - setup: # aka gather_facts 

更新: Ansible >= 2.3.0python3开箱即用,不需要做上面提到的步骤。

您可以使用原始模块在远程主机上安装Python:

 - raw: sudo apt-get install python-simplejson 

总结其他人的答案,下面是适合我的组合设置:

  - hosts: all become: true gather_facts: false # Ansible requires python2, which is not installed by default on Ubuntu Xenial pre_tasks: - raw: sudo apt-get -y install python-simplejson # action: setup will gather facts after python2 has been installed - action: setup 

我曾经在一个新鲜的数字海洋液滴上得到这个工作在Ubuntu 15.10:

 # my-playbook.yml - name: python2 hosts: test gather_facts: no pre_tasks: - raw: sudo apt-get -y install python-simplejson $ ansible-playbook path/to/my-playbook.yml 

对于新的OVH SSD上的Ubuntu 16.04,我必须在python2软件包可用之前进行apt-get升级。

你需要python 2.7来运行Ansible。 在Ubuntu 16.04上,你可以通过这个命令来安装它:

sudo apt-get install python-minimal

之后,我可以跑

ansible-playbook -i inventories/staging playbook.yml

顺利运行

请检查更多在Ubuntu 16.04上使用ansible

我发现实际上可能在单个剧本中有多个剧本,所以我现在的设置包含一个在所有主机上运行的“依赖configuration”播放,以及其他特定主机的播放。 所以没有更多的pre_tasks

例如:

 - 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 # .... 

正如其他人所说,这是由于缺lesspython2。 这里的其他答案提供了一个pre_tasksgather_facts: no的解决方法gather_facts: no ,但是如果你在EC2上,并且你可以使用user_data选项来启动实例:

 - 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 

那么人们通常会等待ssh这样的提供:

  - 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 

但是我发现,这并不总是足够长,因为CloudInit在启动过程中执行得相当晚,所以python2在ssh可用之后仍然可能不会安装。 所以我添加了一个暂停,以防实例刚刚创build:

  - name: "Wait for cloud init on first boot" pause: minutes=2 when: ec2|changed 

这将完美地完成这项工作,并且作为一种优势,您在每次运行时都不检查python2,而且您不必事后采取任何变通办法来收集事实。

我相信其他云提供商提供类似的CloudInitfunction,以适应您的使用情况。

我能够通过在目标机器上安装Python来解决同样的问题,即我们想要SSH的机器。 我曾经使用过下面的命令 – sudo apt-get install python-minimal

很多的答案..感谢张贴,因为我从这个页面开始呢!

我做了一些挖掘工作,使用Ubuntu 14.04LTS,Ubuntu 15.04LTS似乎已经丢弃了最新的python ,而Ubuntu 16.04LTS似乎已经降低了aptitude

在执行任何apt调用之前,我将下列操作放在引导程序中:

 - name: "FIX: Ubuntu 16.04 LTS doesn't come with certain modules, required by ansible" raw: apt-get install python-minimal aptitude -y become: true become_user: root become_method: sudo 

如果你pipe理become其他地方,随时剥夺它。

资料来源:

根据这个要点,你可以在Ubuntu 16.04上安装Python2,如下所示:

 enter code here gather_facts: False pre_tasks: - raw: test -e /usr/bin/python || (apt -y update && apt install -y python-minimal) - setup: # aka gather_facts tasks: # etc. etc. 

我们只是碰到这个。

我们在一个stream浪者上部署Ubuntu 16.04,所以如果你不使用stream浪者,我的评论是毫无意义的。

我们安装了下面的vagrant插件(触发器,shell-commander),我们在机器上安装了python 2.7.6(不是没有thioose插件)

这是我们的最后一次testing,否则我们将在Vagrant文​​件的shell命令中包含此安装

希望它可以帮助别人