### 測試你的 Puppet 配置清單
> If all else fails, immortality can always be assured by spectacular error.
>
> — J.K. Galbraith
你總會遭遇麻煩,就像趴在你的擋風玻璃上的一只蟲子。遺憾的是像 **Nagios** 那樣標準的檢測監視工具也不能面面俱到地檢測你要的一切。 許多技術指標對于排錯是很有幫助的,例如平均負載和磁盤占用, 我更希望我的系統能提供關于應用和服務的更高級別的信息。
例如,如果你運行的是一個 web 應用程序,你不能肯定它正監聽 80 端口并能返回 HTTP 200 OK 狀態。也許它只是返回 Apache 默認的歡迎頁面。
如果你的 web 應用程序是一個在線商店,例如:你可能希望檢查以下幾項:
* 大家能否看到預期的頁面(例如:“歡迎光臨 FooStore”)?
* 用戶能否正常登錄(假定應用程序支持 session 會話)?
* 搜索某種產品能否返回期待的結果?
* 響應時間是否令人滿意?
這種監控(專注于應用程序的行為,而不是對服務器自身指標的度量) 經常被稱作 **行為驅動的監控**(**behavior-driven monitoring**)。
與開發者改變代碼后經常使用行為驅動的測試(behavior-driven tests) 來校驗應用程序是否正常一樣, 你可以在產品上線后持續地使用行為驅動的監控。
事實上,感謝有 cucumber-nagios 這樣的工具存在,你可以和開發人員使用同樣的測試。 Lindsay Holmwood 為流行的 **Cucumber** 測試框架所做的封裝可以讓你運行針對 Nagios 的基于 Cucumber 的測試,這似乎是對 Nagios 進行評估的標準方法。
#### 準備工作
1. 為了安裝 cucumber-nagios ,你首先要安裝依賴的包。如果你在用 Ubuntu 或 Debian, 可能需要從源代碼安裝 **RubyGems** ,因為 cucumber-nagios 需要 RubyGems 1.3.6 或更高的版本。 從 RubyGems 站點: [http://rubygems.org/pages/download](http://rubygems.org/pages/download) 下載 **tarball** 。 解壓縮之后運行 ruby setup.rb 編譯并安裝此軟件包。
2. 接下來,你需要安裝相關依賴包:
```
# apt-get install ruby1.8-dev libxml2-dev
```
3. 最后,使用如下命令安裝 cucumber-nagios :
```
# gem install cucumber-nagios
```
#### 操作步驟
1. 一旦 RubyGems 和相關依賴安裝完成后,你就可以開始寫 Cucumber 測試了。 要做到這一點,首先使用 cucumer-nagios-gen 來幫助我們創建一個項目目錄和所需要的一切:
```
# cucumber-nagios-gen project mytest
Generating with project generator:
[ADDED] features/steps
[ADDED] features/support
[ADDED] .gitignore
[ADDED] .bzrignore
[ADDED] lib/generators/feature/%feature_name%.feature
[ADDED] Gemfile
[ADDED] bin/cucumber-nagios
[ADDED] lib/generators/feature/%feature_name%_steps.rb
[ADDED] README
```
你新創建的 cucumber-nagios 項目可以在 /root/mytest 找到。
下一步, 使用如下命令安裝所需的 RubyGems:
```
bundle install
```
你的項目已經作為一個 git 倉庫初始化了。
2. 有一個好主意是在項目目錄里運行 bundle install ,因為 cucumber-nagios 建議你這么做。這樣做的話 cucumber-nagios 會在項目目錄里安裝所有依賴的包。 然后你就可以移動項目目錄到其他任何一臺機器,不必再安裝依賴包就可以工作。
```
# cd mytest
# bundle install
```
3. 現在我們開始寫測試。下面的例子用于測試 Google 的主頁:
```
# cucumber-nagios-gen feature www.google.com home
Generating with feature generator:
[ADDED] features/www.google.com/home.feature
[ADDED] features/www.google.com/steps/home_steps.rb
```
4. 如果你要編輯 home.feature 文件, 會發現 cucumber-nagios 已經為你生成了一個基本的測試:
```
Feature: www.google.com
It should be up
Scenario: Visiting home page
When I go to "http://www.google.com"
Then the request should succeed
```
你可以在項目下使用如下命令運行這個測試:
```
# cucumber --require features features/www.google.com/home.feature
Feature: www.google.com
It should be up
Scenario: Visiting home page # features/www.google.
com/home.feature:4
When I go to "http://www.google.com" # features/steps/http_
steps.rb:11
Then the request should succeed # features/steps/http_
steps.rb:64
1 scenario (1 passed)
2 steps (2 passed)
0m0.176s
```
5. 假設一切正常(若不正常,請聯系 Google), 要對 Nagios 的檢測使用此特性, 你要做的所有工作就是使用 cucumber-nagios 代替 cucumber :
```
# bin/cucumber-nagios features/www.google.com/home.feature
CUCUMBER OK - Critical: 0, Warning: 0, 2 okay | passed=2;
failed=0; nosteps=0; total=2; time=0
```
#### 工作原理
任何腳本都可以成為 Nagios 監控的一個插件; 它只是返回執行完成后退出的狀態 (0 為成功,1 為警告,2 為緊急)。cucumber-nagios 封裝 Cucumber 來實現測試, 并且打印出有用信息,而后 Nagios 將通過警告或者 web 接口發送報告。
#### 更多用法
就其本身而言,并非你在此做的所有工作都有用。但不管怎樣,Cucumber 可以讓你寫出十分復雜的 Web 交互腳本: 你可以填寫表單字段、搜索、 單擊按扭、在頁面上匹配文本等等。要監控你的 web 應用或服務的任何特性, 首先弄清楚用戶使用 web 瀏覽器的行為習慣,然后根據這些用戶行為, 使用 Cucumber 創建自動監控腳本。
你可以從 Cucumber 網站 [http://cukes.info/](http://cukes.info/) 上找到更多關于 cucumber-nagios 的信息。
- 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
- 使用公共模塊
- 使用外部節點分類器
- 創建自定義的資源類型
- 創建自定義的提供者