私は今まで見たことがないエラーに遭遇しています。これがコマンドとエラーです。
$ 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を実行していたリモートマシンにインストールされていなかったということでした
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: no
lineも重要です(pythonがなければ事実を収集できないため)
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
解決策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)
リモートホストにPythonをインストールするには、 rawモジュール を使います。
- 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
Ansibleを実行するにはpython 2.7が必要です。 Ubuntu 16.04では、このコマンドでインストールできます。
Sudo apt-get install python-minimal
その後、走れました
ansible-playbook -i inventories/staging playbook.yml
Ubuntu 16.04でansibleを使用する を参照してください。
私は、さまざまな状況でうまく機能するこの問題の3つの可能な解決策を個人的に見つけました。
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とは対照的に、リモートホストでの変更は必要なく、変数へのわずかな変更しか必要ないため、このオプションが最も気に入っています。
raw
name__を使用してPython 2をインストールしますこのオプションでは、raw
name__を使用してpython
name__をインストールする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
が必要です。そうでない場合、最初のプレイでエラーが発生します。
このソリューションは機能しますが、いくつかの理由でリストの中で最も低いものです。
apt
name__がシステム上にあり、エラーを無視すると仮定します(オプション3とは対照的に)apt-get
コマンドが遅い(オプション3とは対照的に)raw
name__を使用したシンボリックリンク/usr/bin/python -> /usr/bin/python3
私はこのソリューションが他の誰かによって提案されたことを見たことはありません。理想的ではありませんが、多くの点でオプション2よりも優れていると思います。 /usr/bin/python -> /usr/bin/python3
がシステム上にある場合にraw
name__を使用してpython3
をシンボリックリンクするシェルコマンドを実行することをお勧めします] /python
name__
- 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
が存在し、python
name__が存在しない特定の場合にのみシンボリックリンクを作成します-既にインストールされている場合、Python 2をオーバーライドしませんapt
name__がインストールされているとは想定していませんapt-get
のあるものに比べて超高速明らかに、needPython 2が/usr/bin/python
にインストールされている場合、このソリューションは手間がかかり、オプション2の方が優れています。
python3
でホストを簡単にグループ化する方法がない場合は、 option 3 を使用することをお勧めします。 option 1 はるかに難しく、エラーが発生しやすくなります。/usr/bin/python
にPython 2をインストールする必要がある場合にのみ、 option 2 over option 3 をお勧めします。私がこれを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アップグレードをしなければなりませんでした。
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
# ....
他の人が言ったように、これはpython2が欠落しているためです。ここでの他の答えはpre_tasks
とgather_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機能を提供していると確信しているので、あなたのユースケースに適応してください。
デフォルトでは、 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
@ 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
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
私は、SSHを使用したいターゲットマシンにPythonをインストールすることで同じ問題を解決することができました。私は以下のコマンドを使用しました:
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
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.
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"
]
},
あなたがあなた自身のローカルマシンと同様にリモートホストにもpythonをインストールする必要があることに気づくまで、私は同じ問題を抱えていました。今それは動作します!