### 管理 Drupal 站點
**Drupal** 是一個內容管理系統,它通過插拔組裝一系列罐裝的模塊讓你快速構建網站, 它使用戶創建和編輯自己的內容變的相對容易。 Drupal 特別適合使用 Puppet 來管理,因為有一個強大的命令行工具 drush, 你可以使用這個工具安裝、管理 Drupal 站點。
如果我們將自動化管理 Drupal 站點的 drush 工具與我們已經創建的用于管理 MySQL 數據庫和 Apache 虛擬主機的 Puppet 處方相結合, 就可以使用單一資源創建一個安裝 Drupal 站點所需一切的新處方。
#### 準備工作
1. 創建一個新的 drupal 模塊如下:
```
# mkdir /etc/puppet/modules/drupal
# mkdir /etc/puppet/modules/drupal/manifests
```
2. 使用如下內容創建 /etc/puppet/modules/drupal/manifests/init.pp 文件:
```
class drupal {
$drupalversion = "7.2"
exec { "download-drush":
cwd => "/root",
command => "/usr/bin/wget http://ftp.drupal.org/files/
projects/drush-7.x-4.4.tar.gz ",
creates => "/root/drush-7.x-4.4.tar.gz",
require => Package["php5-mysql"],
}
exec { "install-drush":
cwd => "/usr/local",
command => "/bin/tar xvzf /root/drush-7.x-4.4.tar.gz",
creates => "/usr/local/drush",
require => Exec["download-drush"],
}
file { "/usr/local/bin/drush":
ensure => link,
target => "/usr/local/drush/drush",
require => Exec["install-drush"],
}
exec { "install-drupal":
cwd => "/var/www",
command => "/usr/local/drush/drush dl drupal-
${drupalversion}",
creates => "/var/www/drupal-${drupalversion}",
require => Exec["install-drush"],
}
file { "/var/www/drupal":
ensure => link,
target => "/var/www/drupal-${drupalversion}",
require => Exec["install-drupal"],
}
package { [ "libapache2-mod-php5",
"php5-mysql" ]: ensure => installed }
exec { "enable-mod-php5":
command => "/usr/bin/a2enmod php5",
creates => "/etc/apache2/mods-enabled/php5.conf",
require => Package["libapache2-mod-php5"],
}
}
```
#### 操作步驟
1. 在 init.pp 文件的 drupal 類中添加如下內容:
```
define site( $password, $sitedomain = "" ) {
include drupal
if $sitedomain == "" {
$drupal_domain = $name
} else {
$drupal_domain = $sitedomain
}
$dbname = regsubst( $drupal_domain, "\.", "" )
mysql::server::db { $dbname:
user => $dbname,
password => $password,
}
exec { "site-install-${name}":
cwd => "/var/www/drupal",
command => "/usr/local/bin/drush site-install -y
--site-name=${name} --sites-subdir=${drupal_domain}
--db-url=mysql://${dbname}:${password}@localhost/${dbname}",
creates => "/var/www/drupal/sites/${drupal_domain}",
require => [ File["/var/www/drupal"], Exec["install-drupal"],
Mysql::Server::Db[$dbname] ],
logoutput => on_failure,
}
apache::site { $drupal_domain:
documentroot => "/var/www/drupal",
}
}
```
2. 添加如下內容到一個節點:
```
drupal::site { "crispinfo.com":
password => "crunch",
}
```
3. 運行 Puppet:
```
# puppet agent --test
info: Retrieving plugin
info: Caching catalog for cookbook.bitfieldconsulting.com
info: Applying configuration version '1309783783'
notice: /Stage[main]//Node[cookbook]/Drupal::Site[crispinfo.com]/
Mysql::Server::Db[crispinfocom]/Exec[create-crispinfocom-db]/
returns: executed successfully
notice: /Stage[main]//Node[cookbook]/Drupal::Site[crispinfo.com]/
Apache::Site[crispinfo.com]/File[/etc/apache2/sites-available/
crispinfo.com.conf]/ensure: defined content as '{md5}15c5bbffa6128
fce0b8a3996914af549'
info: /Stage[main]//Node[cookbook]/Drupal::Site[crispinfo.com]/
Apache::Site[crispinfo.com]/File[/etc/apache2/sites-available/
crispinfo.com.conf]: Scheduling refresh of Exec[enable-crispinfo.
com-vhost]
notice: /Stage[main]//Node[cookbook]/Drupal::Site[crispinfo.com]/
Apache::Site[crispinfo.com]/Exec[enable-crispinfo.com-vhost]:
Triggered 'refresh' from 1 events
info: /Stage[main]//Node[cookbook]/Drupal::Site[crispinfo.com]/
Apache::Site[crispinfo.com]/Exec[enable-crispinfo.com-vhost]:
Scheduling refresh of Service[apache2]
notice: /Stage[main]/Apache/Service[apache2]: Triggered 'refresh'
from 1 events
notice: /Stage[main]//Node[cookbook]/Drupal::Site[crispinfo.com]/
Exec[site-install-crispinfo.com]/returns: executed successfully
notice: Finished catalog run in 22.51 seconds
```
4. 在 /etc/hosts 文件中創建一個條目將 crispinfo.com 指向你正在使用的節點 IP (如果還沒設置 DNS):
```
10.0.2.15 crispinfo.com
```
5. 在瀏覽器中檢查站點,以確保一切都已經正確創建。你應該看到 Drupal 的登錄提示,在下圖所示:

