web-dev-qa-db-ja.com

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

そして、これがhostsファイルです。

[api]
104.55.47.224

Rolesセクションを削除しても最初のTASKにはなりません。代わりに/bin/sh: 1: /usr/bin/python: not found行にしかなりません。ここで何が起きているのでしょうか。


注:誰かがIPアドレスをpingしても応答を得られない場合は、コードを貼り付けてからIPアドレスを変更したことを知っておく必要があります。

EDITpythonはローカルにインストールされました、問題はそれがUbuntu 15.04を実行していたリモートマシンにインストールされていなかったということでした

175
jdavis

Ubuntu 15.10server上でansibleを実行していると、このエラーに遭遇しました。なぜなら、それはPython 3.4.3で出荷され、 ansibleは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

  tasks:
    - name: 'ensure user {{ project_name }} exists'
      user: name={{ project_name }} state=present
  • apt-getを付けた-y(すべての質問にyesと言う)オプションを忘れないでください(または生のモジュールは黙って動かなくなります)。

  • gather_facts: nolineも重要です(pythonがなければ事実を収集できないため)

162
lakesare

Ansible 2.2はPython 3サポートの技術プレビューを特徴としています。 これを利用するには (したがって、Ubuntu 16.04にPython 2をインストールする必要はありません)、ansible_python_interpreter configオプションを/usr/bin/python3に設定するだけです。これはあなたのインベントリファイルでホストごとに行うことができます。

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

解決策1:

Ansible >2.2.0を使用している場合は、ansible_python_interpreter設定オプションを/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

解決策2:

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

UPDATEansible 2.8.xを使用すると、心配する必要はありません。コントローラとターゲットマシンの両方で、Python> 3.5ではそのまま使用できます。 (s)

84
Arbab Nazar

リモートホストにPythonをインストールするには、 rawモジュール を使います。

- raw: Sudo apt-get install python-simplejson
32
udondan

他のみんなの答えをまとめると、私にとってうまくいった組み合わせ設定は次のとおりです。

 - 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
18
Bobby

Ansibleを実行するにはpython 2.7が必要です。 Ubuntu 16.04では、このコマンドでインストールできます。

Sudo apt-get install python-minimal

その後、走れました

ansible-playbook -i inventories/staging playbook.yml

Run ansible successfully

Ubuntu 16.04でansibleを使用する を参照してください。

13
phanvugiap

私は、さまざまな状況でうまく機能するこの問題の3つの可能な解決策を個人的に見つけました。

オプション1-デフォルトでansible_python_interpreter: /usr/bin/python3がインストールされているホストにpython3を設定する

デフォルトでpython3がインストールされているかどうかでホストをグループ化する方法がある場合、これは問題を解決するための優れた方法だと思います。私の知る限り、python3はすべてのUbuntuリリース16.04以降で利用可能です。

  • すべてのホストが確実にpython3を持っている場合、変数をgroup_vars/all.yml(または同等のもの)に追加できます。
# group_vars/all.yml

ansible_python_interpreter: /usr/bin/python3
  • ホストの一部にpython3がなく、動的インベントリを使用するときにタグを付ける方法がある場合(例:ec2.pyのAWSタグ付け)、次のように変数を特定のホストに適用できます。
# group_vars/tag_OS_ubuntu1804.yml

ansible_python_interpreter: /usr/bin/python3
  • 静的インベントリを使用し、python3があるかどうかに基づいてホストをグループ化できる場合、次のようなことができます。
# inventory/hosts

[python2_hosts]
centos7_server

[python3_hosts]
u1804_server

[python3_hosts:vars]
ansible_python_interpreter=/usr/bin/python3

すべてのプレイブックへの追加が必要なオプション2および3とは対照的に、リモートホストでの変更は必要なく、変数へのわずかな変更しか必要ないため、このオプションが最も気に入っています。

オプション2-rawname__を使用してPython 2をインストールします

このオプションでは、rawname__を使用してpythonname__をインストールするgather_facts: falseを使用して、すべてのプレイブックの先頭にプレイを配置する必要があります。

- name: install python2 on all instances
  hosts: "*"
  gather_facts: false
  tasks:
    - name: run apt-get update and install python
      raw: "{{ item }}"
      loop:
        - Sudo apt-get update
        - Sudo apt-get -y install python
      become: true
      ignore_errors: true

ignore_errors: trueがインストールされていないホスト(RHELベースのものなど)でプレイを実行する場合は、apt-getが必要です。そうでない場合、最初のプレイでエラーが発生します。

このソリューションは機能しますが、いくつかの理由でリストの中で最も低いものです。

  1. every プレイブックの上部に移動する必要があります(オプション1とは対照的に)
  2. aptname__がシステム上にあり、エラーを無視すると仮定します(オプション3とは対照的に)
  3. apt-getコマンドが遅い(オプション3とは対照的に)

オプション3-rawname__を使用したシンボリックリンク/usr/bin/python -> /usr/bin/python3

私はこのソリューションが他の誰かによって提案されたことを見たことはありません。理想的ではありませんが、多くの点でオプション2よりも優れていると思います。 /usr/bin/python -> /usr/bin/python3がシステム上にある場合にrawname__を使用してpython3をシンボリックリンクするシェルコマンドを実行することをお勧めします] /pythonname__

- name: symlink /usr/bin/python -> /usr/bin/python3
  hosts: "*"
  gather_facts: false
  tasks:
    - name: symlink /usr/bin/python -> /usr/bin/python3
      raw: |
        if [ -f /usr/bin/python3 ] && [ ! -f /usr/bin/python ]; then
          ln --symbolic /usr/bin/python3 /usr/bin/python; 
        fi
      become: true

