本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Serverspec 進行基礎設施程式碼的測試驅動開發
由 Sushant Jagdale 建立 (AWS)
環境:PoC 或試行 | 技術: DevOps;基礎設施;混合雲端 | AWS 服務:Amazon EC2;AWS CodeBuild; AWS CodeDeploy |
Summary
此模式示範如何在 Amazon Web Services (TDD) Cloud 上撰寫基礎設施程式碼時,使用 Serverspec
Serverspec 可協助重構基礎設施程式碼。使用 Serverspec,您可以撰寫RSpec測試來檢查各種套件和軟體的安裝、執行命令、檢查執行中的程序和連接埠、檢查檔案許可設定等。Serverspec 會檢查伺服器是否設定正確。您只能在伺服器上安裝 Ruby。您不需要安裝任何代理程式軟體。
測試驅動的基礎設施提供下列優點:
跨平台測試
期望驗證
自動化的信心
基礎設施一致性和穩定性
提早失敗
您可以使用此模式來執行 Apache 軟體的 Serverspec 裝置測試,並在建立 Amazon Machine Image (AMI) 期間檢查檔案許可設定。只有在所有測試案例都通過時,AMI才會建立 。Serverspec 將執行下列測試:
Apache 程序正在執行。
Apache 連接埠正在執行。
Apache 組態檔案和目錄存在於特定位置等。
檔案許可已正確設定。
先決條件和限制
先決條件
作用中AWS帳戶
AWS CodeBuild
AWS CodeCommit
AWS CodePipeline
具有公有子網路的虛擬私有雲端 (VPC)
安裝AWS命令列介面 (AWS CLI) 和 Git
產品版本
HashiCorp Packer 版本:1.6.6
Ruby 版本:2.5.1 及更新版本
AWS CLI 版本:1.18.185
架構
目標架構
當您將程式碼推送至 CodeCommit 儲存庫時,Amazon CloudWatch Events 事件會與 進行互動 CodePipeline。在管道的第一個階段中,程式碼是從 擷取。 CodeCommit
第二個管道階段會執行 CodeBuild,以驗證和建置 Packer 範本。
作為 Packer 建置佈建器的一部分,Packer 安裝 Apache 和 Ruby 軟體。然後,佈建器呼叫 Shell 指令碼,該指令碼使用 Serverspec 來測試 Apache 程序、連接埠、檔案和目錄。Packer 後處理程式會寫入 JavaScript 物件標記 (JSON) 檔案,其中包含 Packer 在執行期間產生的所有成品清單
最後,會使用 Packer 產生的 AMI ID 建立 Amazon Elastic Compute Cloud (Amazon EC2) 執行個體。
工具
AWS CLI – Amazon Command Line Interface (AWS CLI) 是開放原始碼工具,可讓您使用命令列 Shell 中的命令與 AWS服務互動。
Amazon CloudWatch Events – Amazon CloudWatch Events 提供 near-real-time描述 Amazon Web Services (AWS) 資源變更的系統事件串流。
AWS CodeBuild – AWS CodeBuild 是 Cloud. CodeBuild compiles 中的全受管建置服務,可編譯原始程式碼、執行單位測試,並產生準備好部署的成品。
AWS CodeCommit – AWS CodeCommit 是由 Amazon Web Services 託管的版本控制服務。您可以使用 CodeCommit 將資產 (例如文件、原始程式碼和二進位檔案) 私下存放和管理在雲端。
AWS CodePipeline – AWS CodePipeline 是一項持續交付服務,可用來建立模型、視覺化和自動化發行軟體所需的步驟。您可以使用快速模型化和設定軟體發行程序的不同階段。
HashiCorp Packer
– HashiCorp Packer 是自動從單一來源組態建立相同機器映像的工具。 Serverspec
– Serverspec 會執行RSpec測試來檢查伺服器組態。Serverspec 使用 Ruby,您不需要安裝代理程式軟體。
Code
已連接程式碼。此程式碼使用以下結構,具有三個目錄和八個檔案。
├── amazon-linux_packer-template.json (Packer template) ├── buildspec.yaml (CodeBuild .yaml file) ├── pipeline.yaml (AWS CloudFormation template to automate CodePipeline) ├── rspec_tests (RSpec required files and spec) │ ├── Gem-file │ ├── Rakefile │ └── spec │ ├── apache_spec.rb │ └── spec_helper.rb └── scripts └── rspec.sh (Installation of Ruby and initiation of RSpec)
史詩
任務 | 描述 | 所需的技能 |
---|---|---|
建立 CodeCommit 儲存庫。 | 若要建立 CodeCommit 儲存庫,請執行下列命令。
| 開發人員、系統管理員、 DevOps 工程師 |
寫入RSpec測試。 | 為您的基礎設施建立RSpec測試案例。如需詳細資訊,請參閱其他資訊一節。 | 開發人員、 DevOps 工程師 |
將程式碼推送至 CodeCommit 儲存庫。 | 若要將連接的程式碼推送至 CodeCommit 儲存庫,請執行下列命令。
| 開發人員、系統管理員、 DevOps 工程師 |
建立管道。 | 若要建立管道,請執行其他資訊區段中的 AWSCLI命令。 | 開發人員、系統管理員、 DevOps 工程師 |
啟動管道。 | 向 CodeCommit 儲存庫遞交程式碼。對儲存庫的任何遞交都會啟動管道。 | 開發人員、系統管理員、 DevOps 工程師 |
測試 Apache URL。 | 若要測試AMI安裝,請使用下列 URL。
頁面會顯示「Hello from Apache」訊息。 | 開發人員、系統管理員、 DevOps 工程師 |
相關資源
其他資訊
寫入RSpec測試
此模式RSpec的測試位於 <repository folder>/rspec_tests/spec/apache_spec.rb
。
require 'spec_helper' describe service('httpd') do it { should be_enabled } it { should be_running } end describe port(80) do it { should be_listening } end describe file('/etc/httpd/conf/httpd.conf') do it { should exist } it { should be_owned_by 'root' } it { should contain 'ServerName www.example.com' } end describe file('/etc/httpd/conf/httpd.conf') do its(:content) { should match /ServerName www.example.com/ } end describe file('/var/www/html/hello.html') do it { should exist } it { should be_owned_by 'ec2-user' } end describe file('/var/log/httpd') do it { should be_directory } end describe file('/etc/sudoers') do it { should be_mode 440 } end describe group('root') do it { should have_gid 0 } end
您可以將自己的測試新增至/spec
目錄。
建立管道
aws cloudformation create-stack --stack-name myteststack --template-body file://pipeline.yaml --parameters ParameterKey=RepositoryName,ParameterValue=<provide repository-name> ParameterKey=ApplicationName,ParameterValue=<provide application-name> ParameterKey=SecurityGroupId,ParameterValue=<provide SecurityGroupId> ParameterKey=VpcId,ParameterValue=<provide VpcId> ParameterKey=SubnetId,ParameterValue=<provide SubnetId> ParameterKey=Region,ParameterValue=<provide Region> ParameterKey=Keypair,ParameterValue=<provide Keypair> ParameterKey=AccountId,ParameterValue=<provide AccountId> --capabilities CAPABILITY_NAMED_IAM
參數詳細資訊
repository-name
– AWS CodeCommit 儲存庫的名稱
application-name
– Amazon Resource Name (ARNs) 與 連結ApplicationName
;提供任何名稱
SecurityGroupId
– 來自您 AWS 帳戶且連接埠 80 開啟的任何安全群組 ID
VpcId
– 您的 的 ID VPC
SubnetId
– 您 中公有子網路的 ID VPC
Region
– 您執行此模式AWS的區域
Keypair
– 用來登入EC2執行個體的安全 Shell (SSH) 金鑰名稱
AccountId
– AWS您的帳戶 ID
您也可以使用 AWS 管理主控台建立 CodePipeline 管道,並傳遞與上一個命令列相同的參數。
附件
若要存取與本文件相關聯的其他內容,請解壓縮下列檔案: attachment.zip