当前位置: 首页 > 工具软件 > Chef > 使用案例 >

Chef入门详解 Chef安装 Chef使用

从开济
2023-12-01

本文是参考官网,如果有理解错误欢迎指正,问题欢迎留言一起探讨

安装部署

chef server

官方文档:https://docs.chef.io/server/install_server/
重要前提:修改好自己的hostname(我配置的值为chefserver,workstation和node机器都需要能解析),时钟同步,关闭防火墙

  1. 下载安装包然后上传的到服务器安装
    下载地址:https://downloads.chef.io/chef-server/
    [root@chefworkstation ~] rpm -Uvh chef-server-core-12.19.31-1.sles12.x86_64.rpm
    
  2. 配置、启动服务:chef-server-ctl命令帮助文档:https://docs.chef.io/server/ctl_chef_server/
    [root@chefworkstation ~] chef-server-ctl reconfigure
    
  3. 创建administrator用户
    [root@chefworkstation ~] mkdir -p /path/to
    [root@chefworkstation ~] chef-server-ctl user-create janedoe Jane Doe janed@example.com 'abc123' --filename /path/to/janedoe.pem
    
  4. 创建organization并将用户janedoe关联到组织的admin安全组
    [root@chefworkstation ~] chef-server-ctl org-create 4thcafe 'Fourth Cafe, Inc.' --association_user janedoe --filename /path/to/4thcafe-validator.pem
    
    为了方便管理我创建一个cw用户,并将cw加入admin组,后续安装workstation的时候会用到cw.pem文件
    [root@chefworkstation ~] chef-server-ctl user-create cw chef workstation cw@example.com '111111' --filename /path/to/cw.pem
    [root@chefworkstation ~] chef-server-ctl org-user-add 4thcafe cw --admin
    

chef workstation

