python - 使用 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解释器。
解决方案
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”部分中设置(免责声明:未尝试过。)