4

我用 pip 安装了 ansible,apache-libcloud。此外,我可以将 gcloud cli 和 ansible 作品用于任何非 gce 相关的剧本。

当使用 gce 模块作为任务在 ansible playbook 中创建实例时,会出现以下错误:

TASK: [Launch instances] ****************************************************** 
<127.0.0.1> REMOTE_MODULE gce instance_names=mm2 machine_type=f1-micro image=ubuntu-1204-precise-v20150625 zone=europe-west1-d service_account_email= pem_file=../pkey.pem project_id=fancystuff-11
<127.0.0.1> EXEC ['/bin/sh', '-c', 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1437669562.03-233461447935889 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1437669562.03-233461447935889 && echo $HOME/.ansible/tmp/ansible-tmp-1437669562.03-233461447935889']
<127.0.0.1> PUT /var/folders/v4/ll0_f8lj7yl7yghb645h95q9ckfc19/T/tmpyDoPt9 TO /Users/d046179/.ansible/tmp/ansible-tmp-1437669562.03-233461447935889/gce
<127.0.0.1> EXEC ['/bin/sh', '-c', u'LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /usr/bin/python /Users/d046179/.ansible/tmp/ansible-tmp-1437669562.03-233461447935889/gce; rm -rf /Users/d046179/.ansible/tmp/ansible-tmp-1437669562.03-233461447935889/ >/dev/null 2>&1']
failed: [localhost -> 127.0.0.1] => {"failed": true, "parsed": false}
failed=True msg='libcloud with GCE support (0.13.3+) required for this module'


FATAL: all hosts have already failed -- aborting

还有我写的剧本的site.yml:

 name: Create a sandbox instance
  hosts: localhost
  vars:
    names: mm2
    machine_type: f1-micro
    image: ubuntu-1204-precise-v20150625
    zone: europe-west1-d
    service_account_email: xxx@developer.gserviceaccount.com
    pem_file: ../pkey.pem
    project_id: fancystuff-11
  tasks:
    - name: Launch instances
      local_action: gce instance_names={{names}} machine_type={{machine_type}}
                    image={{image}} zone={{zone}} service_account_email={{ service_account_email }}
                    pem_file={{ pem_file }} project_id={{ project_id }}
      register: gce

gce 云模块失败并显示错误消息“ibcloud with GCE support (0.13.3+) required for this module”。但是,从 ansible github repo 运行 gce.py 是可行的。python 脚本找到 apache-libcloud 库并打印一个包含所有正在运行的实例的 json。此外, pip install apache-libcloud 表明它已正确安装。

有什么我缺少的东西,比如指向 python 库(PYTHONPATH)的环境变量吗?


更新 1:

我在 gce 任务之前包括了以下任务:

- name: install libcloud
  pip: name=apache-libcloud

这也不会影响行为,也不会阻止任何错误消息。


更新 2:

我添加了以下任务来检查可用的 PYTHONPATH:

- name: Getting PYTHONPATH
  local_action: shell python -c 'import sys; print(":".join(sys.path))'
  register: pythonpath
- debug:  
    msg: "PYTHONPATH: {{ pythonpath.stdout }}"

返回以下内容:

PYTHONPATH: :/usr/local/lib/python2.7/site-packages/setuptools-17.1.1-py2.7.egg:/usr/local/lib/python2.7/site-packages/pip-7.0.3-py2.7.egg:/usr/local/lib/python2.7/site-packages:/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/lib/python27.zip:/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/lib/python2.7:/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin:/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac:/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages:/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk:/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old:/usr/local/Cellar/python/2.7.10/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload:/usr/local/lib/python2.7/site-packages:/Library/Python/2.7/site-packages

更新 3:

我引入了我自己的 test.py 脚本作为执行与 gce ansible 模块相同的 apache-libcloud 导入的任务。脚本导入就好了!!!

4

5 回答 5

2

设置 PYTHONPATH 解决了这个问题。例如:

$ export PYTHONPATH=/usr/local/lib/python2.7/site-packages/

于 2015-08-26T15:54:30.407 回答
1

我正在使用 OSX,我自己解决了这个问题。简短的回答:用 pip 安装 ansible。(而不是例如冲泡)

我检查了 Ansible 设置运行时的 PYTHONPATH,它看起来与我的正常系统 PYTHONPATH 无关。例如,对我来说,我的系统 PYTHONPATH 是空的,并且像 mlazarov 建议的那样设置并没有任何区别。我对它使用运行时的 PYTHONPATH 进行了 ansible 打印,它看起来像这样:

ok: [localhost] => {
"msg": "PYTHONPATH: :/usr/local/Cellar/ansible/1.9.4/libexec/lib/python2.7/site-packages:/usr/local/Cellar/ansible/1.9.4/libexec/vendor/lib/python2.7/site-packages:/Library/Frameworks/Python.framework/Versions/3.4/lib/python34.zip:/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4:/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/plat-darwin:/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/lib-dynload:/Library/Frameworks/Python.framework/Versions/3.4/lib/python3.4/site-packages"
}

所以只有ansible自己的站点包和一些奇怪的Python3安装(我使用的是python2.7)

这个讨论中的一些事情让我认为这可能是 ansible 安装的问题,我的 ansible 是用 brew 安装的。我用 pip 全局重新安装了它(只需运行 sudo pip install ansible),这解决了问题。现在 PYTHONPATH ansible 打印看起来好多了,我在开始时安装了 virtualenv python,并且不再需要“此模块需要具有 GCE 支持 (0.13.3+) 的 libcloud”。

于 2016-02-10T13:46:54.540 回答
0

就我而言,情况是:

pip install apache-libcloud
于 2019-04-13T22:06:31.563 回答
0

我能够通过使用当前站点包文件夹设置 PYTHONPATH 环境变量(导出 PYTHONPATH=/path/to/site-packages)来解决此问题。显然,ansible 在模块执行期间建立了自己的环境,并忽略了 python 中可用的任何路径,除了来自环境变量 PYTHONPATH 的路径。

我发现这是一种特殊的行为,在 ansible 网站上没有记录。

于 2015-07-24T10:12:21.030 回答
0

我有类似的环境设置。我在本节底部找到了一些信息:https ://github.com/jlund/streisand#prerequisites

本质上,您可以更新一些魔术文件,因此 brew'd ansible 将添加一个文件夹来搜索包:

mkdir -p ~/Library/Python/2.7/lib/python/site-packages
echo '/usr/local/lib/python2.7/site-packages' > ~/Library/Python/2.7/lib/python/site-packages/homebrew.pth

希望能为您解决!

于 2015-08-26T23:09:09.753 回答