ThePrudents.moodle
在 BlueMix 云环境中使用 Ansible 在 Ubuntu 14.04 上安装 Moodle
简介
Moodle 是一个开源的课程管理平台,可以让您创建在线学习网站。它的名称代表着模块化面向对象动态学习环境,具有许多功能,能够支持从少数学生到数百名学生的高效在线学习体验。
例如,您可以引入作业提交、测验、常见问题、评分、即时消息、讨论区等。但由于它是模块化的软件,可以通过插件扩展以添加额外功能。
Moodle 通常在 LAMP(Linux、Apache、MySQL 和 PHP)上运行,但也可以与其他网页服务器(如 nginx)一起使用,甚至可以在 Windows 下通过 IIS 使用。
模块化既有好处也有缺点 - 通常,如果您是老师,您有自己喜欢的主题和插件。这使得初始 Moodle 安装对非技术用户来说十分繁琐。
幸运的是,名为 Ansible 的部署自动化工具可以为您节省安装时间。
背景
需解决的挑战
- 描述所需的 Moodle 组件
- 可选地安装 MySQL(您也可以使用外部数据库)
- 可选地安装 LAMP(也许您会升级 Moodle 本身)
- 可选地安装您选择的 Moodle 插件和主题
- 安装 Moodle 核心组件
我们一步一步来。
描述所需的 Moodle 组件
根据官方安装教程,列出所需的包依赖和 PHP 扩展。
pkg_dependencies:
- git
- curl
- python-dev
- libmysqlclient-dev
- graphviz
- aspell
- clamav
- unzip
php_extensions:
- php5-mysql
- php5-intl
- php5-xmlrpc
- php5-pspell
- php5-curl
- php5-gd
- php5-ldap
对于 Moodle 本身,我们需要指定首选数据库访问参数、为 Moodle 实例分配的域名和首选位置。同时您可能想检查当前最新的稳定版本并指定它。
moodle_db_type: 'mysqli' # 'pgsql', 'mariadb', 'mysqli', 'mssql', 'sqlsrv' 或 'oci'
moodle_db_host: '{{mysql_host}}'
moodle_db_name: 'moodle'
moodle_db_user: 'moodle'
moodle_db_pass: 'moodle'
moodle_app_domain: "moodle.dev"
moodle_app_root: "/opt/moodle"
moodle_app_wwwroot: "{{ moodle_app_root }}/moodle"
moodle_app_datadir: "{{moodle_app_root}}/moodledata"
moodle_app_plugindir: "{{moodle_app_root}}/downloadedplugins"
# 检查网站 - 到目前为止 30 是最新的稳定版本
moodle_git_version: "MOODLE_30_STABLE"
moodle_artifact_baseurl: https://download.moodle.org/download.php/direct/stable30
moodle_archive_version: "moodle-latest-30.tgz"
moodle_user: "{{ansible_user_id}}"
moodle_admin_user: "6NHkm*S!^W4w"
Moodle 可以从 git 仓库或通过下载工件安装。git 选项被认为更易于维护。
这里支持两种方式,您可以选择最适合您的方式。
# 当前 git 是最简单的,也支持:网页
option_install_moodle: git
可选的 MySQL 安装
虽然 Moodle 支持多种数据库,但 MySQL 是最典型的 Unix 数据库。为了安装 MySQL,您只需要指定所需的 MySQL 根凭据。
mysql_host: "127.0.0.1"
mysql_root_user: root
mysql_root_password: SOMEROOTSECUREPASSWORD
Moodle 对 MySQL 配置有自己的首选项。这些由自定义的 my.cnf 模板解决,您可以在这个链接中查看: https://github.com/ThePrudents/moodle/blob/master/templates/mysql/my.cnf.j2
一个完整的安装 MySQL 的配方可以在这里找到: https://github.com/ThePrudents/moodle/blob/master/tasks/mysql.yml
可选的 LAMP 安装
对于 LAMP,我们可以选择以 worker 或 prefork 模式安装 Apache。这对 PHP 有影响:它将作为 PHP-FPM 或通过 mod_php Apache 模块安装。目前建议使用 worker。
apache_mode: worker # 使用 prefork 或 worker 变量
apache2_disable_default: true
php_family: default # 5.4 | 5.5 | 5.6 | default
您也可以查看安装 Apache 的配方(https://github.com/ThePrudents/moodle/blob/master/tasks/apache.yml)和 PHP 的配方(https://github.com/ThePrudents/moodle/blob/master/tasks/php_apache.yml)以获取更多细节。
请注意,由于 Moodle 需要安装额外的 PHP 扩展,我们引入了额外的步骤,可以在这里查看: https://github.com/ThePrudents/moodle/blob/master/tasks/php_additional_extensions.yml
可选的自定义 Moodle 插件和主题
大多数插件和主题通过将压缩包解压到相应的文件夹进行安装。我们可以轻松地自动化此过程,您只需告诉我们您首选的插件信息:
moodle_plugins:
- {
name: auth_googleoauth2,
desc: "认证:Google / Facebook / Github / Linkedin / DropBox / Windows / VK / Battle.net 认证",
url: "https://moodle.org/plugins/download.php/9695/auth_googleoauth2_moodle30_2015110600.zip",
dest: auth
}
- {
name: mod_checklist,
desc: "活动:检查清单",
url: "https://moodle.org/plugins/download.php/9703/mod_checklist_moodle30_2015110800.zip",
dest: mod
}
- {
name: block_xp,
desc: "区块:升级!",
url: "https://moodle.org/plugins/download.php/9400/block_xp_moodle30_2015092800.zip",
dest: blocks
}
- {
name: theme_essential,
desc: "主题:必需",
url: "https://moodle.org/plugins/download.php/10342/theme_essential_moodle30_2016010201.zip",
dest: theme
}
安装 Moodle 核心组件
在此步骤中,我们创建 Moodle 的目录(源、数据、插件),进行数据库配置,为此实例配置 Apache 虚拟主机。
步骤的详细信息可以在此位置查看: https://github.com/ThePrudents/moodle/blob/master/tasks/moodle.yml
代码演示
为了能够运行配置,我们需要 Ansible 和 Prudentia。这两个工具都是纯 Python。Ansible 是 DevOps 工具包,Prudentia 提供了一些“语法糖”来轻松运行 Ansible 剧本。有关更多详细信息,请参见 pypi https://pypi.python.org/pypi/prudentia
对于 Ubuntu,您获取工具的典型步骤为:
sudo apt-get install git
sudo apt-get install python-pip
pip install -U pip
pip install -U ansible==1.9.4
pip install prudentia
要重复使用 Moodle 角色,典型的语法为(请注意,您可以覆盖任何角色参数,这使得配方灵活):
roles:
- {
role: "pr-moodle",
moodle_db_host: '127.0.0.1',
moodle_db_name: 'moodle',
moodle_db_user: 'moodle',
moodle_db_pass: 'yoursupersecurepassword',
moodle_app_domain: "yourdomainname.com"
}
执行箱体配置的 Shell 文件:
# 静态参数
WORKSPACE=./
BOX_PLAYBOOK=$WORKSPACE/boxes/prod.yml
BOX_NAME=moodle_staging
BOX_ADDRESS=192.168.0.17
BOX_USER=youruser
BOX_PWD=yourpass
prudentia ssh <<EOF
unregister $BOX_NAME
register
$BOX_PLAYBOOK
$BOX_NAME
$BOX_ADDRESS
$BOX_USER
$BOX_PWD
provision $BOX_NAME
EOF
在 BlueMix 上运行
IBM Bluemix 是 IBM 开发的云平台即服务(PaaS)。它支持多种编程语言和服务,并集成了 DevOps 来构建、运行、部署和管理云上的应用程序。提供的服务之一是虚拟机。
我们选择 Ubuntu 14.04.3 LTS 镜像(可从官方官网下载)
我们需要为实例分配公共 IP 地址,并等待它初始化。
收到 Bluemix 平台的公共 IP 地址后,别忘了配置 DNS。
现在是执行配置的时候了。执行配置后,通常您将看到 Ansible 配置程序的成功日志。
任务: [pr-moodle | 配置 Moodle] ******************************************
已更改:[bluemix.moodle.dev]
任务: [pr-moodle | Moodle | 设置定时任务] **************************************
已更改:[bluemix.moodle.dev]
任务: [pr-moodle | Moodle | 创建 Moodle 数据库] ***************************
已更改:[bluemix.moodle.dev]
任务: [pr-moodle | Moodle | 创建 Moodle 数据库用户] ****************************
已更改:[bluemix.moodle.dev]
任务: [pr-moodle | Moodle | 创建 Apache 网站配置] *****************
已更改:[bluemix.moodle.dev]
任务: [pr-moodle | Moodle | 创建 Apache 网站配置] *****************
已正常:[bluemix.moodle.dev]
任务: [pr-moodle | Moodle | a2ensite moodle] **********************************
已更改:[bluemix.moodle.dev]
任务: [pr-moodle | Moodle | 为已下载插件创建目录] **********
已更改:[bluemix.moodle.dev]
任务: [pr-moodle | Moodle | 下载插件] *********************************
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/9695/auth_googleoauth2_moodle30_2015110600.zip', 'dest': 'auth', 'name': 'auth_googleoauth2', 'desc': '认证:Google / Facebook / Github / Linkedin / DropBox / Windows / VK / Battle.net 认证'})
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/9703/mod_checklist_moodle30_2015110800.zip', 'dest': 'mod', 'name': 'mod_checklist', 'desc': '活动:检查清单'})
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/9400/block_xp_moodle30_2015092800.zip', 'dest': 'blocks', 'name': 'block_xp', 'desc': '区块:升级!'})
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/10263/block_progress_moodle30_2016011300.zip', 'dest': 'blocks', 'name': 'block_progress', 'desc': '区块:进度条'})
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/10342/theme_essential_moodle30_2016010201.zip', 'dest': 'theme', 'name': 'theme_essential', 'desc': '主题:必需'})
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/10165/theme_academi_moodle30_2015122500.zip', 'dest': 'theme', 'name': 'theme_academi', 'desc': '主题:Academi'})
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/10321/theme_eguru_moodle30_2015122800.zip', 'dest': 'theme', 'name': 'theme_eguru', 'desc': '主题:Eguru'})
任务: [pr-moodle | Moodle | 为已下载插件创建目录] **********
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/9695/auth_googleoauth2_moodle30_2015110600.zip', 'dest': 'auth', 'name': 'auth_googleoauth2', 'desc': '认证:Google / Facebook / Github / Linkedin / DropBox / Windows / VK / Battle.net 认证'})
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/9703/mod_checklist_moodle30_2015110800.zip', 'dest': 'mod', 'name': 'mod_checklist', 'desc': '活动:检查清单'})
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/9400/block_xp_moodle30_2015092800.zip', 'dest': 'blocks', 'name': 'block_xp', 'desc': '区块:升级!'})
已正常:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/10263/block_progress_moodle30_2016011300.zip', 'dest': 'blocks', 'name': 'block_progress', 'desc': '区块:进度条'})
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/10342/theme_essential_moodle30_2016010201.zip', 'dest': 'theme', 'name': 'theme_essential', 'desc': '主题:必需'})
已正常:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/10165/theme_academi_moodle30_2015122500.zip', 'dest': 'theme', 'name': 'theme_academi', 'desc': '主题:Academi'})
已正常:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/10321/theme_eguru_moodle30_2015122800.zip', 'dest': 'theme', 'name': 'theme_eguru', 'desc': '主题:Eguru'})
任务: [pr-moodle | Moodle | 解压插件] ***********************************
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/9695/auth_googleoauth2_moodle30_2015110600.zip', 'dest': 'auth', 'name': 'auth_googleoauth2', 'desc': '认证:Google / Facebook / Github / Linkedin / DropBox / Windows / VK / Battle.net 认证'})
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/9703/mod_checklist_moodle30_2015110800.zip', 'dest': 'mod', 'name': 'mod_checklist', 'desc': '活动:检查清单'})
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/9400/block_xp_moodle30_2015092800.zip', 'dest': 'blocks', 'name': 'block_xp', 'desc': '区块:升级!'})
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/10263/block_progress_moodle30_2016011300.zip', 'dest': 'blocks', 'name': 'block_progress', 'desc': '区块:进度条'})
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/10342/theme_essential_moodle30_2016010201.zip', 'dest': 'theme', 'name': 'theme_essential', 'desc': '主题:必需'})
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/10165/theme_academi_moodle30_2015122500.zip', 'dest': 'theme', 'name': 'theme_academi', 'desc': '主题:Academi'})
已更改:[bluemix.moodle.dev] => (项目={'url': 'https://moodle.org/plugins/download.php/10321/theme_eguru_moodle30_2015122800.zip', 'dest': 'theme', 'name': 'theme_eguru', 'desc': '主题:Eguru'})
任务: [pr-moodle | UFW | 允许传入的 http 和 https] *************************
跳过:[bluemix.moodle.dev] => (项目=http)
跳过:[bluemix.moodle.dev] => (项目=https)
任务: [常见设置 | 防止 ucf 询问信息] **********************
跳过:[bluemix.moodle.dev]
任务: [常见设置 | 服务器已由 Prudentia 控制的日常消息] ***
已更改:[bluemix.moodle.dev]
任务: [常见设置 | 安装常用 apt 包] ****************************
已更改:[bluemix.moodle.dev] => (项目=build-essential,reptyr,htop,curl,python-software-properties,python-httplib2)
通知: [pr-moodle | 重启 apache2] ***************************************
已更改:[bluemix.moodle.dev]
执行回顾 ********************************************************************
bluemix.moodle.dev : ok=60 changed=52 unreachable=0 failed=0
执行耗时 3 分钟
如您所见,不到 5 分钟我们就准备好了 Moodle 的配置。
在访问网站时,我们会看到 Moodle 的初始启动屏幕。
看起来,一切配置正确。
初始设置顺利进行。
如我们所见,所有自定义的插件和主题均已就位,例如“区块:升级!”:
可以改进的地方
理想情况下,配方可以扩展为完全无交互。Moodle 似乎在未来允许这样的设置(参见 install.php)。不幸的是,目前文档没有提供干净的方法来做到这一点,除非您为现有的 Moodle 脚本化配置和数据库。
欢迎读者提出选项建议。