我正在用下面的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解释器感觉很脏。