自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

自動化服務(wù)器配置管理工具Chef入門介紹

譯文
開發(fā) 開發(fā)工具 自動化
本文將向您介紹Chef生態(tài)系統(tǒng),如何實(shí)現(xiàn)配置管理,以及有關(guān)系統(tǒng)合規(guī)性的全面基礎(chǔ)知識。

[[434207]]

【51CTO.com快譯】本文將向您介紹Chef生態(tài)系統(tǒng),如何實(shí)現(xiàn)配置管理,以及有關(guān)系統(tǒng)合規(guī)性的全面基礎(chǔ)知識。我們的主要服務(wù)對象是那些編碼經(jīng)驗(yàn)有待提升的初學(xué)讀者。閑言少敘,讓我們從最基本的術(shù)語開始介紹:

  • Chef Cookbooks – Cookbooks(是Chef Code的組織方式。Cookbooks包含了許多非常重要的recipe、配置文件(profile)和子目錄。它們定義了將各種應(yīng)用于被管理系統(tǒng)的配置和合規(guī)性控制。
  • Chef Server – Chef Infra Server(架構(gòu)服務(wù)器)會存儲Cookbook、配置文件、策略文件(policyfile)、以及其他Chef代碼,并將它們分享給被管理的目標(biāo)節(jié)點(diǎn)。也就是說,它既包括了那些已分配的cookbook和配置文件的系統(tǒng)的信息,又維護(hù)著與目標(biāo)環(huán)境有關(guān)的信息搜索索引,因此您可以按需便捷地識別和管理系統(tǒng)中的各個離散子集。
  • Chef Automate – 作為Chef的企業(yè)級平臺,Chef Automate許開發(fā)人員、運(yùn)營和安全工程師通過協(xié)作,交付出應(yīng)用程序和基礎(chǔ)架構(gòu)的更改,以及合規(guī)性的狀態(tài)。Chef Automate提供了橫跨多個數(shù)據(jù)中心和云服務(wù)提供商的洞察力。它可以與Chef Infra Server和Habitat Builder一起被安裝,以提供完整的Chef體驗(yàn)。您可以通過鏈接--https://www.youtube.com/watch?v=XlCyd_DH1YU,了解更多有關(guān)Automate的設(shè)置與運(yùn)行。
  • Chef Client – Chef Client是運(yùn)行在諸如Linux、Windows或MacOS等管理系統(tǒng)上的代理。它通過與Chef Server通信,以提取策略文件或run_list所需的cookbook、合規(guī)性配置文件、以及相關(guān)配置,然后執(zhí)行recipe和合規(guī)性的掃描,并將其結(jié)果報告發(fā)回Chef Server。
  • Chef InSpec – 通過提供審計和合規(guī)性配置文件,Chef InSpec可用于測試您的Cookbook邏輯,并確保您的系統(tǒng)處于預(yù)期的狀態(tài)。與Chef cookbook類似,其配置文件由Chef Client觸發(fā)和應(yīng)用,并通過CLI和Chef Automate儀表板返回輸出的結(jié)果。那些被成功應(yīng)用的配置文件,將顯示系統(tǒng)是否合規(guī)。
  • Chef Workstation – Chef Workstation包含了著手編寫和使用Chef cookbook所需的一切。其中包括:用于與Chef Server通信的命令行實(shí)用程序,以及在更新環(huán)境之前,在本地驗(yàn)證cookbook的測試工具。它可以免費(fèi)地安裝在Linux、macOS和Windows系統(tǒng)上,并包含嵌入式的Ruby和其他開箱即用的依賴項(xiàng)。由于該“工具箱”包含了用于創(chuàng)建和構(gòu)建Chef的所有內(nèi)容,因此它取代了現(xiàn)已過時的ChefDK。
  • Chef Repo – Chef Repo是Workstation或筆記本電腦上存儲Chef內(nèi)容的目錄結(jié)構(gòu)。它通常位于根目錄下,例如:在Linux的/home/jsmith/chef-repo、macOS的/Users/jsmith/chef-repo、以及Windows的C:\Users\jsmith\chef-repo上。當(dāng)然,它也可以被創(chuàng)建在系統(tǒng)中的任何位置(只是因?yàn)橹髂夸浉阌谟涀『鸵?。一種常用的做法是,使用Git或其他版本控制工具,為版本、遠(yuǎn)程保存和共享代碼初始化相應(yīng)的目錄。
  • Test Kitchen – Test Kitchen通過驅(qū)動程序的插件架構(gòu),以方便用戶使用Docker、VMware、Hyper-V、VirtualBox、以及其他虛擬機(jī)管理程序,在本地測試Chef Cookbook和合規(guī)性配置文件。同時,它也能夠?qū)碜訟mazon EC2、Google Compute Engine和Microsoft Azure等云服務(wù)提供商的云實(shí)例進(jìn)行測試。而且,用戶還能夠使用Test Kitchen實(shí)現(xiàn)快速開發(fā)、測試和代碼排障。
  • Chef Supermarket – 目前,Chef社區(qū)里有著4000多個由Chef工程師、以及合作伙伴編寫的開源式Cookbook。Chef Supermarket為此提供了公開可用的存儲庫,以滿足個人或組織的使用、檢查或修改等特定需求。

第 1 部分:Chef Infra Server

雖然我們可以通過在Workstation上使用Chef Zero,實(shí)現(xiàn)在不運(yùn)行完整Chef Infra Server的情況下,體驗(yàn)Chef,但是若要獲得完整的使用體驗(yàn),您最好還是運(yùn)行本地或基于云端的Chef服務(wù)器。畢竟,成熟的Chef Infra Server并不需要太多的資源,單個VM或適當(dāng)?shù)脑茖?shí)例即可。而且,它可以為您提供在目標(biāo)節(jié)點(diǎn)之間,存儲和分發(fā)代碼的完整體驗(yàn)。

