首页 > 解决方案 > 使用 Ansible 进行 Vagrant 配置 - mysql_db 找不到 PyMySQL

问题描述

我正在使用以下 vagrantfile 启动一个 vagrant vm:

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure("2") do |config|
    config.vm.box = "centos/7"

    config.vm.network "private_network", ip: "192.168.1.15",
        virtualbox__intnet: true

    # provision with ansible playbook
    config.vm.provision "ansible_local" do |ansible|
        ansible.playbook = "provisioning/playbook.yml"
    end
end

provisioning/playbook.yml看起来像:

---
- name: Set up the things and stuff
  hosts: all
  become: true

  tasks:
  - name: Update Yum
    yum:
      name: "*" 
      state: latest

  - name: install yum utils
    yum:
      name: yum-utils
      state: present

  - name: install development tools
    yum:
      name: "@Development tools"
      state: present

  - name: install ius release
    yum:
      name: https://centos7.iuscommunity.org/ius-release.rpm
      state: present

  - name: install python36
    yum:
      name: python36u
      state: present

  - name: install pip36
    yum:
      name: python36u-pip
      state: latest

  - name: upgrade pip36 to latest version
    pip:
      name: pip
      extra_args: --upgrade
      executable: pip3.6

  - name: install pymysql for python3 (for app connection to mysql)
    pip:
      name: pymysql
      executable: pip3.6

  - name: Install MYSQL server
    yum:
      name: mariadb-server
      state: latest

  - name: start mariadb-server and enable it on reboot
    service: 
      name: mariadb 
      state: started 
      enabled: true

  - name: copy database dump file to server
    copy:
      src: files/db_restore_file.sql
      dest: /tmp

  - name: create database and tables
    mysql_db:
      state: import
      name: all
      target: /tmp/db_restore_file.sql 

当我运行时vagrant up,一切看起来都很漂亮,直到它到达 mysql_db 行,我收到以下错误消息:

致命:[默认]:失败!=> {"changed": false, "msg": "The PyMySQL (Python 2.7 and Python 3.X) or MySQL-python (Python 2.X) module is required."} 重试,使用:--limit @ /vagrant/provisioning/playbook.retry

好的....所以我vagrant ssh进入虚拟机检查事情。进入一个python3.6会话让我成功导入pymysql:

[vagrant@localhost ~]$ python3.6
Python 3.6.7 (default, Dec  5 2018, 15:02:05)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymysql
>>>

并且(为了这篇文章的完整性)当然没有用于 python 2 的 pymysql 模块(正如预期的那样......我没有安装一个......):

[vagrant@localhost ~]$ python
Python 2.7.5 (default, Oct 30 2018, 23:45:53)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-36)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pymysql
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named pymysql
>>>

这里发生了什么?在这种情况下,我是否需要告诉 Ansible(或 Vagrant)明确使用 python3.6?如果是这样,那么首选的方法是什么?我不想在那个 vm 上安装任何 python2.x 模块。

提前致谢,如果这里有任何遗漏的信息,请告诉我。

编辑#1

添加任务

  - name: Set ansible python interpreter to python3.6
    set_fact:
      ansible_python_interpreter: python3.6

告诉 VM 上的 Ansible 显式使用 python3.6。如果您在任务“将数据库转储文件复制到服务器”之前添加此内容,您将收到:

TASK [将数据库转储文件复制到服务器] *************************************** 致命: [默认]:失败!=> {"changed": false, "checksum": "...omitted_checksum...", "msg": "Aborting, target uses selinux but python bindings (libselinux-python) are not installed!"} 重试,使用:--limit @/vagrant/provisioning/playbook.retry

并且由于我似乎找不到使用 Ansible 为 python3.6 安装 libselinux-python 的干净方法,所以我只是在文件复制之后和“创建数据库和表”任务之前添加了 set_fact 任务......似乎工作但感觉像这样肮脏的切换python解释器。

标签: pythonpython-3.xansiblevagrantpymysql

解决方案


Ansible 将使用默认的 Python 安装,除非您告诉它这样做,因此由于您没有在 Python 2 下安装必要的模块,因此该模块会失败。

Ansible 提供了一个ansible_python_interpreter参数,该参数采用 Python 二进制文件的完整路径,它可以告诉 Ansible 使用 Python 的替代版本。您可以在不同的地方进行设置。通常,这是通过为需要使用 Python 3 的主机创建一个组在清单中完成的:

 [python3_hosts]
 some_host
 another_host

 [python3_hosts:vars]
 ansible_python_interpreter = /path/to/alt/python

但它也可以在 ansible.cfg、剧本的“vars”部分中设置,甚至可以在单个任务的“vars”部分中设置(免责声明:未尝试过。)


推荐阅读