I am trying to create a new MySQL database with Ansible controller running on Mac OSX. When I first got msg: the python mysqldb module is required
error message, I added a task to install the MySQL-python
with pip
. It got installed correctly, however still I am still getting an error from Ansible demanding its installation.
My minimal playbook is:
- 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
when I run the playbook with:
ansible-playbook -i "localhost," -c local mysql-test.yml
I get the following result (with changed
for the first task upon first run):
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
shows the package got installed correctly.
I am running Python 2.7.10 and Ansible 1.9.4 both installed with homebrew
, thus I don't use sudo
.
What is missing?
I checked the playbook against ubuntu/trusty64
Vagrant machine and it worked with no problem (with OSX being the Ansible controller, the only difference was a requirement for sudo
in pip
module).
I checked the playbook on a second Mac both locally with -c local
and remotely via SSH and got the same error as in original question (for pip
to work correctly through SSH I had to add executalbe=/usr/local/Cellar/python/2.7.10_2/bin/pip
otherwise it reported msg: Failed to find required executable pip
)
The results of the task when run with -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
The reason for the problem was that Ansible used the default OSX's Python (/usr/bin/python
) which is visible in the results when run with -vvvv
option.
First task succeeded because default OSX's Python called Homebrew's pip
executable and installed the MySQL-python
module for the Homebrew's Python.
The second task failed because it run default OSX's Python again which required MySQL-python
, but the module was not installed for this version.
The solution was to use the option to specify the path to the Python interpreter to be used by Ansible:
ansible-playbook -i "localhost," -c local --extra-vars "ansible_python_interpreter=/usr/local/bin/python" mysql-test.yml
or to add ansible_python_interpreter=/usr/local/bin/python
to the inventory file.
The same problem was mentioned, it contains answers with other possible solutions.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With