本文將向您介紹Chef生態系統,如何實現配置管理,以及有關系統合規性的全面基礎知識。我們的主要服務對象是那些編碼經驗有待提升的初學讀者。閑言少敘,讓我們從最基本的術語開始介紹:
- Chef Cookbooks – Cookbooks(是Chef Code的組織方式。Cookbooks包含了許多非常重要的recipe、配置文件(profile)和子目錄。它們定義了將各種應用于被管理系統的配置和合規性控制。
- Chef Server – Chef Infra Server(架構服務器)會存儲Cookbook、配置文件、策略文件(policyfile)、以及其他Chef代碼,并將它們分享給被管理的目標節點。也就是說,它既包括了那些已分配的cookbook和配置文件的系統的信息,又維護著與目標環境有關的信息搜索索引,因此您可以按需便捷地識別和管理系統中的各個離散子集。
- Chef Automate – 作為Chef的企業級平臺,Chef Automate許開發人員、運營和安全工程師通過協作,交付出應用程序和基礎架構的更改,以及合規性的狀態。Chef Automate提供了橫跨多個數據中心和云服務提供商的洞察力。它可以與Chef Infra Server和Habitat Builder一起被安裝,以提供完整的Chef體驗。您可以通過鏈接--https://www.youtube.com/watch?v=XlCyd_DH1YU,了解更多有關Automate的設置與運行。
- Chef Client – Chef Client是運行在諸如Linux、Windows或MacOS等管理系統上的代理。它通過與Chef Server通信,以提取策略文件或run_list所需的cookbook、合規性配置文件、以及相關配置,然后執行recipe和合規性的掃描,并將其結果報告發回Chef Server。
- Chef InSpec – 通過提供審計和合規性配置文件,Chef InSpec可用于測試您的Cookbook邏輯,并確保您的系統處于預期的狀態。與Chef cookbook類似,其配置文件由Chef Client觸發和應用,并通過CLI和Chef Automate儀表板返回輸出的結果。那些被成功應用的配置文件,將顯示系統是否合規。
- Chef Workstation – Chef Workstation包含了著手編寫和使用Chef cookbook所需的一切。其中包括:用于與Chef Server通信的命令行實用程序,以及在更新環境之前,在本地驗證cookbook的測試工具。它可以免費地安裝在Linux、macOS和Windows系統上,并包含嵌入式的Ruby和其他開箱即用的依賴項。由于該“工具箱”包含了用于創建和構建Chef的所有內容,因此它取代了現已過時的ChefDK。
- Chef Repo – Chef Repo是Workstation或筆記本電腦上存儲Chef內容的目錄結構。它通常位于根目錄下,例如:在Linux的/home/jsmith/chef-repo、macOS的/Users/jsmith/chef-repo、以及Windows的C:\Users\jsmith\chef-repo上。當然,它也可以被創建在系統中的任何位置(只是因為主目錄更便于記住和引用)。一種常用的做法是,使用Git或其他版本控制工具,為版本、遠程保存和共享代碼初始化相應的目錄。
- Test Kitchen – Test Kitchen通過驅動程序的插件架構,以方便用戶使用Docker、VMware、Hyper-V、VirtualBox、以及其他虛擬機管理程序,在本地測試Chef Cookbook和合規性配置文件。同時,它也能夠對來自Amazon EC2、Google Compute Engine和Microsoft Azure等云服務提供商的云實例進行測試。而且,用戶還能夠使用Test Kitchen實現快速開發、測試和代碼排障。
- Chef Supermarket – 目前,Chef社區里有著4000多個由Chef工程師、以及合作伙伴編寫的開源式Cookbook。Chef Supermarket為此提供了公開可用的存儲庫,以滿足個人或組織的使用、檢查或修改等特定需求。
第 1 部分:Chef Infra Server
雖然我們可以通過在Workstation上使用Chef Zero,實現在不運行完整Chef Infra Server的情況下,體驗Chef,但是若要獲得完整的使用體驗,您最好還是運行本地或基于云端的Chef服務器。畢竟,成熟的Chef Infra Server并不需要太多的資源,單個VM或適當的云實例即可。而且,它可以為您提供在目標節點之間,存儲和分發代碼的完整體驗。
Chef Infra Server的安裝并不困難。它可以與Chef Automate和Chef Habitat Builder并行安裝,以實現與應用程序的持續集成。實際上,每個Chef產品都可以使用獨立的二進制文件--Chef-automate,通過“產品標志(product flag)”在大約15分鐘內,對Chef服務器完成快速的安裝和配置。
同時,您也可以從Amazon及其云端市場,部署Chef服務器。這些系統都已預先配置好了Chef Automate和Chef Infra Server,您只需創建一個管理員用戶和一個組織即可開始使用。下面是其運行的先決條件:
- 至少2顆CPU、8 GB RAM、以及32 GB的磁盤虛擬機,運行諸如Ubuntu 20.04或CentOS 8等操作系統(注意:這是遠低于生產環境的最低系統要求)。
- VM擁有靜態的IP地址。
- 具有sudo權限的非root用戶。
- 允許Chef服務器與Workstation、及Linux、Windows或macOS目標節點(可以是其他VM)通信的子網。
- 子網上的可選DNS條目,允許服務器、節點和Workstation通過FQDN進行通信。如果沒有DNS,則需編輯Chef服務器和目標節點上的hosts文件,以便它們可以通過name相互訪問。
- 或者已經完成了AWS或Azure Marketplace的部署。
請在一臺原始的Linux VM中登錄shell,并運行如下命令,或簡單地復制deploy-chef-server.sh腳本中的內容(請在運行之前,更新變量):
- $ chmod +x deploy-chef-server.sh
- $ ./deploy-chef-server.sh
您也可以在沒有腳本的情況下,通過如下步驟部署Chef服務器:
設置hostnamectl set-hostname hostname文件中的fqdn值與hostname –f的系統值相匹配,畢竟在安裝的過程中,我們會使用FQDN去設置證書。
- $ hostnamectl set-hostname automate.chef.lab
通過下載可執行的獨立包,去安裝Chef-automate工具。
- $ curl https://packages.chef.io/files/current/latest/chef- automate-cli/chef-automate_linux_amd64.zip | gunzip - > chef- automate && chmod +x chef-automate
請按照如下方式調整環境設置:
- $ sudo sysctl -w vm.max_map_count=262144
- $ sudo sysctl -w vm.dirty_expire_centisecs=20000
為了防止重啟后發生變化,請確保寫入/etc/sysctl.conf。即,通過執行Chef-automate來部署Chef Infra Server:
- $ sudo ./chef-automate deploy --product infra-server
為了能夠在服務器和Workstation之間提供安全的訪問,并定位Chef內容,請使用Chef服務器來創建管理員用戶和組織。我們可以通過chef-server org-create命令,使用--association-user參數來創建用戶名admin:
- $ sudo Chef-server-ctl user-create jsmith Jack Smith [email protected] "password" --filename jsmith.pem
- $ sudo Chef-server-ctl org-create lab“我的實驗室”--association_user jsmith --filename lab-validator.pem
上述命令生成了jsmith.pem和lab-validator.pem兩個證書文件。在第 2 部分中,我們將把jsmith.pem文件復制到Workstation上,以實現Chef服務器和筆記本電腦之間的安全通信。
第 2 部分:Chef Workstation
作為一組工具,Chef Workstation包括Chef、knife、inspec、cookstyle、habitat、kitchen、以及嵌入式Ruby等依賴項。您可以通過下載特定于操作系統的安裝程序,或使用Chef install.sh腳本,來安裝Chef Workstation。
如果使用特定于操作系統的安裝程序,請在環境中設置Chef shell-init,并添加嵌入式Chef二進制文件的路徑。這可以確保Workstation工具使用嵌入式的Ruby版本。其中,在Linux系統上的語句為:
- $ echo 'eval "$(chef shell-init bash)"' >> /home/$USER/.bash_profile
- $ echo 'export PATH="/opt/chef-workstation/embedded/bin:$PATH"' >> /home/$USER/.configuration_file
我們可以通過在終端上運行如下命令,來確認安裝:
- $ chef -v
- Chef Workstation version: 21.10.640
- Chef CLI version: 5.4.2
- Chef Habitat version: 1.6.351
- Test Kitchen version: 3.1.0
- Cookstyle version: 7.25.6
- Chef Infra Client version: 17.6.18
- Chef InSpec version: 4.46.13
我們繼續使用Chef生成器,來為所有的Chef Cookbook和其他文件創建Chef存儲庫,以及包括~/chef-repo/cookbooks在內的多個子目錄:
- $ cd ~
- $ chef generate repo chef-repo
為了便于Workstation能夠與Chef服務器進行通信和交互,我們需要創建一個憑證文件。它位于主目錄中的.chef目錄中,例如:/home/jsmith/.chef。該文件夾和憑據文件,可以由另一個生成器所創建:
- $ knife configure init-config
在終端里運行上述命令時,系統會向您提出包括:Chef服務器的URL和設置服務器時創建的用戶名等問題。而命令完成后,系統會輸出~/.chef/credentials文件,其內容為:
- [default]
- client_name = 'jsmith'
- client_key = '~/.chef/jsmith.pem'
- Chef_server_url = 'https://automate.chef.lab/organizations/lab'
通過編輯憑據文件,我們可以添加默認的cookbook位置,在本例中為~/chef-repo。當然,您也可以添加多個路徑,例如:['/path/to/one', '/path/to/two']:
- cookbook_path = ['~/chef-repo/cookbooks']
上述.credentials文件中的client_key條目,會指向user.pem文件。我們可以將此文件從Chef服務器復制到Workstation,并使用scp之類的工具,將其放入~/.chef/目錄。當然,您也可以復制Chef服務器上的user.pem文件內容,并粘貼到Workstation上的新文件中:
- $ cd ~ / .chef
- $ scp [email protected]:/home/jsmith/jsmith.pem。
接著,Chef Workstation會自動將準備好的證書放入~/.chef/trusted_certs文件夾中,以用于安全通信。
- $ knife ssl fetch
- $ knife ssl check
成功驗證了證書后,我們可以使用另一個簡單的Knife命令,去測試Workstation和 Chef服務器之間的連接。它將返回我們在設置Chef服務器時,所創建的客戶端組織的名稱:
- $ knife client list
- lab-validator
在完成了Chef Infra Server和Chef Workstation的設置后,我們可以開始使用Chef來配置和管理各個節點了。值得注意的是,這些配置步驟雖然對于實驗室和企業內部環境都是理想的,但是在生產環境中,請務必遵循Chef服務器的系統要求。
接著,請在Workstation上安裝VS Code并添加Chef擴展。其自動化完成功能和內置的Chef語言參考,會使您能夠輕松地開始編寫Chef代碼。
第 3 部分:Chef Cookbook
在本節中,我們將創建一個簡單的cookbook,以便在系統上運行Chef客戶端代理時進行各項操作。
為了讓Chef實現系統的自動化和合規性,Chef Infra Client會通過bootstrap進程被安裝在每個節點上,并伴隨著安裝一個能夠與Chef服務器進行通信client.rb文件。據此,您可以使用簡單的Cookbook來自動化該過程,以實現系統每隔30分鐘檢查一次Chef服務器。
下面,我們將從近250個內置的Chef資源中,選用windows_task和cron源,通過創建一個recipe,在Linux和Windows系統上實現每隔30分鐘運行一次Chef-client。其中,Linux是通過cron完成作業的;而Windows則是通過Windows Task完成的。
創建Cookbook
在Workstation上,請導航到~/chef-repo/cookbooks文件夾,并使用Chef cookbook生成器來創建一個名為run-chef-client的cookbook:
- $ cd ~/chef-repo/cookbooks
- $ Chef generate Cookbookrun-chef-client -k dokken
這將創建一個名為run-chef-client的新目錄。其中,-k dokken標志生成一個Test Kitchen的kitchen.yml文件,實現預配置與Docker的協同。
請通過如下命令,切換到新的./run-chef-client目錄,并列出其具體內容:
- $ cd ~/chef-repo/cookbooks/run-chef-client
- $ tree
- ├── CHANGELOG.md
- ├── chefignore
- ├── kitchen.yml
- ├── LICENSE
- ├── metadata.rb
- ├── Policyfile.rb
- ├── README.md
- ├── recipes
- │ └── default.rb
- └── test
- └── integration
- └── default
- └── default_test.rb
請使用如下命令創建兩個目錄,來分別保存屬性(使用另一個Chef生成器)與合規性配置文件:
- $ cd ~/chef-repo/cookbooks/run-chef-client
- $ chef generate attribute default $ mkdir -p ./compliance/profiles
我們可以通過編輯metadata.rb文件,來包含維護者的信息。這些信息將被自動傳遞到Chef生成器,以創建諸如recipes、文件和模板等文件:
- name 'run-chef-client'
- maintainer 'John Tonello'
- maintainer_email '[email protected]'
- license ' Apache-2.0'
- description 'Set chef-client to run every 30 minutes'
- version '0.1.0'
- chef_version '>= 16.0'
您在創建cookbook時,可以通過如下命令,標志maintainer、maintainer_email和license的值。
- $ chef generate cookbook run-chef-client -k dokken -C 'John Tonello' -m '[email protected]' -I 'apachev2'
創建Recipe
請將如下內容輸入./cookbooks/run-chef-client/recipes/default.rb文件,并按需更新其標題。注意,用戶和密碼應匹配您的環境。該recipe包括了在Windows和非Windows系統上工作的邏輯。在更為復雜的Cookbook中,您可能有不同名稱的多個Cookbook。注意,請務必將帶有路徑的include_recipe資源運用到default.rb的recipe上。
- # Cookbook:: client-run
- # Recipe:: default
- #
- # Copyright:: 2021, John Tonello, All Rights Reserved.
- include_profile 'run-chef-client::client-run'
- if platform?('windows')
- windows_task 'run-chef-client' do
- user 'WIN10\jtonello'
- password 'Sup3r!Us3r!'
- command 'chef-client'
- run_level :highest
- frequency :minute
- frequency_modifier 30
- end
- else
- cron 'Run chef-client every 30 minutes' do
- minute '0,30'
- user 'root'
- command '/usr/bin/chef-client'
- action :create
- end
- end
其中,include_profile一行是Chef Infra Client 17.5.22的一項新功能。它允許您定義要在recipe中正確關聯到Cookbook的合規性資料。據此,當您在第 5 部分中使用Policyfile工作流時,您的配置文件將被鏈接和上傳。而在Chef中,'run-chef-client::client-run'是指向~/chef-repo/cookbooks/run-chef-client/compliance/profiles/client-run/的。
該recipe中的if...else語句會告知Chef去運行windows_task(如果平臺是 Windows)或cron資源(如果平臺是Linux和macOS)。而且,Windows Task需要用到用戶、密碼、以及以該用戶的身份去運行的chef-client命令。最終,這兩種資源都會將任務設置為每30分鐘運行一次。
在保存了recipe后,我們便可以通過運行Chef Cookstyle,來檢查其語法是否正確。如果檢測到錯誤,它會使用-a標志來予以自動更正。
- $ cookstyle -a
當結果報告“沒有違規”時,Cookbook可被認為在語法上是正確的。
如果您只想將cookbook應用到一個節點,并不想添加合規性的話,則可以將cookbook上傳至Chef服務器,引導單個節點,然后應用至cookbook。下面代碼展示了該過程,不過,這往往認為是一種比較舊的工作流程:
- $ knife cookbook upload run-chef-client
- $ knife cookbook list
- chef-client 0.1.0
- $ 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提供了對于節點狀態、及其合規性的洞察。也就是說,它會告訴您所應用的Cookbook是否處于期望狀態。
當您從終端和Chef Automate Compliance儀表板處運行Chef-client命令時,Chef InSpec會執行復雜的任務,并通過CLI報告合規性數據。在完成該任務之后,您需要創建一個cookbook屬性文件、以及一個包含有controls的配置文件。
創建屬性文件
請在run-chef-clientCookbook文件夾的根目錄中,運行如下命令,以在run-chef-clientCookbook文件夾中生成一個屬性目錄。同時,該文件夾也包含一個名為default.rb的文件:
- $ chef generate attribute default
您可以編輯./attributes/default.rb,并添加如下內容:
- default['audit']['reporter'] = %w(chef-server-automate cli)
默認的['audit']['reporter']條目會輸出到Chef自動化和CLI處。
創建配置文件并編輯inspec.yml文件
我們可以使用Chef生成器,生成一個新的配置文件:
- $ inspec init profile [path-to-cookbook-root] [profile-name]
例如:
- $ cd ~/chef-repo/cookbooks/run-chef-client/compliance/profiles/
- $ inspec init profile client-run
上述命令會在新的./compliance/profiles/client-run目錄中創建多個文件夾和文件,其中包括一個帶有示例內容的controls/example.rb文件和一個inspec.yml文件。通過編輯inspec.yml,您可以按需修改其中的粗體項:
- name: client-run
- title: Run the chef-client every 30 minutes
- maintainer: John Tonello
- copyright: John Tonello
- copyright_email: [email protected]
- license: Apache-2.0
- summary: Run the chef-client every 30 minutes
- version: 0.1.0
- supports:
- platform: os
創建InSpec配置文件
InSpec配置文件通過control,不但描述了待執行的每個測試,也向Chef-client表明了系統信息。在如下示例中,名為run-chef-client的control的impact為1.0,即具有最高優先級。接著,control會根據目標節點是否為Windows,來運行不同的測試。此處的describe條目會告知Chef去檢查每個系統上的資源。
請將./compliance/profiles/client-run/controls/example.rb重命名為default.rb,并按如下方式進行編輯:
- control 'run-chef-client' do
- impact 0.7
- title 'Run the chef-client every 30 minutes'
- if os.windows?
- describe windows_task('run-chef-client') do
- it { should exist }
- it { should be_enabled }
- end
- else
- describe crontab do
- its('commands') { should include '/usr/bin/chef-client' }
- its('minutes') { should include '0,30' }
- end
- end
- end
第 5 部分:策略文件(Policyfiles)
我們在創建任何Chef cookbook時,都需要重點考慮它是否包含了受信任的代碼。通過使用Policyfiles,您可以創建不可變的對象集-Cookbook、recipe、配置文件,并確保代碼未以某種方式(意外或惡意)被更改。
我們在使用Chef生成器命令創建run-chef-client cookbook時,會在cookbook文件夾中自動創建一個Policyfile.rb文件。我們可以在編輯器中打開該文件,并按需進行修改(如下代碼所示):
- # Policyfile.rb - Describe how you want Chef Infra Client to build your system.
- # A name describes what the system you're building with Chef does.
- name 'run-chef-client'
- # Where to find external cookbooks:
- default_source :chef_repo, "~/chef-repo/cookbooks" do |s|
- s.preferred_for "run-chef-client"
- end
- default_source :supermarket
- default_source :chef_server, 'https://automate.chef.lab/organization/lab
- # run_list: chef-client will run these recipes in the order specified.
- run_list 'run-chef-client::default'
其中的name條目指定了與Cookbook相符的Policyfile名稱。而default_source可以是服務器的Chef、Chef Supermarket、或本地Chef repo。通過將:chef_repo與s.preferred_for一起使用,Chef將在Workstation的cookbooks文件夾中查找到內容,而不是Chef Supermarket之類的遠程源,或Chef服務器本身。
而run_list條目則描述了Chef的Cookbook和路徑。在此,run-chef-client::default指向的是~/chef-repo/cookbooks/run-chef-client/recipes/default.rb。您也可以添加多個run_list項,并通過創建配置文件,將多個不同的cookbook結合到一個不可變的Policyfile中。
完成之后,請繼續在run-chef-client的Cookbook目錄中運行cookstyle -a,并在下一步之前仔細檢查其語法:
- $ cd ~/chef-repo/cookbooks/run-chef-client
- $ cookstyle -a
一次性上傳Cookbook和配置文件
使用Policyfiles,您可以捆綁cookbook和合規性配置文件,并將它們上傳到Chef服務器上。首先,請安裝Policyfile.rb,以創建Policyfile.lock.json文件;然后請將該文件推送到Chef服務器處。
- $ cd ~/chef-repo/cookbooks/run-chef-client
- $ chef install Policyfile.rb
- $ Chef push prod Policyfile.lock.json
該推送命令包含了Policyfile所屬的策略組(Policy Group)。使用Chef,您可以為不同的目的創建不同的策略組,例如build、test和prod等。在本示例中,run-chef-client的cookbook和client-run配置文件會被添加到prod(生產環境)策略組。
有了./compliance/profiles/default/default.rb、inspec.yml和Policyfile.rb,你便可以使用Test Kitchen測試Cookbook和合規性控制,或直接跳到第 7 部分,在目標節點上應用run-chef-client的cookbook和配置。
用Knife上傳Cookbook
您可以使用簡單的Knife命令,將Cookbook上傳到Chef服務器處,然后將一到多個Cookbook分配給每個節點。其對應的命令代碼如下:
- $ knife upload cookbook run-chef-client
- $ knife node run_list add ubuntu01 'recipe[run-chef-client']
其中,第一個命令是將Cookbook上傳到Chef服務器;第二個指定run-chef-client的Cookbook在該節點上運行。
第 6 部分:Test Kitchen
Test Kitchen提供了諸如Docker、VirtualBox、Hyper-V、Amazon以及Azure云等多種方法,在本地測試Chef Cookbook和合規性代碼。由于我們在本例中使用的是Docker,因此應當在Workstation上安裝docker.io和docker -compose,并以非root的用戶身份去運行。
我們在使用-k dokken標志去創建run-chef-clientcookbook時,會自動在cookbookkitchen.yml目錄的根目錄下創建一個文件。如下代碼所示,該文件已經被配置為使用Dokken驅動程序(即為Docker)了。
- ---
- driver:
- name: dokken
- privileged: true # allows systemd services to start
- provisioner:
- name: dokken
- transport:
- name: dokken
- verifier:
- name: inspec
- platforms:
- - name: ubuntu-20.04
- driver:
- image: dokken/ubuntu-20.04
- pid_one_command: /bin/systemd
- intermediate_instructions:
- - RUN /usr/bin/apt-get update
- - name: centos-8
- driver:
- image: dokken/centos-8
- pid_one_command: /usr/lib/systemd/systemd
- suites:
- - name: default
- run_list:
- - recipe[chef-client::default]
- verifier:
- inspec_tests:
- - compliance/profiles/client-run/
- attributes:
- audit:
- compliance_phase: false
- reporter: 'cli'
類似虛擬機,上述kitchen.yml文件中的platform條目會拉取特殊的Docker鏡像。而Chef團隊已經為各種Linux操作系統準備了基本的容器,以便您為真實的環境開展測試,而無需額外的設置。
如果您想添加除了Ubuntu 20.04和CentOS 8之外的平臺,則可以通過https://hub.docker.com/u/dokken,添加來自dokken鏡像存儲庫里的條目。那里有著41個Dokken鏡像可供測試。
您也可以編輯suites下的verifier部分,以指向InSpec配置文件的相對路徑——compliance/profiles/client-run/。通過有效性驗證,它將有助于避免運行時的各種錯誤:
- attributes:
- audit:
- compliance_phase: false
- reporter: 'cli'
運行Test Kitchen
Test Kitchen的工作原理是:首先根據kitchen.yml平臺條目中所描述的鏡像,啟動容器(如VM或云實例),接著部署Chef-client和Chef配置文件,然后部署Chef代碼(被稱為converging),并驗證您的代碼,最后關閉并銷毀測試容器或實例。您可以通過導航到run-chef-clientCookbook目錄的根目錄,運行kitchen test,來一次性完成所有步驟:
- $ cd ~/chef-repo/cookbooks/run-chef-client
- $ kitchen test
上述簡單的命令執行了創建、聚合、驗證和銷毀步驟,并能顯示正在使用的Cookbook的終端內結果,以及合規階段的掃描結果。您可以繼續執行如下步驟:
- $ kitchen create
- $ kitchen converge
- $ kitchen verify
- $ kitchen destroy
通過單獨運行上述步驟,您可以重新運行kitchen converge和kitchen verify,以快速迭代各種更改。
第 7 部分:引導節點
既然cookbook和配置文件已推送到了Chef服務器并進行了測試,下面,我們將引導(bootstrapping)第一個目標節點并執行如下任務:
- 安裝Chef-client
- 創建配置文件--config.rb,并定義Chef Server和身份驗證等詳細信息
- 按需安裝可信任的自簽名證書
Knife有一個內置的引導命令,可以一次性完成所有步驟。您可以在首個Chef Workstation的目標節點(應當能夠默認支持ssh系統)上,引導如下命令:
- $ knife bootstrap ubuntu01.fakedomain.tld -U ubuntu -i ~/.ssh/id_rsa --sudo -N ubuntu01 --policy-group prod --policy-name run-chef-client
該bootstrap命令允許您使用如下標志來定義各種細節:
- ubuntu01.fakedomain.tld – 沒有標志,只有被引導服務器的主機名或IP地址。
- -U(或--connection-user)ubuntu – 連接到遠程節點時用到的用戶名。
- -i ~/.ssh/id_rsa – ssh的身份驗證密鑰(而-P可用于密碼驗證)。
- –-sudo – 以超級用戶的權限執行命令。這通常是新軟件安裝和引導所必需的。
- -N(或 --node-name)ubuntu01 – 向Chef服務器注冊時使用的“節點名稱”。
- --policy-group prod --policy-name run-chef-client – 它會將run-chef-clientpolicy分配給節點。您可以使用-r 'recipe[run-chef-client]'在引導期間將Cookbook應用于節點上。在本例中,default.rb recipe被應用了上去。
- $ knife bootstrap ssh://10.128.1.25 -U ubuntu -i ~/.ssh/id_rsa -N ubuntu01 -r 'recipe[run-chef-client]'
Windows:
- $ Knife bootstrap winrm://10.128.1.26 -U Administrator -P mypassword -N windows10 -r 'recipe[run-chef-client]'
同時,您也可以引導節點,而不是分配任何recipe或策略:
- $ Knife bootstrap ssh://10.128.1.25 -U ubuntu -i ~/.ssh/id_rsa -N ubuntu01
- $ Knife bootstrap winrm://10.128.1.26 -U Administrator -P mypassword -N windows10
如果您想在沒有任何標志的情況下,引導一到多個節點,則可以稍后再設置策略,并分配run_lists或策略:
- $ Knife node policy set ubuntu01 prod run-chef-client
或者:
- $ Knife node run_list add ubuntu01 'recipe[run-chef-client]'
上面只是一些常用的選項。如果您想了解更多有關Knife命令的完整標志列表,只需使用-h標志,即可獲得全量選項和用法示例的描述。
通過運行Chef-client來查看系統的狀態和合規性
您可以通過knife,在Chef服務器列表中查詢到ubuntu01節點:
- $ knife node list
- ubuntu01
如果使用策略或recipe的標志去引導節點,您將在CLI中看到進度顯示和結果輸出。當然,您也可以通過在該節點上運行的Chef-client,以查看到Chef代碼的運行情況。雖然新的run-chef-client cookbook會每隔30分鐘運行一次,但您可以通過以下幾種方式,來手動執行:
使用knife運行Chef-client
knife工具允許您在任何遠程節點上運行ssh和winrm選項。在Linux或macOS節點上,您可以通過如下方式,來運行命令sudo chef-client:
- $ knife ssh 'name:ubuntu01' 'sudo Chef-client'
值得一提的是,如果目標主機是Windows系統,那么請使用winrm選項,并提供管理級別的用戶名(-x)和密碼(-P):
- $ knife winrm 'name:win10' 'chef-client' -x Administrator -P mypassword
而對于支持ssh的節點,您可以進入shell,并從命令行運行sudo chef-client;在Windows上,則請使用RDP登錄,以管理員身份打開PowerShell,然后運行chef-client。
不僅僅是策略即代碼(Policy as Code)
由于本例中的ubuntu01節點已經被Chef Infra Client和Chef代碼引導啟動和運行,因此您可以通過如下命令,快速了解到其相關信息的摘要:
- knife node show ubuntu01
- Node Name: ubuntu01
- Policy Name: run-chef-client
- Policy Group: prod
- FQDN: ubuntu01.fakedomain.tld
- IP: 10.128.1.25
- Run List: recipe[run-chef-client::default]
- Recipes: run-chef-client::default
- Platform: ubuntu 20.04
- Tags:
您還可以使用Chef查詢與該節點相關的各種系統信息。例如:
- $ knife search node 'name:ubuntu01' -a shells
- 1 items found
- ubuntu01:
- shells:
- /bin/sh
- /bin/bash
- /bin/rbash
- /bin/dash
上例只是搜索并返回了單個節點。當然,您也可以使用通配符,返回有關所有節點、或具有特定前綴或后綴的節點信息。例如:'name:*'(所有節點)、或'name:web*'(僅以“web”開頭的節點)、或'name:*web'(僅以“web”結尾的節點)。除了名稱以外,您還可以使用平臺、或其他knife選項。例如:
- $ knife search node 'platform:ubuntu' -a shells
這些信息從何而來?
即使您沒有使用Chef對節點實施任何配置上的更改,Chef-client的每次運行也都會使用一個名為ohai的工具,來收集系統分析信息,并將它與運行結果一起發送回Chef服務器。這就意味著,您可以開箱即用地了解有關被管理系統的各種信息,并且能夠隨著更多服務器被引導,而輕松地查詢到更多與Chef相關的信息,進而在recipe中使用此類信息,來操控各個節點。
以下便是從Chef中提取更多數據類型的示例:
- $ knife search node 'name:ubuntu01' -a memory.total -a filesystem.by_mountpoint./.percent_used -a ipaddress
- 1 items found
- ubuntu01:
- filesystem.by_mountpoint./.percent_used: 13%
- ipaddress: 10.128.1.133
- memory.total: 524288kB
在此搜索中,您可以查看有關磁盤的使用情況和內存的數據。Ohai允許您通過查詢各種節點的信息,來自動檢測諸如節點的公共IP地址等AWS的內部信息。對此,您可以將-a ec2.public_ipv4替換上例中的-a ipaddress。值得注意的是,即使您的節點是在沒有應用run_list或策略的情況下被引導的,它也能夠收集到數據。
關于屬性的更多想法
我們在節點上對于Cookbook節點的任何修改,都可以被直接執行,而無需變動任何底層代碼的屬性。例如,您可以通過在節點上運行一個knife搜索,后跟-l標志,來查看某個節點的所有可用屬性:
- $ knife search node 'name:ubuntu01' -l
- 1 items found
- Node Name: ubuntu01
- Policy Name: run-chef-client
- Policy Group: prod
- FQDN: ip-172-31-15-141.ec2.internal
- IP: 3.85.154.118
- Run List: recipe[run-chef-client::default]
- Recipes: run-chef-client::default
- Platform: ubuntu 20.04
- Tags:
- Attributes:
- tags:
- …
- chef_environment: prod
- chef_guid: 4d10ca10-7658-4693-91b6-6ed25d881a1c
- chef_packages:
- chef:
- chef_effortless:
- chef_root: /opt/chef/embedded/lib/ruby/gems/3.0.0/gems/chef-17.5.22/li
- b
- version: 17.5.22
- ohai:
- ohai_root: /opt/chef/embedded/lib/ruby/gems/3.0.0/gems/ohai-17.5.2/lib/ohai
- version: 17.5.2
- cloud:
- local_hostname: ip-172-31-15-141.ec2.internal
- local_ipv4: 172.31.15.141
- local_ipv4_addrs: 172.31.15.141
- provider: ec2
- public_hostname: ec2-3-85-154-118.compute-1.amazonaws.com
- public_ipv4: 3.85.154.118
- public_ipv4_addrs: 3.85.154.118
- command:
- ps: ps -ef
- cookbooks:
- run-chef-client:
- version: 0.1.0
- counters:
- network:
- interfaces:
- eth0:
- rx:
- bytes: 396541197
- drop: 0
- errors: 0
- …
第 8 部分:擴展所學的內容
至此,您已經了解了Chef是如何協同Cookbook工作的。但是在實際應用中,您可能需要諸如:在webserver上打開443端口、或是在其他服務器上安裝特定的應用等多種配置。因此,您可以使用多種方式,將多個Cookbook組合在一起,提供可應用于被定義節點組的基本Cookbook或配置文件。例如,Policyfiles就能夠簡便地將多個Cookbook、recipe和配置文件捆綁在一個對象中。而另一種方法則是將Cookbook依賴項添加到Cookbook的metadata.rb文件中,并在default.rbCookbook中使用include_recipe資源。
在metadata.rb中定義依賴項
每個cookbook都帶有一個metadata.rb文件,可用于定義其名稱、版本、以及各種依賴項。如下代碼展示了,若想添加對另一個cookbook的依賴項,只需告知其您的run-chef-clientcookbook,以及向metadata.rb添加一個depends條目即可:
- name 'base_cookbook'
- maintainer 'Jack Smith'
- maintainer_email '[email protected]'
- license 'Apache-2.0'
- description 'Installs/Configures base_cookbooks'
- long_description 'Installs/Configures base_cookbooks'
- version '0.1.0'
- chef_version '>= 16.0'
- depends 'run-chef-client'
在recipes/default.rb中定義Cookbook依賴項
在第 3 部分中,我們了解到cookbook包含著一個default.rbrecipe,該recipe定義了在未指定其他特定recipe時,應執行哪些操作。而在該base_cookbook示例中,cookbook定義了與其相關的recipe。那么,如果您有第二個名為closed-ports的cookbook,它會在自己的cookbook和recipe目錄中擁有自己的default.rb。而如果要在應用run-chef-clientcookbook時,調用closed-ports這一cookbook,您可以在修改后使用include_recipe資源,并讀取cookbooks/run-chef-client/recipes/default.rb。
- #
- # Cookbook:: base_cookbook
- # Recipe:: default
- #
- # Copyright:: 2021, Jack Smith, All Rights Reserved.
- include_recipe 'closed-ports::default'
通過這種方式,您可以創建基本的Cookbook,以包含多個recipe和Cookbook。而且,當您在使用Policyfiles時,它是固定不變的,并能夠將一到多個cookbook中的所有內容捆綁到一起(包括已定義的任何InSpec配置文件)。可見,由于不需要舊的Chef技術來上傳Cookbook依賴項,因此Policyfile方法應作為開發的首選。
更多資源
如果您在開始動手實踐之前,想了解更多相關知識的話,請瀏覽如下鏈接:
- Chef的部署知識
- 從基本到高級的Chef技術
- 如何安裝Chef automation和Chef Infra Server(視頻)
- 如何構建Chef Workstation,創建Cookbook與合規性(視頻)
原文標題:Chef 101: Getting Started With Automation,作者: John Tonello
【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】
原文鏈接:https://developer.51cto.com/art/202111/689421.htm