使用由 drush site-install 創建的默認的管理員登錄,用戶名為 admin 其口令為 admin。 顯然你應該為實際生產線上的站點設置強壯的口令 (查看 drush 文檔獲得如何使用命令行工具設置的信息)。
#### 工作原理
真是神奇呀!尤其是 drupal 類首先安裝 drush,然后使用它安裝 Drupal 的核心代碼 (你可以通過修改 $drupalversion 的值改變版本)。
drupal::sitedefine 為你想要創建的每個站點運行 drush site-install 。 在我們的例子中,創建了一個名為 crispinfo.com 的站點并為其傳遞了站點數據庫使用的口令, 其余的工作都由 drush 去完成。
drupal::site 也為我們的站點創建了所需的 **Apache 虛擬主機** (使用本章 [創建 Apache 虛擬主機](#ch07sec02) 一節中的處方) 和 **MySQL 數據庫** (使用本章 [創建 MySQL 數據庫及用戶](#ch07sec04) 一節中的處方)。
#### 更多用法
要管理 Drupal 站點,drush 可以幫你做很多事,包括更新 Drupal 的核心代碼、 安裝模塊和主題模板、管理用戶以及備份站點數據庫等。 你可以在 [http://drush.ws/](http://drush.ws/) 找到更多關于 drush 的信息。
- Puppet 2.7 Cookbook 中文版
- 中文翻譯版
- 譯者序
- 項目緣起
- 翻譯方法
- 社區鏈接
- 社區建議
- 貢獻者
- 原書版權頁
- 關于作者
- 前言
- 本書內容
- 閱讀前提
- 適用讀者
- 格式約定
- 讀者反饋
- 客戶支持
- 下載案例代碼
- 勘誤表
- Puppet 基礎設施
- 使用版本控制
- 使用提交鉤子
- 使用 Rake 部署變更
- 配置 Puppet 的文件服務器
- 從 cron 運行 Puppet
- 使用自動簽名
- 預簽名證書
- 從 Puppet 的 filebucket 檢索文件
- 使用 Passenger 擴展 Puppet 的部署規模
- 創建去中心化的分布式 Puppet 架構
- 監控、報告和排錯
- 生成報告
- 通過 Email 發送包含特定標簽的日志信息
- 創建圖形化報告
- 自動生成 HTML 文檔
- 繪制依賴關系圖
- 測試你的 Puppet 配置清單
- 執行模擬運行
- 檢測編譯錯誤
- 理解 Puppet 的錯誤信息
- 顯示命令的輸出結果
- 輸出調試信息
- 檢查配置設置
- 使用標簽
- 使用運行階段
- 使用不同的環境
- Puppet 語言及其寫作風格
- 使用 Puppet 社區規范
- 使用模塊
- 使用標準的命名規范
- 使用嵌入式 Ruby 代碼
- 使用純 Ruby 代碼書寫配置清單
- 遍歷多個項目
- 書寫強大的條件語句
- 在 if 語句中使用正則表達式
- 使用選擇器和 case 語句
- 檢測字符串中是否包含指定的值
- 使用正則表達式替換
- 書寫更優質的配置清單
- 使用資源的數組
- 使用 define 資源
- 指定資源的依賴關系
- 使用節點繼承
- 使用類的繼承和重載
- 給類傳遞參數
- 書寫可重用的跨平臺配置清單
- 獲得系統的環境信息
- 導入動態信息
- 從 CSV 文件導入數據
- 給 Shell 命令傳遞參數
- 使用文件和軟件包
- 為配置文件添加配置行
- 使用 Augeas 自動修改配置文件
- 使用配置片段構建配置文件
- 使用 ERB 模板
- 在模板中遍歷數組
- 從第三方倉庫安裝軟件包
- 配置 APT 軟件倉庫
- 配置 GEM 倉庫
- 從源碼包自動構建軟件
- 比較軟件包的版本
- 用戶和虛擬資源
- 使用虛擬資源
- 使用虛擬資源管理用戶
- 管理用戶基于密鑰的 SSH 訪問
- 管理用戶的自定義文件
- 有效地分發 cron 任務
- 當文件更新時運行命令
- 使用主機資源
- 為文件資源指定多個源
- 使用文件資源遞歸地分發整個目錄樹
- 清理過期的舊文件
- 使用日程表資源
- 資源的審計
- 臨時禁用資源
- 管理時區
- 應用程序
- 管理 Apache 服務
- 創建 Apache 虛擬主機
- 創建 Nginx 虛擬主機
- 創建 MySQL 數據庫及用戶
- 管理 Drupal 站點
- 管理 Rails 應用程序
- 服務器和云基礎設施
- 部署 Nagios 監控服務器
- 使用 Heartbeat 構建高可用服務
- 管理 NFS 服務和文件共享
- 使用 HAProxy 為多個 web 服務器實現負載均衡
- 使用 iptables 管理防火墻
- 管理 Amazon 的 EC2 實例
- 使用 Vagrant 管理虛擬機
- 外部工具和 Puppet 生態環境
- 創建 Facter 的自定義 fact
- 在運行 Puppet 之前和之后執行命令
- 從 Shell 會話生成 Puppet 配置清單
- 從運行的系統上生成 Puppet 配置清單
- 使用 Puppet Dashboard
- 使用 Foreman
- 使用 MCollective
- 使用公共模塊
- 使用外部節點分類器
- 創建自定義的資源類型
- 創建自定義的提供者