Chef 自動化運維:開始「烹飪」

在 Chef Workstation 上建立了一個 cookbook 以後,咱們執行如下命令來進行測試:html

chef-client --local-mode --override-runlist first_cookbook

這將在本機執行 cookbook,如今來將 first_cookbook 分發到節點上。node

上傳 cookbook

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

管理 Run List

打開前臺,默認啓用 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 配置文件

經過編輯 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 的更多信息能夠參考:

  • Run List: https://docs.chef.io/run_lists.html
  • Knife https://docs.chef.io/knife_node.html

擴展

上文介紹了經過 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-

相關文章
相關標籤/搜索