本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用 Serverspec 進行基礎架構程式碼的測試驅動開發
由蘇珊特杰格代爾(AWS)創建
環境:PoC 或試點 | 技術: DevOps; 基礎架構; 混合雲 | AWS 服務:Amazon EC2; AWS CodeBuild; AWS CodeDeploy |
Summary
此模式向您展示在 Amazon Web Services(AWS)雲上編寫基礎設施代碼時,如何使用 Serverspec
伺服器規格可協助重構基礎架構程式碼。使用 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 版本:
架構
目標架構
當您將程式碼推送至 CodeCommit 儲存庫時,Amazon CloudWatch 事件會參與. CodePipeline 在管道的第一階段,代碼是從 CodeCommit中獲取。
第二個管線階段會執行 CodeBuild,此階段會驗證並建置 Packer 範本。
作為打包器構建佈建程序的一部分,打包器安裝 Apache 和 Ruby 軟件。然後佈建程式會呼叫使用 Serverspec 來單元測試 Apache 處理序、連接埠、檔案和目錄的殼層指令碼。封裝程式後處理器會寫入 JavaScript 物件標記法 (JSON) 檔案,其中包含 Packer 在執行期間產生的所有成品清單
最後,亞馬遜彈性運算雲端 (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)
史诗
任務 | 描述 | 所需技能 |
---|---|---|
創建一個 CodeCommit 存儲庫。 | 若要建立 CodeCommit 存放庫,請執行下列命令。
| 開發者, 系統管理員, DevOps 工程師 |
編寫 RSpec 的測試。 | 為您的基礎結構建立 RSpec 測試案例。如需詳細資訊,請參閱其他資訊一節。 | 開發者、 DevOps 工程師 |
將代碼推送到 CodeCommit 存儲庫。 | 若要將附加的程式碼推送至 CodeCommit 儲存庫,請執行下列命令。
| 開發者, 系統管理員, DevOps 工程師 |
建立管線。 | 若要建立管道,請執行其他資訊一節中的 AWS CLI 命令。 | 開發者, 系統管理員, DevOps 工程師 |
啟動配管。 | 將程式碼提交至 CodeCommit 儲存庫。對存儲庫的任何提交都將啟動管道。 | 開發者, 系統管理員, DevOps 工程師 |
測試阿帕奇網址。 | 若要測試 AMI 安裝,請使用下列 URL。
該頁面將顯示一個「你好從阿帕奇」消息。 | 開發者, 系統管理員, 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