web-dev-qa-db-ja.com

Ansibleはインストールされているにもかかわらずdocker-pyをインポートできません

私は この投稿 をチェックし、両方の回答で修正を追跡しましたが、どちらも機能しませんでした。それが原因の場合もあれば、問題が同じであっても少し異なるエラーが発生する場合もあるため、新しい投稿を開いています。

Ansibleホスト:

$ ansible --version
ansible 2.1.0.0
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides

宛先クライアントmyserver:

$ pip list | egrep 'six|docker|websocket_client'
docker-py (1.2.3)
six (1.10.0)

test.yml:

---
- hosts: myserver
  remote_user: root
  tasks:
  - name: stop any running docker registries
    docker_container:
      name: registry
      state: stopped
...

Ansibleサーバー(apにエイリアスされたansible-playbook):

$ ap -vvvv test.yml

出力:

(おそらく無関係な出力、省略):

fatal: [myserver]: FAILED! => {
    "changed": false,
    "failed": true,
    "invocation": {
        "module_args": {
            "api_version": null,
            "blkio_weight": null,
            "cacert_path": null,
            "capabilities": null,
            "cert_path": null,
            "command": null,
            "cpu_period": null,
            "cpu_quota": null,
            "cpu_shares": null,
            "cpuset_cpus": null,
            "cpuset_mems": null,
            "debug": false,
            "detach": true,
            "devices": null,
            "dns_opts": null,
            "dns_search_domains": null,
            "dns_servers": null,
            "docker_Host": null,
            "entrypoint": null,
            "env": null,
            "etc_hosts": null,
            "exposed_ports": null,
            "filter_logger": false,
            "force_kill": false,
            "groups": null,
            "hostname": null,
            "image": null,
            "interactive": false,
            "ipc_mode": null,
            "keep_volumes": true,
            "kernel_memory": null,
            "key_path": null,
            "kill_signal": null,
            "labels": null,
            "links": null,
            "log_driver":
            "json-file",
            "log_options": null,
            "mac_address": null,
            "memory": "0",
            "memory_reservation": null,
            "memory_swap": null,
            "memory_swappiness": null,
            "name": "registry",
            "network_mode": null,
            "networks": null,
            "oom_killer": null,
            "paused": false,
            "pid_mode": null,
            "privileged": false,
            "published_ports": null,
            "pull": false,
            "read_only": false,
            "recreate": false,
            "restart": false,
            "restart_policy": null,
            "restart_retries": 0,
            "security_opts": null,
            "shm_size": null,
            "ssl_version": null,
            "state": "stopped",
            "stop_signal": null,
            "stop_timeout": null,
            "timeout": null,
            "tls": null,
            "tls_hostname": null,
            "tls_verify": null,
            "trust_image_content": false,
            "tty": false,
            "ulimits": null,
            "user": null,
            "uts": null,
            "volume_driver": null,
            "volumes": null,
            "volumes_from": null
        },
        "module_name": "docker_container"
    },
    "msg": 

(関連するエラー):

"Failed to import docker-py - cannot import name NotFound. Try pip install docker-py"}

参照されている投稿の最初の回答に従って、docker-pyモジュールを1.1.0にダウングレードすると、同じエラーが発生します。私もディレクトリをchmodしようとしましたが、違いはありませんでした:

(/usr/lib/python2.7/site-packages) myserver$ ls -lad docker*
drwxr-xr-x. 6 root root 4096 Jul  4 10:57 docker/
drwxr-xr-x. 2 root root 4096 Jul  4 10:57 docker_py-1.2.3-py2.7.Egg-info/

chmod -R go+rx docker*から。

誰かこれを見たことがある? pip ansibleモジュールを使用してモジュールをインストールしてから、手動で削除した後、参照されている投稿のように手動で再インストールしました。また、2.1.0.0を使用しています。ご覧のとおり、この問題を修正するはずでした。

11
volvox

これは、pythonモジュールの新しいバージョンdockerおよびdocker-py ansibleの使用には互換性がありません。私は元に戻して、次のバージョンのPIPパッケージを明示的に指定する必要がありました。

  • ドッカー:2.0.0
  • docker-py:1.10.6

これらのサンプルプレイブックタスク:

- name: install certain python modules for docker
  pip:
    name: "{{ item.name }}"
    version: "{{ item.version }}"
    state: present
  with_items:
  - { name: docker, version: 2.0.0 }
  - { name: docker-py, version: 1.10.6 }

それ以来、私のプレイブックはすべて正常に動作します。

5
anoxis

私にとっては、docker-pyへのパスを指定することができました。

- hosts: <Host>
  environment:
    PYTHONPATH: "/home/path/.local/lib/python2.7/site-packages"

基本的に、Ansibleは間違ったディレクトリを探していました。

この問題に関する素晴らしい記事を書いたクレイグラハムの功績は次のとおりです。

https://medium.com/dronzebot/ansible-and-docker-py-path-issues-and-resolving-them-e3834d5bb79a

4

TL; DR

昇格されたPlaybookインスタンスが勝つため、pipに--userフラグを使用してdockerモジュールをインストールし、-bまたは--becomeフラグをansible-playbookに使用しないでください。別のユーザー用にインストールされているdockerモジュールが表示されません。


後から考えると、なぜ私が問題に遭遇したのか他の人には明らかだったでしょうが、何らかの理由で、pipの--userフラグを使用してdockerをインストールすることを選び、不幸な「アイデア」を使用して-bまたは--becomeオプション。

これにより、「明らかに」インストールされたdockerモジュールが、プレイブックを実行している昇格されたAnsibleインスタンスで使用できなくなりました。誰かが「それらの日のうちの1つ」を持っていて、これを後でつまずく場合の共有。私がこのリマインダーにかなりの「愚かな税金」を支払ったので、それがあなたの助けになることを願っています。 :)

2
deoren

Docker *モジュールに関するansibleのドキュメントのdocker-pyモジュールの要件は実際には最新ではありませんが、一般的には、いくつかのansible-docker-pyペアが機能するはずです。

  • Ansible 2.1.0.0には、少なくともdocker-pyバージョン1.7.0が必要です。これには、クライアントに少なくともdocker 1.9がインストールされている必要があります。

  • 古いバージョンのdockerを使用する必要がある場合は、Docker 1.7とansible 2.0.1.0およびdocker-py 1.4.0を使用できます。

  • 1.6などのさらに古いバージョンのdockerが必要な場合は、ansible 1.9で立ち往生しています。

1
SztupY

これを「hosts」ファイルに追加します。

変化する [servers:vars][your-group-of-server-names:vars]

Python> = 2.7の場合

[servers:vars]
ansible_python_interpreter=/usr/bin/python3 # For Python3 [default Ubuntu-18.04]

Python <= 2.7

[servers:vars]
ansible_python_interpreter=/usr/bin/python # For Python2.7
0
Shaze