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_interpreter
configuration选项设置为/usr/bin/python3
。 这可以在您的清单文件中以每个主机为基础完成:
[db] 123.123.123.123 ansible_python_interpreter=/usr/bin/python3
解决scheme1:
如果您使用Ansible >2.2.0
,则可以将ansible_python_interpreter
configuration选项设置为/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.0
与python3
开箱即用,不需要做上面提到的步骤。
您可以使用原始模块在远程主机上安装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_tasks
和gather_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命令中包含此安装
希望它可以帮助别人