Chef 简介
Chef 是一款基于 Ruby 语言开发的自动化配置管理工具。它能够帮助用户将基础设施的配置和管理过程转化为代码,实现基础设施即代码(Infrastructure as Code)的目标,从而提高运维效率,减少人为错误。Chef 可以用于管理各种规模的服务器,从几台到上千台都适用。
适用场景:
- 大规模服务器配置管理
- 云环境自动化部署
- DevOps 持续集成/部署
简单来说,当你需要管理几十台甚至上百台服务器时,Chef 能帮你自动化完成配置工作,节省大量人工操作时间。
准备工作
服务器准备
必要前提:
- 一个充满求知欲的大脑。
- 一台 Linux 服务器(推荐腾讯云、阿里云或雨云等)。
- 3 台 Debian 12 服务器
我将以 雨云 为例,带大家创建一台自己的云服务器,以便学习本篇文章的内容。
注册链接: https://rainyun.ivwv.site
创建雨云服务器
以下步骤仅供参考,请根据实际需求选择配置。
- 点击 云产品 → 云服务器 → 立即购买。
- 选择距离你较近的区域,以保证低延迟。
- 按照自己需求选择配置,选择 Debian 12 版本,按照自己需求是否预装Docker。
- 最后按照提示进行购买。
- 购买后等待机器部署完毕,点击刚刚创建好的服务器,进入管理面板,找到远程连接相关信息。
- 我们使用
PowerShell
进行SSH
远程连接到服务器,Win+R
打开运行窗口,输入powershell
后点击确定。
- 输入
ssh root@你的服务器IP
例如ssh root@154.9.227.239
回车后,首次需要输入yes
,再次回车后即可登录服务器。
- 到此为止,我们的云服务器就远程连接上了。
开始部署
设置 FQDN
在第一步中,你将为 Chef 服务器、Chef 工作站和客户端配置 FQDN(完全限定域名)。
运行以下 hostnamectl
命令,为每台服务器设置 fqdn。
bash
sudo hostnamectl set-hostname chef.example.local
sudo hostnamectl set-hostname workstation.example.local
sudo hostnamectl set-hostname client.example.local
使用以下 nano 编辑器命令,打开每台服务器上的 /etc/hosts
文件。
bash
sudo nano /etc/hosts
插入以下配置,并确保使用你的设置更改详细的 IP 地址、主机名和 fqdn。
192.168.5.15 chef.example.local chef
192.168.5.20 workstation.example.local workstation
192.168.5.21 client.example.local client
完成后保存并关闭文件。
现在运行以下命令,以确保每个 fqdn 都指向服务器的正确 IP 地址。
bash
sudo hostname -f
ping -c3 chef.example.local
同步服务器之间的时间
配置 FQDN 后,你将确保每台服务器的时间都已同步。在本例中,你将在 Chef 服务器上设置 NTP 服务器,并配置 Chef 工作站和客户端以连接到该服务器。
在 Chef 服务器上设置 Chrony
在 Chef 服务器上,运行以下命令以更新存储库包索引并安装 Chrony 包。
bash
sudo apt update
sudo apt install chrony -y
安装 Chrony 后,使用以下 nano 编辑器命令打开文件 /etc/chrony/chrony.conf
。
bash
sudo nano /etc/chrony/chrony.conf
插入以下配置以设置默认 NTP 服务器。请务必选择服务器最近的位置,有关详细信息,请查看 ntp.org。
此外,你还将在 Chef 服务器中将 Chrony 配置为 Chef 工作站和客户端的 NTP 服务器。
pool 0.nl.pool.ntp.org iburst
pool 1.nl.pool.ntp.org iburst
pool 2.nl.pool.ntp.org iburst
pool 3.nl.pool.ntp.org iburst
allow 192.168.5.0/24
完成后保存并关闭文件。
接下来,运行以下命令以设置默认时区并启用 NTP。
bash
sudo timedatectl set-timezone Europe/Amsterdam
sudo timedatectl set-ntp true
然后,重新启动 chrony 服务以应用更改。
bash
sudo systemctl restart chrony
最后,使用以下命令验证 NTP 源。
bash
chronyc sources
你应该收到如下输出:
在 Chef 工作站和客户端上
现在移动到 Chef 工作站和客户端计算机。然后,运行以下命令以更新存储库并在两台服务器上安装 Chrnoy。
bash
sudo apt update
sudo apt install chrony -y
之后,使用以下 nano 编辑器命令修改 Chrony 配置 /etc/chrony/chrony.conf
。
bash
sudo nano /etc/chrony/chrony.conf
注释掉默认的 NTP 源以禁用它,然后输入 Chef 服务器 IP 地址作为 NTP 服务器,如下所示。
# default chrony
server 192.168.5.15 iburst
完成后保存并关闭文件。
接下来,运行以下命令以设置默认时区并启用 NTP。
bash
sudo timedatectl set-timezone Europe/Amsterdam
sudo timedatectl set-ntp true
然后,重新启动 Chrony 服务以应用你的更改。
bash
sudo systemctl restart chrony
最后,使用以下命令验证 Chef 工作站和客户端上的 NTP 源。
bash
chronyc sources
你应该看到 Chef 工作站和客户端的默认 NTP 源是 Chef 服务器,其 IP 地址为 192.168.5.15。
安装和配置 Chef Server
通过 DEB 安装 Chef Server
移动到 Chef 服务器并运行以下命令以下载 Chef 服务器包。在本例中,你将使用 Chef 15。
bash
VERSION="15.7.0"
wget https://packages.chef.io/files/stable/chef-server/${VERSION}/ubuntu/22.04/chef-server-core_${VERSION}-1_amd64.deb
现在使用以下命令通过 .deb 文件安装 Chef 服务器。安装将需要一些时间。
bash
sudo apt install ./chef-server-core_*.deb
安装完成后,你应该会收到确认信息 "Thank you for installing Chef Infra Server"。
接下来,运行下面的 chef-server-ctl 命令来重新配置你的 Chef Server 安装。
bash
sudo chef-server-ctl reconfigure
当系统询问时,输入 Y 以确认 Chef 许可证。
Chef 服务器初始化将开始。完成后,你应该会收到类似 "Chef Infra Server Reconfigured" 的确认信息。
配置用户和组织
现在你已经重新配置了 Chef Server,你将在 Chef Server 安装上设置用户和组织。
使用以下命令创建一个新的目录 ~/.chef
。
bash
mkdir -p ~/.chef
然后,使用以下命令创建一个新的 Chef 用户。在本例中,我们将创建一个新用户 alice ,密码为 password,TLS 证书将存储在 ~/.chef/alice.pem
中。
bash
sudo chef-server-ctl user-create alice Alice Wonderland alice@example.local 'password' --filename ~/.chef/alice.pem
现在使用以下命令创建一个新组织。请务必更改组织名称、关联用户和 TLS 证书路径的详细信息。
bash
sudo chef-server-ctl org-create hworgz 'HW Corp, Inc.' --association_user alice --filename ~/.chef/hworgz-validator.pem
一切完成后,使用以下命令验证 Chef 服务器上的用户和组织列表。
bash
sudo chef-server-ctl user-list
sudo chef-server-ctl org-list
如果一切顺利,你应该会看到 Chef 服务器,其中用户为 alice ,组织为 hworgz,如下所示。
此外,你还可以使用以下命令检查生成的 TLS 证书。你应该会看到 alice.pem 和 hworgz-validator.pem 证书。
bash
ls ~/.chef/
此时,你已完成 Chef Server 的安装。
安装和配置 Chef 工作站
安装 Chef Server 后,你将安装 Chef 工作站。 chef 工作站是管理员/用户用来创建和测试菜谱和食谱的节点。
在本例中,你将在具有 2 GB RAM 的 Debian 12 服务器上安装 Chef 工作站。
通过 DEB 安装 Chef 工作站
移动到 Chef 工作站并运行以下命令,使用以下 wget 命令下载 Chef 工作站包。在本例中,你将安装 Chef 工作站 23。
bash
VERSION="23.7.1042"
wget https://packages.chef.io/files/stable/chef-workstation/${VERSION}/debian/11/chef-workstation_${VERSION}-1_amd64.deb
下载完成后,运行以下命令将 Chef 工作站包安装到你的系统中。
bash
sudo apt install ./chef-workstation_*.deb
完成后,你应该会收到确认信息 "Thank you for installing Chef Workstation"。
最后,运行以下命令以验证 Chef 版本。
bash
chef -v
以下输出确认你已在 Debian 服务器上安装了 Chef 23。
配置 Chef 工作站
现在你已经安装了 Chef 工作站,接下来你将配置你的安装。
首先,使用以下命令生成新的 SSH 密.钥。在提示时输入以设置密.钥的密码。
bash
ssh-keygen -t ed25519
现在运行以下命令,将密.钥上传到 Chef Server chef.example.local。这将用于从 Chef 服务器检索 TLS 证书到工作站。
bash
ssh-copy-id root@chef.example.local
在询问时输入你的密码。
接下来,使用以下命令生成新的 Chef repo。在本例中,你将创建一个新的 Chef repo test-repo。
bash
chef generate repo test-repo
现在创建一个新目录 ~/test-repo/.chef
并进入该目录。
bash
mkdir ~/test-repo/.chef; cd ~/test-repo/.chef
使用以下命令将 TLS 证书从 Chef 服务器复制到工作站的当前目录。
bash
scp root@chef.example.local:~/.chef/*.pem .
完成后,检查 ~/test-repo/.chef
目录中的文件列表。
bash
ls ~/test-repo/.chef/
确保你的 TLS 证书在 Chef 工作站服务器上可用。
配置 Knife 实用程序 - 与 Chef Server 的接口
在 Chef 工作站计算机上,移动到 ~/test-repo/.chef
目录,并使用以下 nano 编辑器命令创建一个新文件 knife.rb
。
bash
cd ~/test-repo/.chef
nano knife.rb
插入以下 Ruby 脚本,并确保更改用户、组织、TLS 证书文件和 Chef Server URL 的详细信息。
ruby
current_dir = File.dirname(__FILE__)
log_level :info
log_location STDOUT
node_name 'alice'
client_key "alice.pem"
validation_client_name 'hworgz-validator'
validation_key "hworgz-validator.pem"
chef_server_url 'https://chef.example.local/organizations/hworgz'
cache_type 'BasicFile'
cache_options( :path => "#{ENV['HOME']}/.chef/checksums" )
cookbook_path ["#{current_dir}/../cookbooks"]
完成后保存并关闭文件。
现在移动到 ~/test-repo
目录,并使用以下 knife 命令从 Chef Server 检索证书。
bash
cd ~/test-repo
knife ssl fetch
完成后,你应该会获得以下输出。
从现在开始,你可以使用 knife 与 Chef Server 通信并引导客户端计算机。
bash
knife client list
从 Chef 工作站引导客户端/节点
在以下部分中,你将学习如何使用 Knife 通过 SSH 从 Chef 工作站自动引导节点 192.168.5.21。
首先,移动到 ~/test-repo/.chef
目录。
bash
cd ~/test-repo/.chef
运行以下 knife 命令以引导客户端 192.168.5.21 。 请务必使用你的信息更改用户 root 和密码 password。
在本例中,你将添加节点 192.168.5.21 并将其命名为 client。
bash
knife bootstrap 192.168.5.21 -U root -P password --node-name client
输入 Y 继续并继续该过程。
完成后,你应该会收到确认信息"Infra Phase complete"。
现在使用以下命令验证 Chef 环境中可用节点的列表。如果一切顺利,你应该会看到客户端节点可用。
bash
knife node list
然后,使用以下 knife 命令验证客户端节点的详细信息。
bash
knife node show client
在以下输出中,你可以看到 FQDN 为 client.example.local 的客户端节点 Debian 12 计算机。
最后,你现在可以通过以下 knife 命令在客户端节点上运行任意命令。
bash
knife ssh "client" "whoami;top" -u alice
在提示时输入 Chef 用户 alice 的密码。如果命令成功,你应该会得到以下结果。