在 Chef Workstation 上建立了一個 cookbook 以後,咱們執行如下命令來進行測試:html
chef-client --local-mode --override-runlist first_cookbook
這將在本機執行 cookbook,如今來將 first_cookbook 分發到節點上。node
Chef Workstation 進行 cookbook 的編寫測試以後,須要將其上傳到 Chef Server 才能分發到各個節點,執行如下命令將 cookbook 上傳:linux
knife cookbook upload first_cookbook
上傳以後來查看服務器的 cookbook 列表,列出 cookbook:nginx
first_cookbook 0.1.0
能夠看到 cookbook 已經成功上傳,如今在服務器配置節點的運行。shell
在 Chef Server 安裝搭建好以後,默認不提供圖形界面的前臺管理功能,若要使用前臺管理咱們的 cookbook 以及節點信息,須要安裝 Chef Server 的前臺界面。執行安裝:json
chef-server-ctl install chef-manage
從新配置:bootstrap
隨後配置:ubuntu
chef-manage-ctl reconfigure
打開前臺,默認啓用 ssl,因此開放了 Chef Server 的 443 端口。vim
打開 https://192.168.221.89,能夠看到登錄頁面,使用管理員登錄。登錄後能夠看到節點信息:centos
{% imgurl chef-tutorial-3/chef-server-manage-1.png %}
而後來編輯節點,配置節點的 Run List:
找到節點配置:
{% imgurl chef-tutorial-3/chef-server-manage-2.png %}
配置 Run List:
{% imgurl chef-tutorial-3/chef-server-manage-3.png %}
將咱們的 cookbook 從 Avaliable Recipes 拖到 Current Run List 內。
在 Chef Workstation 中執行命令:
knife ssh chef-client.geekrainy.local 'chef-client' -m -x root -P passowrd
能夠看到輸出:
[root@chef-dk chef-repo]# knife ssh chef-client.geekrainy.local 'chef-client' -m -x root -P 940911 chef-client.geekrainy.local Starting Chef Client, version 13.6.4 chef-client.geekrainy.local resolving cookbooks for run list: ["first_cookbook"] chef-client.geekrainy.local Synchronizing Cookbooks: chef-client.geekrainy.local - first_cookbook (0.1.0) chef-client.geekrainy.local Installing Cookbook Gems: chef-client.geekrainy.local Compiling Cookbooks... chef-client.geekrainy.local Converging 7 resources chef-client.geekrainy.local Recipe: first_cookbook::default chef-client.geekrainy.local * file[/root/test.txt] action create chef-client.geekrainy.local - create new file /root/test.txt chef-client.geekrainy.local - update content in file /root/test.txt from none to 48a12b chef-client.geekrainy.local --- /root/test.txt 2017-12-27 17:33:34.259758283 +0800 chef-client.geekrainy.local +++ /root/.chef-test20171227-8105-1u3f11.txt 2017-12-27 17:33:34.258758279 +0800 chef-client.geekrainy.local @@ -1 +1,2 @@ chef-client.geekrainy.local +This file was created by Chef! chef-client.geekrainy.local - restore selinux security context chef-client.geekrainy.local * yum_package[pcre-devel] action install chef-client.geekrainy.local - install version 8.32-17.el7 of package pcre-devel chef-client.geekrainy.local * yum_package[openssl] action install (up to date) chef-client.geekrainy.local * yum_package[openssl-devel] action install chef-client.geekrainy.local - install version 1.0.2k-8.el7 of package openssl-devel chef-client.geekrainy.local * cookbook_file[/etc/init.d/nginx] action create chef-client.geekrainy.local - create new file /etc/init.d/nginx chef-client.geekrainy.local - update content in file /etc/init.d/nginx from none to 0bc460 chef-client.geekrainy.local --- /etc/init.d/nginx 2017-12-27 17:35:32.489219470 +0800 chef-client.geekrainy.local +++ /etc/init.d/.chef-nginx20171227-8105-19448uh 2017-12-27 17:35:32.488219466 +0800 chef-client.geekrainy.local @@ -1 +1,56 @@ chef-client.geekrainy.local +#!/bin/bash chef-client.geekrainy.local +#chkconfig: 345 86 16 chef-client.geekrainy.local +start(){ chef-client.geekrainy.local +if [ -f /var/lock/subsys/tengine.lock ];then chef-client.geekrainy.local + echo "Tengine is already running: [ FAILED ]" chef-client.geekrainy.local +else chef-client.geekrainy.local + if /usr/local/nginx/sbin/nginx ;then chef-client.geekrainy.local + echo "Starting tengine: [ OK ]" chef-client.geekrainy.local + touch /var/lock/subsys/tengine.lock chef-client.geekrainy.local + else chef-client.geekrainy.local + echo "Starting tengine: [ FAILED ]" chef-client.geekrainy.local + fi chef-client.geekrainy.local +fi chef-client.geekrainy.local +} chef-client.geekrainy.local +stop(){ chef-client.geekrainy.local +if [ -f /var/lock/subsys/tengine.lock ];then chef-client.geekrainy.local + if /usr/local/nginx/sbin/nginx -s quit ;then chef-client.geekrainy.local + echo "Stopping tengine: [ OK ]" chef-client.geekrainy.local + rm -rf /var/lock/subsys/tengine.lock chef-client.geekrainy.local + else chef-client.geekrainy.local + echo "Stopping tengine: [ FAILED ]" chef-client.geekrainy.local + fi chef-client.geekrainy.local +else chef-client.geekrainy.local + echo "Tengine not runing: [ FAILED ]" chef-client.geekrainy.local +fi chef-client.geekrainy.local +} chef-client.geekrainy.local +reload(){ chef-client.geekrainy.local +if /usr/local/nginx/sbin/nginx -s reload ;then chef-client.geekrainy.local + echo "Reload tengine: [ OK ]" chef-client.geekrainy.local +else chef-client.geekrainy.local + echo "Reload tengine: [ FAILED ]" chef-client.geekrainy.local +fi chef-client.geekrainy.local +} chef-client.geekrainy.local +case $1 in chef-client.geekrainy.local +"start") chef-client.geekrainy.local + start chef-client.geekrainy.local +;; chef-client.geekrainy.local +"stop") chef-client.geekrainy.local + stop chef-client.geekrainy.local +;; chef-client.geekrainy.local +"restart") chef-client.geekrainy.local + stop chef-client.geekrainy.local + sleep 1 chef-client.geekrainy.local + start chef-client.geekrainy.local +;; chef-client.geekrainy.local +"reload") chef-client.geekrainy.local + reload chef-client.geekrainy.local +;; chef-client.geekrainy.local +"status") chef-client.geekrainy.local + s=`pidof -s nginx` chef-client.geekrainy.local + [ "$s" ] && echo "Tengine(nginx) pid $s running!!" || echo "Tengine(nginx) not runging!" chef-client.geekrainy.local +;; chef-client.geekrainy.local +*) chef-client.geekrainy.local +echo "usage: $0 start|stop|restart|reload|status" chef-client.geekrainy.local +esac chef-client.geekrainy.local - change mode from '' to '0755' chef-client.geekrainy.local - change owner from '' to 'root' chef-client.geekrainy.local - change group from '' to 'root' chef-client.geekrainy.local - restore selinux security context chef-client.geekrainy.local * script[install_tengine] action run chef-client.geekrainy.local - execute "bash" "/tmp/chef-script20171227-8105-irvw5g" chef-client.geekrainy.local * service[nginx] action start chef-client.geekrainy.local - start service service[nginx] chef-client.geekrainy.local chef-client.geekrainy.local Running handlers: chef-client.geekrainy.local Running handlers complete chef-client.geekrainy.local Chef Client finished, 6/7 resources updated in 03 minutes 21 seconds
執行完成便可建立成功,在 Chef Client 中執行驗證:
service nginx status
看到輸出:
Tengine(nginx) pid 23776 running!!
證實已經部署成功。
除了在 Chef Server 前臺管理外,還可在 Chef Workstation 內使用命令行來管理 Run List。
查看 Node 的狀態:
[root@chef-dk chef-repo]# knife node show chef-client.geekrainy.local Node Name: chef-client.geekrainy.local Environment: _default FQDN: chef-client.geekrainy.local IP: 192.168.221.91 Run List: Roles: Recipes: first_cookbook, first_cookbook::default Platform: centos 7.3.1611 Tags:
這裏看到 Run List 爲空,接下來將咱們的 cookbook 添加到 Run List,咱們定義了默認的 Recipes: default,於是添加 cookbook 實際上執行的就是 cookbook 中的 default recipes。
[root@chef-dk chef-repo]# knife node run_list add chef-client.geekrainy.local recipe[first_cookbook] chef-client.geekrainy.local: run_list: recipe[first_cookbook]
再次查看狀態:
[root@chef-dk chef-repo]# knife node show chef-client.geekrainy.local Node Name: chef-client.geekrainy.local Environment: _default FQDN: chef-client.geekrainy.local IP: 192.168.221.91 Run List: recipe[first_cookbook] Roles: Recipes: first_cookbook, first_cookbook::default Platform: centos 7.3.1611 Tags:
就成功添加了一個 Run List。
經過編輯 node 配置文件,也能夠編輯 Run List。
knife node edit chef-client.geekrainy.local
執行後可能報錯:
ERROR: You must set your EDITOR environment variable or configure your editor via knife.rb
配置環境變量能夠解決:
export "EDITOR=vim"
再次執行後能夠編輯 JSON 格式的節點信息:
{ "name": "chef-client.geekrainy.local", "chef_environment": "_default", "normal": { "tags": [ ] }, "policy_name": null, "policy_group": null, "run_list": [ "recipe[first_cookbook]" ] }
關於 Knife 和 Run List 的更多信息能夠參考:
上文介紹了經過 Chef Server 的前臺界面和命令行對節點的 Run List 進行管理,而且能夠成功執行咱們的 「烹飪」操做,但這兩種方法都有不便之處。用前臺界面管理雖然直觀但管理更多節點時效率低,命令行也顯得繁瑣而且容易進行誤操做。在執行 kinfe bootstrap
的過程當中,也能夠用編輯好的 json 文件進行節點的初始化:
knife bootstrap localhost -p 2200 -N ubuntu-12.04 -r 'role[group1]' --ssh-user vagrant --sudo --bootstrap-vault-file sea-power-bootstrap-vault-file.json
上述爲官網示例,在 json 中去定義和編輯,是一種較爲可靠的定義節點的方式。
到這裏,就簡單的完成了從構建節點,到建立 cookbook,到測試發佈的過程。然而,這裏的示例存在不少不足,不具備較強的普適性,擴展和管理都很不便。接下來將配置一個較爲完善的 cookbook,來探索一些較爲優雅的實踐方式。
-EOF-