このソリューションは、すべてのプレイブックの先頭に置く必要があるという点でオプション2に似ていますが、いくつかの点で優れていると思います。

  • python3が存在し、pythonname__が存在しない特定の場合にのみシンボリックリンクを作成します-既にインストールされている場合、Python 2をオーバーライドしません
  • aptname__がインストールされているとは想定していません
  • 特別なエラー処理なしですべてのホストに対して実行できます
  • apt-getのあるものに比べて超高速

明らかに、needPython 2が/usr/bin/pythonにインストールされている場合、このソリューションは手間がかかり、オプション2の方が優れています。

結論

  • 可能であれば、すべての場合に option 1 を使用することをお勧めします。
  • インベントリが本当に大きく/複雑で、python3でホストを簡単にグループ化する方法がない場合は、 option 3 を使用することをお勧めします。 option 1 はるかに難しく、エラーが発生しやすくなります。
  • /usr/bin/pythonにPython 2をインストールする必要がある場合にのみ、 option 2 over option 3 をお勧めします。

ソース

12
percygrunwald

私がこれをubuntu 15.10で新鮮なDigital Oceanドロップレットで動作させるために使用したもの:

# 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アップグレードをしなければなりませんでした。

12
deadghost

1つのプレイブックに複数の再生を含めることが実際には可能であることがわかったので、私の設定にはすべてのホストで実行される「依存関係プロビジョニング」再生、および特定のホストに対するその他の再生が含まれます。だから、もう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
  # ....
8
Koen.

他の人が言ったように、これはpython2が欠落しているためです。ここでの他の答えはpre_tasksgather_facts: noでの回避策を提供します、しかしあなたがEC2にいて、あなたがansibleでインスタンスをスピンアップするならばあなたは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 がブートプロセスのかなり遅い時間に実行されるので、これは必ずしも十分な長さではないことを発見しました。 sshが利用可能になった直後。そのため、インスタンスが作成されたばかりの場合のために一時停止を追加しました。

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

これは完璧に仕事をするでしょうし、毎回実行するたびにpython2をチェックしていないという利点として、後で事実を集めるための回避策を行う必要もありません。

他のクラウドプロバイダも同様のCloudInit機能を提供していると確信しているので、あなたのユースケースに適応してください。

6
Miroslav

デフォルトでは、 AnsibleにはPython 2 が必要ですが、 Ansible 2.2以降はPython 3 でも動作します。 。

そのため、Python 2を rawモジュール を使ってインストールします。

ansible localhost --Sudo -m raw -a "yum install -y python2 python-simplejson"

またはインベントリファイルに ansible_python_interpreter変数 を設定します。

[local]
localhost ansible_python_interpreter="env python3"

Dockerの場合は、次の行を追加できます。

RUN printf '[local]\r\nlocalhost ansible_python_interpreter="env python3"\r\n' > /etc/ansible/hosts

または次のように実行してください。

ansible-playbook /ansible/provision.yml -e 'ansible_python_interpreter=/usr/bin/python3' -c local
2
kenorb

@ Miroslav、私を正しい方向に向けてくれてありがとう。私はuser_dataモジュールでもec2_instanceを使いました、そしてそれは御馳走のように働きます。

すなわち.

- name: Creating single EC2 instance 
  ec2_instance:
    region: "{{ aws_region }}"
    key_name: "{{ aws_ec2_key_pair }}"
    name: "some-cool-name"
    instance_type: t1.micro
    image_id: AMI-d38a4ab1
    security_group: sg-123456
    vpc_subnet_id: sn-678901234
    network:
        assign_public_ip: no
    volumes:
      - device_name: /dev/sda1
        ebs:
          volume_type: gp2
          volume_size: 15
    user_data: |
      #!/bin/bash
      #
      apt update
      apt install -y python-simplejson              
    termination_protection: yes
    wait: yes     
1
Luuk

Ubuntu 18.04に、python3を/usr/bin/pythonの最優先事項として使用することを指示できます。

- hosts: all
  become: true
  pre_tasks:
    - raw: update-alternatives --install /usr/bin/python python /usr/bin/python3 1
1
Ryan

私は、SSHを使用したいターゲットマシンにPythonをインストールすることで同じ問題を解決することができました。私は以下のコマンドを使用しました:

Sudo apt-get install python-minimal
1
anshul

たくさんの答え..私もこのページから始めたので投稿してくれてありがとう!

私は少し掘り下げました、そしてそれは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

becomeを他の場所で管理している場合は、気軽に削除してください。

出典:

1
sonjz

この要点 に従って、あなたは以下のように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.
1
wedesoft

Packerを使用している場合は、以下の解決方法が参考になるでしょう。

あなたがパッカーのアンシブル・プロビジョニング担当者を使うと仮定しよう、あなたの設定は以下のようになるかもしれない

最初にShellプロビジョニングツールを使用してpythonをインストールしてから、次に示すようにansible_python_intepreterオプションを構成できます。

"provisioners": [
    {
      "type": "Shell",
      "inline": [
        "apk update && apk add --no-cache python python-dev ansible bash"
      ]
    },
    {
      "type": "ansible-local",
      "playbook_file": "playbooks/your-play-book.yml",
      "playbook_dir": "playbooks",
      "extra_arguments": [
        "-e",
        "'ansible_python_interpreter=/usr/bin/python3'",
        "-vvv"
      ]
    },
1
smakintel.com

あなたがあなた自身のローカルマシンと同様にリモートホストにもpythonをインストールする必要があることに気づくまで、私は同じ問題を抱えていました。今それは動作します!

0
GAV