如何为 Python 虚拟环境配置 Ansible?
How to configure Ansible for Python virtual environment?
我目前正在尝试 运行 使用回调插件的剧本。
这个插件使用了一个名为 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 module location
.
中使用 virtualenv 的路径
如何让 ansible 使用 virtualenv?我在 ansible 文档中没有找到与 python 路径相关的任何内容:https://docs.ansible.com/ansible/2.5/reference_appendices/config.html
注意:问题发生在 运行ning 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
。
我目前正在尝试 运行 使用回调插件的剧本。 这个插件使用了一个名为 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 module location
.
如何让 ansible 使用 virtualenv?我在 ansible 文档中没有找到与 python 路径相关的任何内容:https://docs.ansible.com/ansible/2.5/reference_appendices/config.html
注意:问题发生在 运行ning 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
。