官方文档:https://docs.chef.io/workstation/install_workstation/
重要前提:修改好自己的hostname,能解析chefserver(server机器的hostname),配置时钟同步,关闭防火墙,最小内存4G

  1. 安装软件包
    [root@chefworkstation ~] wget https://packages.chef.io/files/stable/chef-workstation/21.2.278/el/8/chef-workstation-21.2.278-1.el7.x86_64.rpm
    [root@chefworkstation ~] yum localinstall chef-workstation-21.2.278-1.el7.x86_64.rpm
    [root@chefworkstation ~] chef -v
    Chef Workstation version: 21.2.278
    Chef Infra Client version: 16.10.8
    Chef InSpec version: 4.26.4
    Chef CLI version: 3.1.1
    Chef Habitat version: 1.6.181
    Test Kitchen version: 2.10.0
    Cookstyle version: 7.8.0
    
    查看安装目录,默认workstation是安装在/opt下
    [root@chefworkstation opt] ls /opt/
    chef-workstation
    
  2. 将Chef Workstation中的Ruby设置为linux默认ruby
    [root@chefworkstation ~] echo 'eval "$(chef shell-init bash)"' >> ~/.bashrc
    
    重新开一个终端(重新开一个xshell)执行which ruby
    [root@chefworkstation ~] which ruby
    /opt/chef-workstation/embedded/bin/ruby
    
  3. 创建repository 仓库用于存放本地的cookbook等资源(命令中chef-repo代表你要创建的repository名字),最后会在执行命令的目录下创建仓库,为方便管理我选择和workstation放在同一个目录下
    [root@chefworkstation ~] cd /opt/
    [root@chefworkstation ~] chef generate repo chef-repo
    
    (chef命令帮助文档:https://docs.chef.io/workstation/ctl_chef/#chef-generate-repo
    最后目录结构如下
    [root@chefworkstation opt] ll /opt/
    drwxr-xr-x 6 root root 161 Aug 13 10:08 chef-repo
    drwxr-xr-x 7 root root 186 Aug 13 09:46 chef-workstation
    [root@chefworkstation opt] tree chef-repo/
    chef-repo/
    ├── chefignore
    ├── cookbooks
    │   ├── example
    │   │   ├── attributes
    │   │   │   └── default.rb
    │   │   ├── metadata.rb
    │   │   ├── README.md
    │   │   └── recipes
    │   │       └── default.rb
    │   └── README.md
    ├── data_bags
    │   ├── example
    │   │   └── example_item.json
    │   └── README.md
    ├── LICENSE
    ├── policyfiles
    │   └── README.md
    └── README.md
    7 directories, 11 files
    
  4. 使用knife configure命令创建credentials文件(~/.chef/目录)用于和server通信(创建完成后使用knife config show查看)
    该命令会要求提供两个参数Chef Server URL和Client Name,我的参数内容如下:
    Chef Server URL:https://chefserver/organizations/4thcafe(chefserver是server机器的hostname,需要在workstation的hosts里面添加解析,4thcafe是server上创建的组织名称)
    Client Name:cw (server上创建的用户)
    [root@chefworkstation opt] knife configure
    #查看内容
    [root@chefworkstation cookbooks] knife config show
    Loading from credentials file /root/.chef/credentials
    chef_server_url: https://chefserver/organizations/4thcafe
    client_key:      /root/.chef/cw.pem
    config_file:
    log_level:       warn
    log_location:    STDERR
    node_name:       cw
    profile:         default
    
  5. 将server上用户cw的pem文件拷贝到workstation ~/.chef路径,查看目录结构
    [root@chefworkstation opt] ll ~/.chef/
    -rw-r--r-- 1 root root   36 Aug 13 10:08 chef_guid
    -rw-r--r-- 1 root root  133 Aug 13 10:35 credentials
    -rw-r--r-- 1 root root 1674 Aug 13 10:52 cw.pem
    [root@chefworkstation opt]
    
    credentials:knife命令的配置文件(类似于nginx.conf这种文件),详细文件解读参考: https://docs.chef.io/workstation/config_rb/
    cw.pem:workstation上运行命令,后台通过调用server的API完成相应改动,cw.pem用于API服务验证
  6. 验证workstation与server通信是否正常
    #由于server使用自签证书,需要在workstation添加信任(knife ssl fetch)
    [root@chefworkstation opt] knife ssl fetch
    #查看所有client,如果返回结果类似如下则表示workstation可以和server正常通信
    [root@chefworkstation opt] knife client list
    4thcafe-validator
    

chef client安装

官方文档:https://docs.chef.io/workstation/knife_bootstrap/
重要前提:修改好自己的hostname,能解析chefserver(server机器的hostname),配置时钟同步,关闭防火墙

chef client安装是指在被管理的node上安装客户端程序chef client,该操作是在workstation上执行命令完成
在workstation上执行命令安装client(修改命令中的IP,服务器登录的账号密码)

#192.168.16.12: node节点的IP
#chefnode2:node节点的hostname
#root: 登录node服务器的用户名
#1:登录node服务器的用户名对应的密码
[root@chefworkstation opt]knife bootstrap 192.168.16.12 -N chefnode -U root -P 1

在workstation检查node是否安装成功

[root@chefworkstation opt] knife node list
chefnode

登录node节点,检查安装目录(默认安装路径是/opt/chef)

[root@chefnode chef] ll /opt/chef/
drwxr-xr-x 2 root root   204 Aug 12 13:21 bin
drwxr-xr-x 7 root root    67 Aug 12 13:21 embedded
-rw-r--r-- 1 root root 35962 Jul 28 03:24 LICENSE
drwxr-xr-x 2 root root  8192 Aug 12 13:21 LICENSES
-rw-r--r-- 1 root root  7002 Jul 28 03:25 version-manifest.json
-rw-r--r-- 1 root root  3500 Jul 28 03:25 version-manifest.txt
[root@chefnode chef]

knife命令详解:https://docs.chef.io/workstation/knife/

实战:Quick Start

接下来讲解如何编写recipe,创建文件,文件夹,安装软件包操作,总体流程如下
workstation本地创建repo->在repo中创建cookbook->编写recipe->本地执行recipe(非必须)->上传cookbook到server->node执行recipe

  1. 本地创建一个repo:myrepo
    [root@chefworkstation cookbooks] cd /opt/
    [root@chefworkstation opt] chef generate repo myrepo
    
  2. 创建本地cookbook:mycookbook
    [root@chefworkstation opt] cd myrepo/cookbooks/
    [root@chefworkstation cookbooks] chef generate cookbook mycookbook
    
  3. 编写recipe,具体语法格式和参数说明参考:
    recipe语法格式:https://docs.chef.io/resource/
    所有resource类型和参数:https://docs.chef.io/resources/
    [root@chefworkstation cookbooks] cd mycookbook/
    [root@chefworkstation mycookbook] vim recipes/default.rb
    写入内容如下注意(action和:之间有空格)
    #使用directory resource创建文件夹
    directory '/home/resource_directory' do
        action :create
    end
    
    #使用file resource创建文件
    file '/home/resource_directory/resource_file' do
        content 'This is created by chef!'
    end
    
    #使用bash resoure执行linux命令
    bash 'excute command' do
      cwd '/home/'
      code <<-EOH
        mkdir -p resource_bash
        echo "This is created by bash resource!" >> resource_bash_file.txt
      EOH
    end
    #使用package resource安装telnet软件包
    package 'telnet'  do
        action :install
    end
    
  4. 在workstation本地执行recipe,注意目录是否正确
    [root@chefworkstation mycookbook] pwd
    /opt/myrepo/cookbooks/mycookbook
    [root@chefworkstation mycookbook] chef-client -z -o mycookbook
    
  5. 检查对应的文件夹,文件是否创建,以及软件包是否安装
    [root@chefworkstation mycookbook] ll /home/
    total 4
    drwxr-xr-x 2 root root  6 Aug 19 11:40 resource_bash
    -rw-r--r-- 1 root root 34 Aug 19 11:40 resource_bash_file.txt
    drwxr-xr-x 2 root root 27 Aug 19 11:40 resource_directory
    [root@chefworkstation mycookbook] rpm -qa |grep telnet
    telnet-0.17-66.el7.x86_64
    
  6. 至此我们已经学会在workstation本地编写recipe,使用各种自带的resource完成文件创建,软件包安装等操作,接下来就把cookbook上传到server然后在node上执行,使node也达到同样的状态
    [root@chefworkstation mycookbook] knife cookbook upload mycookbook --cookbook-path /opt/myrepo/cookbooks/
    Uploading mycookbook     [0.1.0]
    Uploaded 1 cookbook.
    
    可选操作:命令中需要指定cookbook的路径,我们可以把这个参数写到配置文件中,以后就不需要在命令中手动传参了
    [root@chefworkstation mycookbook] vim /root/.chef/credentials
    #添加以下一行内容:具体可以添加哪些参数,请参考前文提到的credentials文件
    cookbook_path   = '/opt/myrepo/cookbooks/'
    
    到此可能你有疑问,knife这个命令是干什么用的,官方介绍如下:
    knife is a command-line tool that provides an interface between a local chef-repo and the Chef Infra Server
    knife是一个命令行工具,提供本地repo和server交互的接口,简单理解就是knife命令执行大部分时间都和server有关,具体knife的用法请参考前文给的knife官网详细说明
    要查看server上有哪些cookbook:
    [root@chefworkstation mycookbook] knife cookbook list
    mycookbook             0.1.0
    
  7. 接下来就是让node去执行刚才上传的recipe,但是现在node还不知道自己需要执行哪些内容,需要我们告诉它应该执行哪些内容(run list)
    #编辑chefnode这个机器的run list,告诉它需要执行mycookbook的默认recipe, -e vi是指定编辑器,你也可以用vim或者其他
    #为了方便这个也可以写在配置文件中:在credentials文件同目录创建XXX.d文件夹,然后在里面创建XXX.rb文件,写入以下一行
    #knife[:editor]      = 'vi'
    [root@chefworkstation mycookbook] knife node edit chefnode -e vi
    
    修改后内容如下(修改完成后:wq保存,和本地vi文件一样)
    	{
      "name": "chefnode",
      "chef_environment": "_default",
      "normal": {
        "tags": [
    
        ]
      },
      "policy_name": null,
      "policy_group": null,
      "run_list": [
      "recipe[mycookbook::default]"
    ]
    
    }
    
  8. 接着就可以登录node机器然后执行run list
    #在node机器任意目录执行都可以,执行玩后检查文件,文件夹是否创建以及telnet包是否安装。
    [root@chefnode home] chef-client
    
    至此流程操作完成,关于role,environment,policyfile等更多内容请参考官网:https://docs.chef.io/
 类似资料: