使用 Serverspec 進行基礎架構程式碼的測試驅動開發 - AWS 方案指引

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Serverspec 進行基礎架構程式碼的測試驅動開發

由蘇珊特杰格代爾(AWS)創建

環境:PoC 或試點

技術: DevOps; 基礎架構; 混合雲

AWS 服務:Amazon EC2; AWS CodeBuild; AWS CodeDeploy

Summary

此模式向您展示在 Amazon Web Services(AWS)雲上編寫基礎設施代碼時,如何使用 Serverspec 使用測試驅動開發(TDD)。該模式也涵蓋 AWS 的自動化 CodePipeline。TDD 將注意力集中在基礎設施代碼必須做什麼,並設置一個清晰的完成定義。您可以使用伺服器規格來測試 AWS CloudFormation、Terraform 依據和 Ansible 等工具建立的基礎設施。 HashiCorp

伺服器規格可協助重構基礎架構程式碼。使用 Serverspec,您可以編寫 RSpec 測試來檢查各種軟件包和軟件的安裝,運行命令,檢查正在運行的進程和端口,檢查文件權限設置,等等。伺服器規格會檢查您的伺服器是否設定正確。您只能在伺服器上安裝 Ruby。您不需要安裝任何代理程式軟體。

測試驅動的基礎架構具有以下優點:

  • 跨平台測試

  • 驗證期望

  • 對自動化充滿信心

  • 基礎架構一致性與穩

  • 提早失敗

您可以使用此模式為 Apache 軟體執行伺服器規格單元測試,並在建立 Amazon 機器映像 (AMI) 期間檢查檔案權限設定。只有在所有測試用例通過時,才會創建 AMI。伺服器規格將執行下列測試:

  • 阿帕奇進程正在運行。

  • 阿帕奇端口正在運行。

  • Apache 配置文件和目錄存在於某些位置,等等。

  • 檔案權限已正確設定。

先決條件和限制

先決條件

  • 有效的 AWS 帳戶

  • AWS CodeBuild

  • AWS CodeCommit

  • AWS CodePipeline

  • 具有公有子網路的虛擬私有雲 (VPC)

  • AWS Command Line Interface (AWS CLI) (AWS CLI) 和 Git 的安裝

產品版本

  • HashiCorp 封裝程式版本:1.6.6

  • 紅寶石版本:2.5.1 及更高版本

  • AWS CLI 版本:

架構

目標架構

Developer workflow diagram showing CodeCommit, Event, CodePipeline, AWS CodeBuild, and AMI creation.
  1. 當您將程式碼推送至 CodeCommit 儲存庫時,Amazon CloudWatch 事件會參與. CodePipeline 在管道的第一階段,代碼是從 CodeCommit中獲取。

  2. 第二個管線階段會執行 CodeBuild,此階段會驗證並建置 Packer 範本。

  3. 作為打包器構建佈建程序的一部分,打包器安裝 Apache 和 Ruby 軟件。然後佈建程式會呼叫使用 Serverspec 來單元測試 Apache 處理序、連接埠、檔案和目錄的殼層指令碼。封裝程式後處理器會寫入 JavaScript 物件標記法 (JSON) 檔案,其中包含 Packer 在執行期間產生的所有成品清單

  4. 最後,亞馬遜彈性運算雲端 (Amazon EC2) 執行個體是使用封包器產生的 AMI ID 建立的。

工具

  • AWS CLI — Amazon Command Line Interface (AWS CLI) (AWS CLI) 是一種開放原始碼工具,可使用命令列殼層中的命令與 AWS 服務互動。

  • Amazon CloudWatch 活動 — Amazon CloudWatch 活動提供了一系統事件 near-real-time 流,這些事件描述了 Amazon Web Services(AWS)資源的變化。

  • AWS CodeBuild — AWS CodeBuild 是雲端中的全受管建置服務。 CodeBuild 編譯您的原始程式碼、執行單元測試,並產生準備好部署的成品。

  • AWS CodeCommit — AWS CodeCommit 是由亞馬遜網路服務託管的版本控制服務。您可以使 CodeCommit 用在雲端中私有儲存和管理資產 (例如文件、原始程式碼和二進位檔案)。

  • AWS CodePipeline — AWS CodePipeline 是一種持續交付服務,可用來建立軟體發行所需步驟的模型、視覺化和自動化。您可以使用快速模型化和設定軟體發行程序的不同階段。

  • HashiCorp Packer — P HashiCorp acker 是一種工具,用於從單一來源配置自動創建相同的機器映像。

  • 伺服器規格 — 伺服器規格執行 RSpec 測試以檢查伺服器組態。伺服器規格使用 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)

史诗

任務描述所需技能
建立 IAM 使用者。

建立具有程式設計和主控台存取權的 AWS Identity and Access Management (IAM) 使用者。如需詳細資訊,請參閱 AWS 文件

開發者, 系統管理員, DevOps 工程師
設定 AWS 登入資料。

在本機電腦或環境中,為 IAM 使用者設定 AWS 登入資料。如需指示,請參閱 AWS 文件

開發者, 系統管理員, DevOps 工程師
測試您的認證。

若要驗證設定的認證,請執行下列命令。

aws sts get-caller-identity --profile <profile>
開發者, 系統管理員, DevOps 工程師
任務描述所需技能
創建一個 CodeCommit 存儲庫。

若要建立 CodeCommit 存放庫,請執行下列命令。

aws codecommit create-repository --repository-name "<provide repository-name>" --repository-description "repository to unit test the infrastructure code"
開發者, 系統管理員, DevOps 工程師
編寫 RSpec 的測試。

為您的基礎結構建立 RSpec 測試案例。如需詳細資訊,請參閱其他資訊一節。

開發者、 DevOps 工程師
將代碼推送到 CodeCommit 存儲庫。

若要將附加的程式碼推送至 CodeCommit 儲存庫,請執行下列命令。

git clone <repository url> cp -R /tmp/<code folder>/ <repository_folder>/ git add . git commit -m"initial commit" git push
開發者, 系統管理員, DevOps 工程師
建立管線。

若要建立管道,請執行其他資訊一節中的 AWS CLI 命令。

開發者, 系統管理員, DevOps 工程師
啟動配管。

將程式碼提交至 CodeCommit 儲存庫。對存儲庫的任何提交都將啟動管道。

開發者, 系統管理員, DevOps 工程師
測試阿帕奇網址。

若要測試 AMI 安裝,請使用下列 URL。

http://<your instance public ip>/hello.html

該頁面將顯示一個「你好從阿帕奇」消息。

開發者, 系統管理員, 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 資源名稱(ARN)與鏈接ApplicationName; 提供任何名稱

SecurityGroupId— AWS 帳戶中已開啟連接埠 80 的任何安全群組 ID

VpcId— 您的虛擬私人 VPC 的識別碼

SubnetId— VPC 中公有子網路的識別碼

Region— 您執行此模式的 AWS 區域

Keypair— 用於登入 EC2 執行個體的安全殼層 (SSH) 金鑰名稱

AccountId— 您的 AWS 帳戶識別碼

您也可以使用 AWS 管理主控台並傳遞上一 CodePipeline 個命令列中的相同參數來建立管道。

附件

若要存取與此文件相關聯的其他內容,請解壓縮下列檔案:attachment.zip