python - 如何为Python虚拟环境配置Ansible?

标签 python python-2.7 ansible virtualenv

我目前正在尝试运行一个使用回调插件的剧本。 该插件使用一个名为 datadog 的模块:

import datadog

当我尝试运行剧本时,收到一条错误消息:

ImportError: No module named datadog

为了解决这个问题,我创建了一个 virtualenv,激活它并安装了 datadog 模块:

virtualenv ansible -p python2.7
source ./ansible/bin/activate
pip install datadog

然后当我启动 python 并导入模块时,一切都很好:

python --version

Python 2.7.15

import datadog
print datadog

<module 'datadog' from
'/Users/admin/code/venvs/ansible/lib/python2.7/site-packages/datadog/__init__.pyc'>

因此,我相信该模块使用正确。

但是,当启动ansible playbook时,错误仍然存​​在:

ansible-playbook -i ../../local/hosts.ini my_playbook.yml -e "ansible_python_interpreter=/Users/admin/code/venvs/ansible/bin/python" -vvv

ansible-playbook 2.6.3
  config file = /Users/admin/code/src/playbooks/ansible.cfg
  configured module search path = [u'/Users/admin/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/local/Cellar/ansible/2.6.3/libexec/lib/python2.7/site-packages/ansible
  executable location = /usr/local/bin/ansible-playbook
  python version = 2.7.15 (default, Jul 23 2018, 21:27:06) [GCC 4.2.1 Compatible Apple LLVM 9.1.0 (clang-902.0.39.2)]
Using /Users/admin/code/src/playbooks/ansible.cfg as config file
Parsed /Users/admin/code/src/local/hosts.ini inventory source with ini plugin
statically imported: /Users/admin/code/src/playbooks/roles/security/tasks/security-ubuntu.yml
statically imported: /Users/admin/code/src/playbooks/roles/mariadb/tasks/cluster.yml
ERROR! Unexpected Exception, this is probably a bug: No module named datadog

据我所知,Ansible 没有考虑 virtualenv。我希望 Ansible 在 ansible python 模块位置 中使用 virtualenv 的路径。

如何让 ansible 使用 virtualenv?我在ansible文档中没有找到与python路径相关的任何内容:https://docs.ansible.com/ansible/2.5/reference_appendices/config.html

注意:该问题发生在运行 Ansible 的计算机上。不是正在配置的机器。

最佳答案

这似乎很正常,因为 Ansible 在您的情况下没有引用 Python 虚拟环境:

ansible python module location = /usr/local/Cellar/ansible/2.6.3/libexec/lib/python2.7/site-packages/ansible
executable location = /usr/local/bin/ansible-playbook

virtualenv中,未安装的软件包是从真实系统环境初始化的。因此,您可以通过在 virtualenv 中设置 Ansible 来实现它

看一下这个例子:

my_user@my_machine:~$ ansible --version
ansible 2.6.3
  ansible python module location = /usr/local/lib/python2.7/dist-packages/ansible
  executable location = /usr/local/bin/ansible
  python version = 2.7.15rc1 (default, Apr 15 2018, 21:51:34) [GCC 7.3.0]

virtualenv 中安装 Ansible

(py_venv) my_user@my_machine:~$ pip install ansible==2.5.5

Ansible指的是Python虚拟环境的路径:

(py_venv) my_user@my_machine:~$ ansible --version
ansible 2.5.5
  ansible python module location = /home/my_user/py_venv/local/lib/python2.7/site-packages/ansible
  executable location = /home/my_user/py_venv/bin/ansible
  python version = 2.7.15rc1 (default, Apr 15 2018, 21:51:34) [GCC 7.3.0]

ps:安装后需要停用并再次激活virtualenv一次才能从虚拟环境加载Ansible

关于python - 如何为Python虚拟环境配置Ansible?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52689144/

相关文章:

Python Eclipse PyDev

python - Pandas :将重复行的列分组到列表列中

python-2.7 - 如何在pytorch中为不同层设置不同的学习率?

Ansible 在任务中注册变量并在模板中使用它

Ansible 无法在 Redhat 中设置 GRUB 引导加载程序的密码

Python 在另一个脚本上引用数据库连接

python - 您无权访问此服务器上的 access/index.py

python : Clean and efficient way to remove items that are not convertable to int from list

python - python 2.7 的 mod_python

bash - vagrant ssh 后自动执行任务