Ansible 要求安装 MySQL-python,尽管它已经安装

Posted

技术标签:

【中文标题】Ansible 要求安装 MySQL-python,尽管它已经安装【英文标题】:Ansible demands installing MySQL-python despite it was already installed 【发布时间】:2016-02-01 05:32:22 【问题描述】:

我正在尝试使用在 Mac OSX 上运行的 Ansible 控制器创建一个新的 mysql 数据库。当我第一次收到msg: the python mysqldb module is required 错误消息时,我添加了一个任务来安装MySQL-pythonpip。它已正确安装,但我仍然收到 Ansible 要求安装的错误。

我的最小剧本是:

- hosts: all
  tasks:
  - name: Ensure MySQL-python module is installed
    pip:
      name: MySQL-python
      executalbe: /usr/local/Cellar/python/2.7.10_2/bin/pip

  - name: Create test_db MySQL database
    mysql_db:
      name: test_db
      state: present

当我运行剧本时:

ansible-playbook -i "localhost," -c local mysql-test.yml

我得到以下结果(第一次运行时第一个任务使用changed):

TASK: [Ensure MySQL-python module is installed] **************************************
ok: [localhost]

TASK: [Create test_db MySQL database] *********************************************
failed: [localhost] => "failed": true
msg: the python mysqldb module is required

pip show MySQL-python 显示包已正确安装。

我运行的 Python 2.7.10 和 Ansible 1.9.4 都安装了homebrew,因此我不使用sudo

缺少什么?


我对照ubuntu/trusty64 Vagrant 机器检查了剧本,它运行没问题(OSX 是 Ansible 控制器,唯一的区别是@987654333 中的sudo 的要求@模块)。

我在第二台 Mac 上使用 -c local 在本地和通过 SSH 远程检查了剧本,并得到了与原始问题相同的 错误pip 通过 SSH 正常工作我必须添加executalbe=/usr/local/Cellar/python/2.7.10_2/bin/pip,否则它会报告msg: Failed to find required executable pip)

使用-c local -vvvv运行时的任务结果:

<localhost> REMOTE_MODULE mysql_db name=test_db state=present
<localhost> EXEC ['/bin/sh', '-c', 'mkdir -p $HOME/.ansible/tmp/ansible-tmp-1446497958.1-90296161052037 && chmod a+rx $HOME/.ansible/tmp/ansible-tmp-1446497958.1-90296161052037 && echo $HOME/.ansible/tmp/ansible-tmp-1446497958.1-90296161052037']
<localhost> PUT /var/folders/nw/2vnhg_gj77v_cyfv0p1vdfj80000gn/T/tmpK3DT_j TO /Users/techraf/.ansible/tmp/ansible-tmp-1446497958.1-90296161052037/mysql_db
<localhost> EXEC ['/bin/sh', '-c', u'LANG=en_US.UTF-8 LC_CTYPE=en_US.UTF-8 /usr/bin/python /Users/techraf/.ansible/tmp/ansible-tmp-1446497958.1-90296161052037/mysql_db; rm -rf /Users/techraf/.ansible/tmp/ansible-tmp-1446497958.1-90296161052037/ >/dev/null 2>&1']
failed: [localhost] => "failed": true
msg: the python mysqldb module is required

【问题讨论】:

如果手动调用python然后执行以下操作会得到什么? &gt;&gt;&gt; import MySQLdb &gt;&gt;&gt; print MySQLdb.__file__ 这应该返回模块安装的路径。这将验证 python 是否正确地找到了模块。 @BruceP 我得到了/usr/local/lib/python2.7/site-packages/MySQLdb/__init__.pyc。文件在那里,权限似乎没问题。 你是如何安装 pip / python 的? which pip 应该给你一个提示,我猜 MySQL-python 必须通过与 pip 相同的包管理器安装。 brew 是一个疯狂的猜测(在 Ubuntu 上,它必须与 apt 一起安装,作为并行) @tchap 我是通过 homebrew 安装 python 的(不用猜,我在原问题里写过)/usr/local/bin/pip@ -&gt; ../Cellar/python/2.7.10_2/bin/pip;然后我使用附带的剧本安装mysql-python,应该(?)使用默认pip执行,它指向上述可执行文件。 尝试使用非常详细的设置 -vvvv 运行您的剧本并给我们输出,也许我们会有更多信息。顺便说一句,你为什么使用 -c local ?你能放下它,看看是否效果更好? 【参考方案1】:

问题的原因是 Ansible 使用了默认的 OSX 的 Python (/usr/bin/python),当使用 -vvvv 选项运行时,它在结果中可见。

第一个任务成功了,因为默认 OSX 的 Python 调用 Homebrew 的 pip 可执行文件并为 Homebrew 的 Python 安装了 MySQL-python 模块。

第二个任务失败,因为它再次运行默认的 OSX 的 Python,需要 MySQL-python,但该版本没有安装该模块。

解决方案是使用选项指定 Ansible 使用的 Python 解释器的路径:

ansible-playbook -i "localhost," -c local --extra-vars "ansible_python_interpreter=/usr/local/bin/python" mysql-test.yml

或将ansible_python_interpreter=/usr/local/bin/python 添加到库存文件中。

同样的问题是mentioned,它包含其他可能解决方案的答案。

【讨论】:

以上是关于Ansible 要求安装 MySQL-python,尽管它已经安装的主要内容,如果未能解决你的问题,请参考以下文章

RHCE-B1. 按要求安装和配置 Ansible

在 Ruby 安装期间,RVM 在交互式提示中要求用户名

安装mysql-python

技术-自动化-ansible-ansible学习笔记

Linux解决MySQL-python安装失败问题

python2.7安装mysql-python