Py学习  »  DATABASE

使用ansible的vagrant provisioning-mysql_db找不到pymysql

codeAndStuff • 6 年前 • 262 次点击  

我正在用下面的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行,在那里我得到以下错误消息:

致命:[默认]:失败!=>{“已更改”:false,“msg”:“pymysql (python 2.7和python 3.x)或mysql python(python2.x)模块是 需要。”} 要重试,请使用:-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吗?如果是的话,最好的方法是什么?我不想在那个虚拟机上安装任何python2.x模块。

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

编辑第1页

添加任务

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

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

任务[将数据库转储文件复制到服务器] ***************************************致命:[默认]:失败!=>{“changed”:false,“checksum”:“…省略“checksum…”,“msg”: “正在中止,目标使用selinux,但使用python绑定(libselinux python) 未安装!“} 要重试,请使用:-limit@/vagrant/provisioning/playbook.retry

而且,由于我似乎找不到一种干净的方法来安装带有ansible的python3.6的libselinux python,所以我只是在文件复制之后和“创建数据库和表”任务之前添加set_fact任务……似乎可以工作,但像这样切换python解释器感觉很脏。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43746
文章 [ 1 ]  |  最新文章 6 年前
clockworknet
Reply   •   1 楼
clockworknet    7 年前

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

Ansible提供了 ansible_python_interpreter 参数,它使用Python二进制的完整路径,它可以告诉ANTILE使用Python的另一个版本。你可以把它设置在各种各样的地方。通常,这是在资源清册中通过为需要使用python 3的主机创建组来完成的:

 [python3_hosts]
 some_host
 another_host

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

但它也可以被设置在一个剧本的“未完成”部分,甚至可能在一个单独任务的“未完成”部分(免责声明:没有尝试过)。