Chef Infra Server的安裝并不困難。它可以與Chef Automate和Chef Habitat Builder并行安裝,以實(shí)現(xiàn)與應(yīng)用程序的持續(xù)集成。實(shí)際上,每個Chef產(chǎn)品都可以使用獨(dú)立的二進(jìn)制文件--Chef-automate,通過“產(chǎn)品標(biāo)志(product flag)”在大約15分鐘內(nèi),對Chef服務(wù)器完成快速的安裝和配置。

同時,您也可以從Amazon及其云端市場,部署Chef服務(wù)器。這些系統(tǒng)都已預(yù)先配置好了Chef Automate和Chef Infra Server,您只需創(chuàng)建一個管理員用戶和一個組織即可開始使用。下面是其運(yùn)行的先決條件:

  • 至少2顆CPU、8 GB RAM、以及32 GB的磁盤虛擬機(jī),運(yùn)行諸如Ubuntu 20.04或CentOS 8等操作系統(tǒng)(注意:這是遠(yuǎn)低于生產(chǎn)環(huán)境的最低系統(tǒng)要求)。
  • VM擁有靜態(tài)的IP地址。
  • 具有sudo權(quán)限的非root用戶。
  • 允許Chef服務(wù)器與Workstation、及Linux、Windows或macOS目標(biāo)節(jié)點(diǎn)(可以是其他VM)通信的子網(wǎng)。
  • 子網(wǎng)上的可選DNS條目,允許服務(wù)器、節(jié)點(diǎn)和Workstation通過FQDN進(jìn)行通信。如果沒有DNS,則需編輯Chef服務(wù)器和目標(biāo)節(jié)點(diǎn)上的hosts文件,以便它們可以通過name相互訪問。
  • 或者已經(jīng)完成了AWS或Azure Marketplace的部署。

請?jiān)谝慌_原始的Linux VM中登錄shell,并運(yùn)行如下命令,或簡單地復(fù)制deploy-chef-server.sh腳本中的內(nèi)容(請?jiān)谶\(yùn)行之前,更新變量):

  1. $ chmod +x deploy-chef-server.sh 
  2. $ ./deploy-chef-server.sh 

您也可以在沒有腳本的情況下,通過如下步驟部署Chef服務(wù)器:

設(shè)置hostnamectl set-hostname hostname文件中的fqdn值與hostname –f的系統(tǒng)值相匹配,畢竟在安裝的過程中,我們會使用FQDN去設(shè)置證書。

  1. $ hostnamectl set-hostname automate.chef.lab 

通過下載可執(zhí)行的獨(dú)立包,去安裝Chef-automate工具。

  1. $ curl https://packages.chef.io/files/current/latest/chef- automate-cli/chef-automate_linux_amd64.zip | gunzip - > chef- automate && chmod +x chef-automate 

請按照如下方式調(diào)整環(huán)境設(shè)置:

  1. $ sudo sysctl -w vm.max_map_count=262144 
  2. $ sudo sysctl -w vm.dirty_expire_centisecs=20000 

為了防止重啟后發(fā)生變化,請確保寫入/etc/sysctl.conf。即,通過執(zhí)行Chef-automate來部署Chef Infra Server:

  1. $ sudo ./chef-automate deploy --product infra-server 

為了能夠在服務(wù)器和Workstation之間提供安全的訪問,并定位Chef內(nèi)容,請使用Chef服務(wù)器來創(chuàng)建管理員用戶和組織。我們可以通過chef-server org-create命令,使用--association-user參數(shù)來創(chuàng)建用戶名admin:

  1. $ sudo Chef-server-ctl user-create jsmith Jack Smith jsmith@gmail.com "password" --filename jsmith.pem 
  2. $ sudo Chef-server-ctl org-create lab“我的實(shí)驗(yàn)室”--association_user jsmith --filename lab-validator.pem 

上述命令生成了jsmith.pem和lab-validator.pem兩個證書文件。在第 2 部分中,我們將把jsmith.pem文件復(fù)制到Workstation上,以實(shí)現(xiàn)Chef服務(wù)器和筆記本電腦之間的安全通信。

第 2 部分:Chef Workstation

作為一組工具,Chef Workstation包括Chef、knife、inspec、cookstyle、habitat、kitchen、以及嵌入式Ruby等依賴項(xiàng)。您可以通過下載特定于操作系統(tǒng)的安裝程序,或使用Chef install.sh腳本,來安裝Chef Workstation。

如果使用特定于操作系統(tǒng)的安裝程序,請?jiān)诃h(huán)境中設(shè)置Chef shell-init,并添加嵌入式Chef二進(jìn)制文件的路徑。這可以確保Workstation工具使用嵌入式的Ruby版本。其中,在Linux系統(tǒng)上的語句為:

  1. $ echo 'eval "$(chef shell-init bash)"' >> /home/$USER/.bash_profile 
  2. $ echo 'export PATH="/opt/chef-workstation/embedded/bin:$PATH"' >> /home/$USER/.configuration_file 

我們可以通過在終端上運(yùn)行如下命令,來確認(rèn)安裝:

  1. $ chef -v 
  2.   Chef Workstation version: 21.10.640 
  3.   Chef CLI version: 5.4.2 
  4.   Chef Habitat version: 1.6.351 
  5.   Test Kitchen version: 3.1.0 
  6.   Cookstyle version: 7.25.6 
  7.   Chef Infra Client version: 17.6.18 
  8.   Chef InSpec version: 4.46.13 

我們繼續(xù)使用Chef生成器,來為所有的Chef Cookbook和其他文件創(chuàng)建Chef存儲庫,以及包括~/chef-repo/cookbooks在內(nèi)的多個子目錄:

  1. $ cd ~ 
  2. $ chef generate repo chef-repo 

為了便于Workstation能夠與Chef服務(wù)器進(jìn)行通信和交互,我們需要創(chuàng)建一個憑證文件。它位于主目錄中的.chef目錄中,例如:/home/jsmith/.chef。該文件夾和憑據(jù)文件,可以由另一個生成器所創(chuàng)建:

  1. $ knife configure init-config 

在終端里運(yùn)行上述命令時,系統(tǒng)會向您提出包括:Chef服務(wù)器的URL和設(shè)置服務(wù)器時創(chuàng)建的用戶名等問題。而命令完成后,系統(tǒng)會輸出~/.chef/credentials文件,其內(nèi)容為:

  1. [default
  2. client_name = 'jsmith' 
  3. client_key = '~/.chef/jsmith.pem' 
  4. Chef_server_url = 'https://automate.chef.lab/organizations/lab' 

通過編輯憑據(jù)文件,我們可以添加默認(rèn)的cookbook位置,在本例中為~/chef-repo。當(dāng)然,您也可以添加多個路徑,例如:['/path/to/one', '/path/to/two']:

  1. cookbook_path = ['~/chef-repo/cookbooks'

上述.credentials文件中的client_key條目,會指向user.pem文件。我們可以將此文件從Chef服務(wù)器復(fù)制到Workstation,并使用scp之類的工具,將其放入~/.chef/目錄。當(dāng)然,您也可以復(fù)制Chef服務(wù)器上的user.pem文件內(nèi)容,并粘貼到Workstation上的新文件中:

  1. $ cd ~ / .chef 
  2. $ scp jsmith@automate.chef.lab:/home/jsmith/jsmith.pem。  

接著,Chef Workstation會自動將準(zhǔn)備好的證書放入~/.chef/trusted_certs文件夾中,以用于安全通信。

  1. $ knife ssl fetch 
  2. $ knife ssl check 

成功驗(yàn)證了證書后,我們可以使用另一個簡單的Knife命令,去測試Workstation和 Chef服務(wù)器之間的連接。它將返回我們在設(shè)置Chef服務(wù)器時,所創(chuàng)建的客戶端組織的名稱:

  1. $ knife client list 
  2. lab-validator 

在完成了Chef Infra Server和Chef Workstation的設(shè)置后,我們可以開始使用Chef來配置和管理各個節(jié)點(diǎn)了。值得注意的是,這些配置步驟雖然對于實(shí)驗(yàn)室和企業(yè)內(nèi)部環(huán)境都是理想的,但是在生產(chǎn)環(huán)境中,請務(wù)必遵循Chef服務(wù)器的系統(tǒng)要求。

接著,請?jiān)赪orkstation上安裝VS Code并添加Chef擴(kuò)展。其自動化完成功能和內(nèi)置的Chef語言參考,會使您能夠輕松地開始編寫Chef代碼。

第 3 部分:Chef Cookbook

在本節(jié)中,我們將創(chuàng)建一個簡單的cookbook,以便在系統(tǒng)上運(yùn)行Chef客戶端代理時進(jìn)行各項(xiàng)操作。

為了讓Chef實(shí)現(xiàn)系統(tǒng)的自動化和合規(guī)性,Chef Infra Client會通過bootstrap進(jìn)程被安裝在每個節(jié)點(diǎn)上,并伴隨著安裝一個能夠與Chef服務(wù)器進(jìn)行通信client.rb文件。據(jù)此,您可以使用簡單的Cookbook來自動化該過程,以實(shí)現(xiàn)系統(tǒng)每隔30分鐘檢查一次Chef服務(wù)器。

下面,我們將從近250個內(nèi)置的Chef資源中,選用windows_taskcron源,通過創(chuàng)建一個recipe,在Linux和Windows系統(tǒng)上實(shí)現(xiàn)每隔30分鐘運(yùn)行一次Chef-client。其中,Linux是通過cron完成作業(yè)的;而Windows則是通過Windows Task完成的。

創(chuàng)建Cookbook

在Workstation上,請導(dǎo)航到~/chef-repo/cookbooks文件夾,并使用Chef cookbook生成器來創(chuàng)建一個名為run-chef-client的cookbook:

  1. $ cd ~/chef-repo/cookbooks 
  2. $ Chef generate Cookbookrun-chef-client -k dokken 

這將創(chuàng)建一個名為run-chef-client的新目錄。其中,-k dokken標(biāo)志生成一個Test Kitchen的kitchen.yml文件,實(shí)現(xiàn)預(yù)配置與Docker的協(xié)同。

請通過如下命令,切換到新的./run-chef-client目錄,并列出其具體內(nèi)容:

  1. $ cd ~/chef-repo/cookbooks/run-chef-client 
  2. $ tree 
  3. ├── CHANGELOG.md 
  4. ├── chefignore 
  5. ├── kitchen.yml 
  6. ├── LICENSE 
  7. ├── metadata.rb 
  8. ├── Policyfile.rb 
  9. ├── README.md 
  10. ├── recipes 
  11. │   └── default.rb 
  12. └── test 
  13.     └── integration 
  14.         └── default 
  15.             └── default_test.rb 

請使用如下命令創(chuàng)建兩個目錄,來分別保存屬性(使用另一個Chef生成器)與合規(guī)性配置文件:

  1. $ cd ~/chef-repo/cookbooks/run-chef-client 
  2. $ chef generate attribute default $ mkdir -p ./compliance/profiles 

我們可以通過編輯metadata.rb文件,來包含維護(hù)者的信息。這些信息將被自動傳遞到Chef生成器,以創(chuàng)建諸如recipes、文件和模板等文件:

  1. name 'run-chef-client' 
  2. maintainer 'John Tonello' 
  3. maintainer_email 'jtonello@chef.lab' 
  4. license ' Apache-2.0' 
  5. description 'Set chef-client to run every 30 minutes' 
  6. version '0.1.0' 
  7. chef_version '>= 16.0' 

您在創(chuàng)建cookbook時,可以通過如下命令,標(biāo)志maintainer、maintainer_email和license的值。

  1. $ chef generate cookbook run-chef-client -k dokken -C 'John Tonello' -m 'jtonello@chef.lab' -I 'apachev2' 

創(chuàng)建Recipe

請將如下內(nèi)容輸入./cookbooks/run-chef-client/recipes/default.rb文件,并按需更新其標(biāo)題。注意,用戶和密碼應(yīng)匹配您的環(huán)境。該recipe包括了在Windows和非Windows系統(tǒng)上工作的邏輯。在更為復(fù)雜的Cookbook中,您可能有不同名稱的多個Cookbook。注意,請務(wù)必將帶有路徑的include_recipe資源運(yùn)用到default.rb的recipe上。

  1. # Cookbook:: client-run 
  2. # Recipe:: default 
  3. # Copyright:: 2021, John Tonello, All Rights Reserved. 
  4.  
  5. include_profile 'run-chef-client::client-run' 
  6.  
  7. if platform?('windows'
  8.   windows_task 'run-chef-client' do 
  9. user 'WIN10\jtonello' 
  10.     password 'Sup3r!Us3r!' 
  11.     command 'chef-client' 
  12.     run_level :highest 
  13.     frequency :minute 
  14.     frequency_modifier 30 
  15.   end 
  16. else 
  17.   cron 'Run chef-client every 30 minutes' do 
  18.     minute '0,30' 
  19.     user 'root' 
  20.     command '/usr/bin/chef-client' 
  21.     action :create 
  22.   end 
  23. end 

其中,include_profile一行是Chef Infra Client 17.5.22的一項(xiàng)新功能。它允許您定義要在recipe中正確關(guān)聯(lián)到Cookbook的合規(guī)性資料。據(jù)此,當(dāng)您在第 5 部分中使用Policyfile工作流時,您的配置文件將被鏈接和上傳。而在Chef中,'run-chef-client::client-run'是指向~/chef-repo/cookbooks/run-chef-client/compliance/profiles/client-run/的。

該recipe中的if...else語句會告知Chef去運(yùn)行windows_task(如果平臺是 Windows)或cron資源(如果平臺是Linux和macOS)。而且,Windows Task需要用到用戶、密碼、以及以該用戶的身份去運(yùn)行的chef-client命令。最終,這兩種資源都會將任務(wù)設(shè)置為每30分鐘運(yùn)行一次。

在保存了recipe后,我們便可以通過運(yùn)行Chef Cookstyle,來檢查其語法是否正確。如果檢測到錯誤,它會使用-a標(biāo)志來予以自動更正。

  1. $ cookstyle -a 

當(dāng)結(jié)果報告“沒有違規(guī)”時,Cookbook可被認(rèn)為在語法上是正確的。

如果您只想將cookbook應(yīng)用到一個節(jié)點(diǎn),并不想添加合規(guī)性的話,則可以將cookbook上傳至Chef服務(wù)器,引導(dǎo)單個節(jié)點(diǎn),然后應(yīng)用至cookbook。下面代碼展示了該過程,不過,這往往認(rèn)為是一種比較舊的工作流程:

  1. $ knife cookbook upload run-chef-client  
  2. $ knife cookbook list  
  3. chef-client       0.1.0  
  4. $ knife bootstrap ubuntuserver01.fakedomain.tld -U ubuntu -i ~/.ssh/id_rsa.pub --sudo -N ubuntuserver01 -r 'recipe[run-chef-client]' 

第 4 部分:Chef InSpec Profile

Chef InSpec Profiles提供了對于節(jié)點(diǎn)狀態(tài)、及其合規(guī)性的洞察。也就是說,它會告訴您所應(yīng)用的Cookbook是否處于期望狀態(tài)。

當(dāng)您從終端和Chef Automate Compliance儀表板處運(yùn)行Chef-client命令時,Chef InSpec會執(zhí)行復(fù)雜的任務(wù),并通過CLI報告合規(guī)性數(shù)據(jù)。在完成該任務(wù)之后,您需要創(chuàng)建一個cookbook屬性文件、以及一個包含有controls的配置文件。

創(chuàng)建屬性文件

請?jiān)趓un-chef-clientCookbook文件夾的根目錄中,運(yùn)行如下命令,以在run-chef-clientCookbook文件夾中生成一個屬性目錄。同時,該文件夾也包含一個名為default.rb的文件:

  1. $ chef generate attribute default 

您可以編輯./attributes/default.rb,并添加如下內(nèi)容:

  1. default['audit']['reporter'] = %w(chef-server-automate cli) 

默認(rèn)的['audit']['reporter']條目會輸出到Chef自動化和CLI處。

創(chuàng)建配置文件并編輯inspec.yml文件

我們可以使用Chef生成器,生成一個新的配置文件:

  1. $ inspec init profile [path-to-cookbook-root] [profile-name

例如:

  1. $ cd ~/chef-repo/cookbooks/run-chef-client/compliance/profiles/ 
  2. $ inspec init profile client-run 

上述命令會在新的./compliance/profiles/client-run目錄中創(chuàng)建多個文件夾和文件,其中包括一個帶有示例內(nèi)容的controls/example.rb文件和一個inspec.yml文件。通過編輯inspec.yml,您可以按需修改其中的粗體項(xiàng):

  1. name: client-run 
  2. title: Run the chef-client every 30 minutes 
  3. maintainer: John Tonello 
  4. copyright: John Tonello 
  5. copyright_email: jtonello@chef.lab 
  6. license: Apache-2.0 
  7. summary: Run the chef-client every 30 minutes 
  8. version: 0.1.0 
  9. supports: 
  10. platform: os 

創(chuàng)建InSpec配置文件

InSpec配置文件通過control,不但描述了待執(zhí)行的每個測試,也向Chef-client表明了系統(tǒng)信息。在如下示例中,名為run-chef-client的control的impact為1.0,即具有最高優(yōu)先級。接著,control會根據(jù)目標(biāo)節(jié)點(diǎn)是否為Windows,來運(yùn)行不同的測試。此處的describe條目會告知Chef去檢查每個系統(tǒng)上的資源。

請將./compliance/profiles/client-run/controls/example.rb重命名為default.rb,并按如下方式進(jìn)行編輯:

  1. control 'run-chef-client' do 
  2.   impact 0.7 
  3.   title 'Run the chef-client every 30 minutes' 
  4.   if os.windows? 
  5.     describe windows_task('run-chef-client') do 
  6.       it { should exist } 
  7.       it { should be_enabled } 
  8.     end 
  9.   else 
  10.     describe crontab do 
  11.       its('commands') { should include '/usr/bin/chef-client' } 
  12.       its('minutes') { should include '0,30' } 
  13.     end 
  14.   end 
  15. end 

第 5 部分:策略文件(Policyfiles)

我們在創(chuàng)建任何Chef cookbook時,都需要重點(diǎn)考慮它是否包含了受信任的代碼。通過使用Policyfiles,您可以創(chuàng)建不可變的對象集-Cookbook、recipe、配置文件,并確保代碼未以某種方式(意外或惡意)被更改。

我們在使用Chef生成器命令創(chuàng)建run-chef-client cookbook時,會在cookbook文件夾中自動創(chuàng)建一個Policyfile.rb文件。我們可以在編輯器中打開該文件,并按需進(jìn)行修改(如下代碼所示):

  1. # Policyfile.rb - Describe how you want Chef Infra Client to build your system. 
  2.  
  3. # A name describes what the system you're building with Chef does. 
  4. name 'run-chef-client' 
  5.  
  6. Where to find external cookbooks: 
  7. default_source :chef_repo, "~/chef-repo/cookbooks" do |s| 
  8.   s.preferred_for "run-chef-client" 
  9. end 
  10. default_source :supermarket 
  11. default_source :chef_server, 'https://automate.chef.lab/organization/lab 
  12.  
  13. # run_list: chef-client will run these recipes in the order specified. 
  14. run_list 'run-chef-client::default' 

其中的name條目指定了與Cookbook相符的Policyfile名稱。而default_source可以是服務(wù)器的Chef、Chef Supermarket、或本地Chef repo。通過將:chef_repo與s.preferred_for一起使用,Chef將在Workstation的cookbooks文件夾中查找到內(nèi)容,而不是Chef Supermarket之類的遠(yuǎn)程源,或Chef服務(wù)器本身。

而run_list條目則描述了Chef的Cookbook和路徑。在此,run-chef-client::default指向的是~/chef-repo/cookbooks/run-chef-client/recipes/default.rb。您也可以添加多個run_list項(xiàng),并通過創(chuàng)建配置文件,將多個不同的cookbook結(jié)合到一個不可變的Policyfile中。

完成之后,請繼續(xù)在run-chef-client的Cookbook目錄中運(yùn)行cookstyle -a,并在下一步之前仔細(xì)檢查其語法:

  1. $ cd ~/chef-repo/cookbooks/run-chef-client 
  2. $ cookstyle -a 

一次性上傳Cookbook和配置文件

使用Policyfiles,您可以捆綁cookbook和合規(guī)性配置文件,并將它們上傳到Chef服務(wù)器上。首先,請安裝Policyfile.rb,以創(chuàng)建Policyfile.lock.json文件;然后請將該文件推送到Chef服務(wù)器處。

  1. $ cd ~/chef-repo/cookbooks/run-chef-client 
  2. $ chef install Policyfile.rb 
  3. $ Chef push prod Policyfile.lock.json 

該推送命令包含了Policyfile所屬的策略組(Policy Group)。使用Chef,您可以為不同的目的創(chuàng)建不同的策略組,例如build、test和prod等。在本示例中,run-chef-client的cookbook和client-run配置文件會被添加到prod(生產(chǎn)環(huán)境)策略組。

有了./compliance/profiles/default/default.rb、inspec.yml和Policyfile.rb,你便可以使用Test Kitchen測試Cookbook和合規(guī)性控制,或直接跳到第 7 部分,在目標(biāo)節(jié)點(diǎn)上應(yīng)用run-chef-client的cookbook和配置。

用Knife上傳Cookbook

您可以使用簡單的Knife命令,將Cookbook上傳到Chef服務(wù)器處,然后將一到多個Cookbook分配給每個節(jié)點(diǎn)。其對應(yīng)的命令代碼如下:

  1. $ knife upload cookbook run-chef-client 
  2. $ knife node run_list add ubuntu01 'recipe[run-chef-client'

其中,第一個命令是將Cookbook上傳到Chef服務(wù)器;第二個指定run-chef-client的Cookbook在該節(jié)點(diǎn)上運(yùn)行。

第 6 部分:Test Kitchen

Test Kitchen提供了諸如Docker、VirtualBox、Hyper-V、Amazon以及Azure云等多種方法,在本地測試Chef Cookbook和合規(guī)性代碼。由于我們在本例中使用的是Docker,因此應(yīng)當(dāng)在Workstation上安裝docker.io和docker -compose,并以非root的用戶身份去運(yùn)行。

我們在使用-k dokken標(biāo)志去創(chuàng)建run-chef-clientcookbook時,會自動在cookbookkitchen.yml目錄的根目錄下創(chuàng)建一個文件。如下代碼所示,該文件已經(jīng)被配置為使用Dokken驅(qū)動程序(即為Docker)了。

  1. --- 
  2. driver: 
  3.   name: dokken 
  4.   privileged: true  # allows systemd services to start 
  5.  
  6. provisioner: 
  7.   name: dokken 
  8.  
  9. transport: 
  10.   name: dokken 
  11.  
  12. verifier: 
  13.   name: inspec 
  14.  
  15. platforms: 
  16.   - name: ubuntu-20.04 
  17.     driver: 
  18.       image: dokken/ubuntu-20.04 
  19.       pid_one_command: /bin/systemd 
  20.       intermediate_instructions: 
  21.         - RUN /usr/bin/apt-get update 
  22.  
  23.   - name: centos-8 
  24.     driver: 
  25.       image: dokken/centos-8 
  26.       pid_one_command: /usr/lib/systemd/systemd 
  27.  
  28. suites: 
  29.   - namedefault 
  30.     run_list: 
  31.       - recipe[chef-client::default
  32.     verifier: 
  33.       inspec_tests: 
  34.         - compliance/profiles/client-run/ 
  35.     attributes: 
  36.       audit: 
  37.         compliance_phase: false 
  38.         reporter: 'cli' 

類似虛擬機(jī),上述kitchen.yml文件中的platform條目會拉取特殊的Docker鏡像。而Chef團(tuán)隊(duì)已經(jīng)為各種Linux操作系統(tǒng)準(zhǔn)備了基本的容器,以便您為真實(shí)的環(huán)境開展測試,而無需額外的設(shè)置。

如果您想添加除了Ubuntu 20.04和CentOS 8之外的平臺,則可以通過https://hub.docker.com/u/dokken,添加來自dokken鏡像存儲庫里的條目。那里有著41個Dokken鏡像可供測試。

您也可以編輯suites下的verifier部分,以指向InSpec配置文件的相對路徑——compliance/profiles/client-run/。通過有效性驗(yàn)證,它將有助于避免運(yùn)行時的各種錯誤:

  1. attributes: 
  2.    audit: 
  3.      compliance_phase: false 
  4.  reporter: 'cli' 

運(yùn)行Test Kitchen

Test Kitchen的工作原理是:首先根據(jù)kitchen.yml平臺條目中所描述的鏡像,啟動容器(如VM或云實(shí)例),接著部署Chef-client和Chef配置文件,然后部署Chef代碼(被稱為converging),并驗(yàn)證您的代碼,最后關(guān)閉并銷毀測試容器或?qū)嵗D梢酝ㄟ^導(dǎo)航到run-chef-clientCookbook目錄的根目錄,運(yùn)行kitchen test,來一次性完成所有步驟:

  1. $ cd ~/chef-repo/cookbooks/run-chef-client 
  2. $ kitchen test 

上述簡單的命令執(zhí)行了創(chuàng)建、聚合、驗(yàn)證和銷毀步驟,并能顯示正在使用的Cookbook的終端內(nèi)結(jié)果,以及合規(guī)階段的掃描結(jié)果。您可以繼續(xù)執(zhí)行如下步驟:

  1. $ kitchen create 
  2. $ kitchen converge 
  3. $ kitchen verify 
  4. $ kitchen destroy 

通過單獨(dú)運(yùn)行上述步驟,您可以重新運(yùn)行kitchen converge和kitchen verify,以快速迭代各種更改。

第 7 部分:引導(dǎo)節(jié)點(diǎn)

既然cookbook和配置文件已推送到了Chef服務(wù)器并進(jìn)行了測試,下面,我們將引導(dǎo)(bootstrapping)第一個目標(biāo)節(jié)點(diǎn)并執(zhí)行如下任務(wù):

  • 安裝Chef-client
  • 創(chuàng)建配置文件--config.rb,并定義Chef Server和身份驗(yàn)證等詳細(xì)信息
  • 按需安裝可信任的自簽名證書

Knife有一個內(nèi)置的引導(dǎo)命令,可以一次性完成所有步驟。您可以在首個Chef Workstation的目標(biāo)節(jié)點(diǎn)(應(yīng)當(dāng)能夠默認(rèn)支持ssh系統(tǒng))上,引導(dǎo)如下命令:

  1. $ knife bootstrap ubuntu01.fakedomain.tld -U ubuntu -i ~/.ssh/id_rsa --sudo -N ubuntu01 --policy-group prod --policy-name run-chef-client 

該bootstrap命令允許您使用如下標(biāo)志來定義各種細(xì)節(jié):

  • ubuntu01.fakedomain.tld – 沒有標(biāo)志,只有被引導(dǎo)服務(wù)器的主機(jī)名或IP地址。
  • -U(或--connection-user)ubuntu – 連接到遠(yuǎn)程節(jié)點(diǎn)時用到的用戶名。
  • -i ~/.ssh/id_rsa – ssh的身份驗(yàn)證密鑰(而-P可用于密碼驗(yàn)證)。
  • –-sudo – 以超級用戶的權(quán)限執(zhí)行命令。這通常是新軟件安裝和引導(dǎo)所必需的。
  • -N(或 --node-name)ubuntu01 – 向Chef服務(wù)器注冊時使用的“節(jié)點(diǎn)名稱”。
  • --policy-group prod --policy-name run-chef-client – 它會將run-chef-clientpolicy分配給節(jié)點(diǎn)。您可以使用-r 'recipe[run-chef-client]'在引導(dǎo)期間將Cookbook應(yīng)用于節(jié)點(diǎn)上。在本例中,default.rb recipe被應(yīng)用了上去。
  1. $ knife  bootstrap ssh://10.128.1.25 -U ubuntu -i ~/.ssh/id_rsa -N ubuntu01 -r 'recipe[run-chef-client]' 

Windows:

  1. $ Knife bootstrap winrm://10.128.1.26 -U Administrator -P mypassword -N windows10 -r 'recipe[run-chef-client]' 

同時,您也可以引導(dǎo)節(jié)點(diǎn),而不是分配任何recipe或策略:

  1. $ Knife bootstrap ssh://10.128.1.25 -U ubuntu -i ~/.ssh/id_rsa -N ubuntu01 
  2. $ Knife bootstrap winrm://10.128.1.26 -U Administrator -P mypassword -N windows10 

如果您想在沒有任何標(biāo)志的情況下,引導(dǎo)一到多個節(jié)點(diǎn),則可以稍后再設(shè)置策略,并分配run_lists或策略:

  1. $ Knife node policy set ubuntu01 prod run-chef-client 

或者:

  1. $ Knife node run_list add ubuntu01 'recipe[run-chef-client]' 

上面只是一些常用的選項(xiàng)。如果您想了解更多有關(guān)Knife命令的完整標(biāo)志列表,只需使用-h標(biāo)志,即可獲得全量選項(xiàng)和用法示例的描述。

通過運(yùn)行Chef-client來查看系統(tǒng)的狀態(tài)和合規(guī)性

您可以通過knife,在Chef服務(wù)器列表中查詢到ubuntu01節(jié)點(diǎn):

  1. $ knife node list 
  2. ubuntu01 

如果使用策略或recipe的標(biāo)志去引導(dǎo)節(jié)點(diǎn),您將在CLI中看到進(jìn)度顯示和結(jié)果輸出。當(dāng)然,您也可以通過在該節(jié)點(diǎn)上運(yùn)行的Chef-client,以查看到Chef代碼的運(yùn)行情況。雖然新的run-chef-client cookbook會每隔30分鐘運(yùn)行一次,但您可以通過以下幾種方式,來手動執(zhí)行:

使用knife運(yùn)行Chef-client

knife工具允許您在任何遠(yuǎn)程節(jié)點(diǎn)上運(yùn)行ssh和winrm選項(xiàng)。在Linux或macOS節(jié)點(diǎn)上,您可以通過如下方式,來運(yùn)行命令sudo chef-client:

  1. $ knife ssh 'name:ubuntu01' 'sudo Chef-client' 

值得一提的是,如果目標(biāo)主機(jī)是Windows系統(tǒng),那么請使用winrm選項(xiàng),并提供管理級別的用戶名(-x)和密碼(-P):

  1. $ knife winrm 'name:win10' 'chef-client' -x Administrator -P mypassword 

而對于支持ssh的節(jié)點(diǎn),您可以進(jìn)入shell,并從命令行運(yùn)行sudo chef-client;在Windows上,則請使用RDP登錄,以管理員身份打開PowerShell,然后運(yùn)行chef-client。

不僅僅是策略即代碼(Policy as Code)

由于本例中的ubuntu01節(jié)點(diǎn)已經(jīng)被Chef Infra Client和Chef代碼引導(dǎo)啟動和運(yùn)行,因此您可以通過如下命令,快速了解到其相關(guān)信息的摘要:

  1. knife node show ubuntu01 
  2. Node Name:   ubuntu01 
  3. Policy Name:  run-chef-client 
  4. Policy Group: prod 
  5. FQDN:        ubuntu01.fakedomain.tld 
  6. IP:       10.128.1.25 
  7. Run List:    recipe[run-chef-client::default
  8. Recipes:     run-chef-client::default 
  9. Platform:    ubuntu 20.04 
  10. Tags:  

您還可以使用Chef查詢與該節(jié)點(diǎn)相關(guān)的各種系統(tǒng)信息。例如:

  1. $ knife search node 'name:ubuntu01' -a shells 
  2.  1 items found 
  3.  
  4. ubuntu01: 
  5.   shells: 
  6.     /bin/sh 
  7.     /bin/bash 
  8.     /bin/rbash 
  9.     /bin/dash 

上例只是搜索并返回了單個節(jié)點(diǎn)。當(dāng)然,您也可以使用通配符,返回有關(guān)所有節(jié)點(diǎn)、或具有特定前綴或后綴的節(jié)點(diǎn)信息。例如:'name:*'(所有節(jié)點(diǎn))、或'name:web*'(僅以“web”開頭的節(jié)點(diǎn))、或'name:*web'(僅以“web”結(jié)尾的節(jié)點(diǎn))。除了名稱以外,您還可以使用平臺、或其他knife選項(xiàng)。例如:

  1. $ knife search node 'platform:ubuntu' -a shells 

這些信息從何而來?

即使您沒有使用Chef對節(jié)點(diǎn)實(shí)施任何配置上的更改,Chef-client的每次運(yùn)行也都會使用一個名為ohai的工具,來收集系統(tǒng)分析信息,并將它與運(yùn)行結(jié)果一起發(fā)送回Chef服務(wù)器。這就意味著,您可以開箱即用地了解有關(guān)被管理系統(tǒng)的各種信息,并且能夠隨著更多服務(wù)器被引導(dǎo),而輕松地查詢到更多與Chef相關(guān)的信息,進(jìn)而在recipe中使用此類信息,來操控各個節(jié)點(diǎn)。

以下便是從Chef中提取更多數(shù)據(jù)類型的示例:

  1. $ knife search node 'name:ubuntu01' -a memory.total -a filesystem.by_mountpoint./.percent_used -a ipaddress 
  2.  1 items found 
  3.  
  4. ubuntu01: 
  5.   filesystem.by_mountpoint./.percent_used: 13% 
  6.   ipaddress:                               10.128.1.133 
  7.   memory.total:                            524288kB  

在此搜索中,您可以查看有關(guān)磁盤的使用情況和內(nèi)存的數(shù)據(jù)。Ohai允許您通過查詢各種節(jié)點(diǎn)的信息,來自動檢測諸如節(jié)點(diǎn)的公共IP地址等AWS的內(nèi)部信息。對此,您可以將-a ec2.public_ipv4替換上例中的-a ipaddress。值得注意的是,即使您的節(jié)點(diǎn)是在沒有應(yīng)用run_list或策略的情況下被引導(dǎo)的,它也能夠收集到數(shù)據(jù)。

關(guān)于屬性的更多想法

我們在節(jié)點(diǎn)上對于Cookbook節(jié)點(diǎn)的任何修改,都可以被直接執(zhí)行,而無需變動任何底層代碼的屬性。例如,您可以通過在節(jié)點(diǎn)上運(yùn)行一個knife搜索,后跟-l標(biāo)志,來查看某個節(jié)點(diǎn)的所有可用屬性:

  1. $ knife search node 'name:ubuntu01' -l 
  2.  1 items found 
  3.  
  4.  Node Name:   ubuntu01 
  5. Policy Name:  run-chef-client 
  6. Policy Group: prod 
  7. FQDN:        ip-172-31-15-141.ec2.internal 
  8. IP:          3.85.154.118 
  9. Run List:    recipe[run-chef-client::default
  10. Recipes:     run-chef-client::default 
  11. Platform:    ubuntu 20.04 
  12. Tags:        
  13. Attributes: 
  14. tags: 
  15. … 
  16. chef_environment: prod 
  17. chef_guid:        4d10ca10-7658-4693-91b6-6ed25d881a1c 
  18. chef_packages: 
  19.   chef: 
  20.     chef_effortless: 
  21.     chef_root:       /opt/chef/embedded/lib/ruby/gems/3.0.0/gems/chef-17.5.22/li 
  22.     version:         17.5.22 
  23.   ohai: 
  24.     ohai_root: /opt/chef/embedded/lib/ruby/gems/3.0.0/gems/ohai-17.5.2/lib/ohai 
  25.     version:   17.5.2 
  26. cloud: 
  27.   local_hostname:    ip-172-31-15-141.ec2.internal 
  28.   local_ipv4:        172.31.15.141 
  29.   local_ipv4_addrs:  172.31.15.141 
  30.   provider:          ec2 
  31.   public_hostname:   ec2-3-85-154-118.compute-1.amazonaws.com 
  32.   public_ipv4:       3.85.154.118 
  33.   public_ipv4_addrs: 3.85.154.118 
  34. command: 
  35.   ps: ps -ef 
  36. cookbooks: 
  37.   run-chef-client: 
  38.     version: 0.1.0 
  39. counters: 
  40.   network: 
  41.     interfaces: 
  42.       eth0: 
  43.         rx: 
  44.           bytes:   396541197 
  45.           drop:    0 
  46.           errors:  0 
  47. … 

第 8 部分:擴(kuò)展所學(xué)的內(nèi)容

至此,您已經(jīng)了解了Chef是如何協(xié)同Cookbook工作的。但是在實(shí)際應(yīng)用中,您可能需要諸如:在webserver上打開443端口、或是在其他服務(wù)器上安裝特定的應(yīng)用等多種配置。因此,您可以使用多種方式,將多個Cookbook組合在一起,提供可應(yīng)用于被定義節(jié)點(diǎn)組的基本Cookbook或配置文件。例如,Policyfiles就能夠簡便地將多個Cookbook、recipe和配置文件捆綁在一個對象中。而另一種方法則是將Cookbook依賴項(xiàng)添加到Cookbook的metadata.rb文件中,并在default.rbCookbook中使用include_recipe資源。

在metadata.rb中定義依賴項(xiàng)

每個cookbook都帶有一個metadata.rb文件,可用于定義其名稱、版本、以及各種依賴項(xiàng)。如下代碼展示了,若想添加對另一個cookbook的依賴項(xiàng),只需告知其您的run-chef-clientcookbook,以及向metadata.rb添加一個depends條目即可:

  1. name 'base_cookbook' 
  2. maintainer 'Jack Smith' 
  3. maintainer_email 'jsmith@example.com' 
  4. license 'Apache-2.0' 
  5. description 'Installs/Configures base_cookbooks' 
  6. long_description 'Installs/Configures base_cookbooks' 
  7. version '0.1.0' 
  8. chef_version '>= 16.0' 
  9.  
  10. depends 'run-chef-client' 

在recipes/default.rb中定義Cookbook依賴項(xiàng)

在第 3 部分中,我們了解到cookbook包含著一個default.rbrecipe,該recipe定義了在未指定其他特定recipe時,應(yīng)執(zhí)行哪些操作。而在該base_cookbook示例中,cookbook定義了與其相關(guān)的recipe。那么,如果您有第二個名為closed-ports的cookbook,它會在自己的cookbook和recipe目錄中擁有自己的default.rb。而如果要在應(yīng)用run-chef-clientcookbook時,調(diào)用closed-ports這一cookbook,您可以在修改后使用include_recipe資源,并讀取cookbooks/run-chef-client/recipes/default.rb。

  1. # Cookbook:: base_cookbook 
  2. # Recipe:: default 
  3. # Copyright:: 2021, Jack Smith, All Rights Reserved. 
  4.  
  5. include_recipe 'closed-ports::default' 

通過這種方式,您可以創(chuàng)建基本的Cookbook,以包含多個recipe和Cookbook。而且,當(dāng)您在使用Policyfiles時,它是固定不變的,并能夠?qū)⒁坏蕉鄠€cookbook中的所有內(nèi)容捆綁到一起(包括已定義的任何InSpec配置文件)??梢?,由于不需要舊的Chef技術(shù)來上傳Cookbook依賴項(xiàng),因此Policyfile方法應(yīng)作為開發(fā)的首選。

更多資源

如果您在開始動手實(shí)踐之前,想了解更多相關(guān)知識的話,請瀏覽如下鏈接:

原文標(biāo)題:Chef 101: Getting Started With Automation,作者: John Tonello

【51CTO譯稿,合作站點(diǎn)轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】

責(zé)任編輯:華軒 來源: 51CTO
相關(guān)推薦

2010-11-08 09:15:46

Puppet入門教程自動化

2022-05-06 12:04:24

Ansible管理工具

2011-09-29 09:52:59

配置管理服務(wù)器Puppet

2013-08-30 14:30:59

系統(tǒng)自動化自動化配置SaltStack

2022-09-08 09:00:38

Ansible開源

2022-07-11 18:02:47

戴爾

2017-02-17 09:00:00

Linux管理員工具

2017-05-10 15:48:59

云平臺云計算工具

2009-07-20 18:16:11

軟件配置管理

2011-10-09 13:49:51

2020-07-01 08:45:00

開源開發(fā)工具

2010-05-13 17:46:51

IIS服務(wù)器

2014-07-14 15:45:08

服務(wù)器虛擬化

2016-09-01 21:33:21

服務(wù)器服務(wù)器虛擬化虛擬化

2012-10-29 16:45:07

CentOS 6.2Puppet

2012-12-06 11:31:40

虛擬化

2012-05-29 10:27:06

微軟服務(wù)器

2012-09-10 09:59:35

Windows 8遠(yuǎn)程服務(wù)器管理

2018-02-23 09:04:33

虛擬化管理服務(wù)器

2024-12-30 07:10:00

Linux服務(wù)器管理工具服務(wù)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號